原生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 面向对象的之私有成员和公开成员
May 04 Javascript
jquery checkbox的相关操作总结
Oct 17 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
Jan 26 Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 Javascript
微信小程序实现左右联动的实战记录
Jul 05 Javascript
JS实现根据指定值删除数组中的元素操作示例
Aug 02 Javascript
微信小程序实现即时通信聊天功能的实例代码
Aug 17 Javascript
angularjs1.5 组件内用函数向外传值的实例
Sep 30 Javascript
jquery制作的移动端购物车效果完整示例
Feb 24 jQuery
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 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的输出:缓存并压缩动态页面
2013/06/11 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
javascript实现yield的方法
2013/11/06 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
JS判断数组那点事
2017/10/10 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python pickle模块用法实例
2015/04/14 Python
Python中的变量和作用域详解
2016/07/13 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Python实现京东秒杀功能代码
2019/05/16 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
scrapy-splash简单使用详解
2021/02/21 Python
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
个人自荐信
2013/12/05 职场文书
职务说明书范文
2014/05/07 职场文书
委托书的写法
2014/08/30 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
婚宴新娘致辞
2015/07/28 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle