原生JavaScript实现瀑布流布局


Posted in Javascript onJune 28, 2020

本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下

效果图:

原生JavaScript实现瀑布流布局

具体代码:

window.onload=function(){

 waterfall('main','pin');

 var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
 
 window.onscroll=function(){
  if(checkscrollside()){
   var oParent = document.getElementById('main');// 父级对象
   for(var i=0;i<dataInt.data.length;i++){
    var oPin=document.createElement('div'); //添加 元素节点
    oPin.className='pin';     //添加 类名 name属性
    oParent.appendChild(oPin);    //添加 子节点
    var oBox=document.createElement('div');
    oBox.className='box';
    oPin.appendChild(oBox);
    var oImg=document.createElement('img');
    oImg.src='./images/'+dataInt.data[i].src;
    oBox.appendChild(oImg);
   }
   waterfall('main','pin');
  };
 }
}


/*
 parend 父级id
 pin 元素class
*/
function waterfall(parent,pin){
 var oParent=document.getElementById(parent);// 父级对象
 var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin
 var iPinW=aPin[0].offsetWidth;// 一个块框pin的宽
 var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
 oParent.style.cssText='width:'+iPinW*num+'px;margin:0 auto;';//设置父级居中样式:定宽+自动水平外边距

 var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
 for(var i=0;i<aPin.length;i++){//遍历数组aPin的每个块框元素
  var pinH=aPin[i].offsetHeight;
  if(i<num){
   pinHArr[i]=pinH; //第一行中的num个块框pin 先添加进数组pinHArr
  }else{
   var minH=Math.min.apply(null,pinHArr);//数组pinHArr中的最小值minH
   var minHIndex=getminHIndex(pinHArr,minH);
   aPin[i].style.position='absolute';//设置绝对位移
   aPin[i].style.top=minH+'px';
   aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';
   //数组 最小高元素的高 + 添加上的aPin[i]块框高
   pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了块框后的列高
  }
 }
}

/*
 通过父级和子元素的class类 获取该同类子元素的数组
*/
function getClassObj(parent,className){
 var obj=parent.getElementsByTagName('*');//获取 父级的所有子集
 var pinS=[];//创建一个数组 用于收集子元素
 for (var i=0;i<obj.length;i++) {//遍历子元素、判断类别、压入数组
  if (obj[i].className==className){
   pinS.push(obj[i]);
  }
 };
 return pinS;
}

/*
 获取 pin高度 最小值的索引index
*/
function getminHIndex(arr,minH){
 for(var i in arr){
  if(arr[i]==minH){
   return i;
  }
 }
}

/*
 判断加载图片的条件
*/
function checkscrollside(){
 var oParent=document.getElementById('main');
 var aPin=getClassObj(oParent,'pin');
 var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
 var documentH=document.documentElement.clientHeight;//页面高度
 return (lastPinH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
}

以上就是本文的全部内容,希望对大家实现瀑布流布局有所帮助。

Javascript 相关文章推荐
初学Javascript的一些总结
Nov 03 Javascript
jquery控制listbox中项的移动并排序
Nov 12 Javascript
火狐下table中创建form导致两个table之间出现空白
Sep 02 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
jQuery实现三级菜单的代码
May 09 Javascript
常用的js验证和数据处理总结
Aug 02 Javascript
PHP+jquery+ajax实现分页
Dec 09 Javascript
在vscode中统一vue编码风格的方法
Feb 22 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
Mar 26 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
Jan 28 jQuery
详解vue.js移动端配置flexible.js及注意事项
Apr 10 Javascript
vue下载二进制流图片操作
Oct 26 Javascript
js实现瀑布流的三种方式比较
Jun 28 #Javascript
详解AngularJS中自定义过滤器
Dec 28 #Javascript
js运动应用实例解析
Dec 28 #Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 #Javascript
浅析JS运动
Dec 28 #Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 #Javascript
js时间戳转为日期格式的方法
Dec 28 #Javascript
You might like
php桌面中心(四) 数据显示
2007/03/11 PHP
PHP 变量的定义方法
2010/01/26 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python3实现mysql导出excel的方法
2019/07/31 Python
Python中常用的os操作汇总
2020/11/05 Python
毕业自荐信
2013/12/16 职场文书
学生思想表现的评语
2014/01/30 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
仓库管理计划书
2014/05/04 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
2014年教师节活动总结
2014/08/29 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
卖车协议书范文
2016/03/23 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技