前言
项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写。最近闲来没事,就自己写个。大致思路理清楚,还是挺好实现的...
原生javascript版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流-javascript</title> <style> *{margin:0;padding:0;} #content{position: relative;margin:0 auto;} .box{padding:10px;float: left;}/*首行浮动,第二行开始绝对定位*/ .box img{width: 180px;height:auto;display: block;} </style> <script> window.onload=function(){ waterfall('content','box'); //改变窗口大小时,重新排列 window.onresize = function(){ waterfall('content','box'); } //如果数据不够,没出现滚动条,自动加载数据 var time=setInterval(function(){ if(checkscrollside()){ addDate();//插入数据 waterfall('content','box');//加载完数据从新排列 }else{ clearInterval(time); window.onscroll=function(){ if(checkscrollside()){ addDate(); waterfall('content','box'); }; } } },1000) } // 数据插入 function addDate(){ var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模拟数据,也可以是对象 var oParent = document.getElementById('content'); for(var i=0;i<dataInt.length;i++){//循环插入数据 var oBox=document.createElement('div'); oBox.className='box'; oParent.appendChild(oBox); var oImg=document.createElement('img'); oImg.src='./img/'+dataInt[i]; oBox.appendChild(oImg); } } //主函数 function waterfall(parentID,childClass){ var oParent=document.getElementById(parentID); var arrBox=getClassObj(parentID,childClass);// getClassObj()获取子class的数组 var iBoxW=arrBox[0].offsetWidth;// 获取瀑布流块的宽度 var num=Math.floor(document.documentElement.clientWidth/iBoxW);//计算窗口能容纳几列 oParent.style.width=iBoxW*num+'px';//设置父级宽度 var arrBoxH=[];//数组,用于存储每列中的所有块框相加的高度 for(var i=0;i<arrBox.length;i++){//遍历数组瀑布流 块 var boxH=arrBox[i].offsetHeight;//获取当前块的高度 if(i<num){ arrBox[i].style.cssText="";//防止用户改变窗口大小,到时样式出错 arrBoxH[i]=boxH; //第一行中的num个块box 先添加进数组arrBoxH }else{ var minH=Math.min.apply(null,arrBoxH);//获取数组arrBoxH中的最小值minH var minHIndex=getminHIndex(arrBoxH,minH);//遍历数组获取最小值minH的索引 arrBox[i].style.position='absolute';//设置绝对位移 arrBox[i].style.top=minH+'px'; arrBox[i].style.left=minHIndex*iBoxW+'px';//也可以直接获取arrBox[minHIndex].offsetLeft arrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高 } } } //获取子class的数组 function getClassObj(parentID,childClass){ var oParent=document.getElementById(parentID); var allChildObj=oParent.getElementsByTagName('*');//获取父级下的所有子集 var childObj=[];//创建一个数组 用于收集子元素 for (var i=0;i<allChildObj.length;i++) {//遍历子元素、判断类别、压入数组 if (allChildObj[i].className==childClass){ childObj.push(allChildObj[i]); } }; return childObj; } //获取数组最小值的索引 function getminHIndex(arr,minH){ for(var i in arr){ if(arr[i]==minH){ return i; } } } // 判断滚动条是否到底部 function checkscrollside(){ var arrBox=getClassObj("content",'box'); //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载) var lastBoxH=arrBox[arrBox.length-1].offsetTop; var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//获取滚动条卷走的高度 var documentH=document.documentElement.clientHeight;//显示页面文档的高 return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数 } </script> </head> <body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div> </body> </html>
jquery版本
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流-jquery</title> <style> *{margin:0;padding:0;} #content{position: relative;margin:0 auto;} .box{padding:10px;float: left;} .box img{width: 180px;height:auto;display: block;} </style> <script src="js/jquery-1.11.1.min.js"></script> <script> $(function(){ waterfall(); //改变窗口大小时,重新排列 $(window).resize(function(){ waterfall(); }) //如果数据不够,没出现滚动条,自动加载数据 var time=setInterval(function(){ if(checkscrollside()){ addDate();//插入数据 waterfall();//加载完数据从新排列 }else{ clearInterval(time); $(window).scroll(function(){ if(checkscrollside()){ addDate(); waterfall(); }; }) } },1000) }) // 数据插入 function addDate(){ var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模拟数据,也可以是对象 var oParent = $('#content'); for(var i=0;i<dataInt.length;i++){//循环插入数据 oParent.append('<div class="box"><img src="./img/'+dataInt[i]+'" alt=""></div>"); } } //主函数 function waterfall(){ var arrBox=$('#content').children('.box');// box对象 var iBoxW=arrBox.eq(0).innerWidth();// 获取瀑布流块的宽度,注意width(),跟innerWidth()的区别 var num=Math.floor($(window).width()/iBoxW);//计算窗口能容纳几列 $('#content').css('width',iBoxW*num);//设置父级宽度 var arrBoxH=[];//数组,用于存储每列中的所有块框相加的高度 for(var i=0;i<arrBox.length;i++){//遍历数组瀑布流 块 var boxH=arrBox.eq(i).innerHeight();//获取当前块的高度 if(i<num){ arrBox.eq(i).attr('style','');//防止用户改变窗口大小,到时样式出错 arrBoxH[i]=boxH; //第一行中的num个块box 先添加进数组arrBoxH }else{ var minH=Math.min.apply(null,arrBoxH);//获取数组arrBoxH中的最小值minH var minHIndex=$.inArray(minH,arrBoxH);//使用jquery提供的工具 arrBox.eq(i).css({'position':'absolute','top':minH,'left':minHIndex*iBoxW});//设置定位 arrBoxH[minHIndex]+=arrBox.eq(i).innerHeight();//添加后,更新最小列高 } } } // 判断滚动条是否到底部 function checkscrollside(){ var arrBox=$('#content').children('.box'); //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载) var lastBoxH=arrBox.eq(arrBox.length-1).offset().top; var scrollTop=$(window).scrollTop()//获取滚动条卷走的高度 var documentH=$(window).height();;//显示页面文档的高 return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数 } </script> </head> <body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div> </body> </html>
大致思路
1.先让第一行的浮动
2.计算第一行的每个块的高度
3.遍历第一行之后的每一个块,逐个放在最小高度的下面
4.加载数据插入最后,再重新计算
注意点
a.原生js
1.定义了getClassObj()函数用于获取class类的对象,方便调用。考虑了兼容性 getElementsByClassName
2.定义了getminHIndex()函数用户获取最小值的索引
3.设置块与块之间的距离最好用padding,这样的话offsetHeight可以直接获取得到高度。如果设置margin则得多加个外边距的距离
4.代码中设置了定时器加载数据,其实可以省略,只要保证第一次加载的数据能满屏就可以。如果没出现滚动条的话onscroll事件是不会执行到的。也就没办法加载数据了
5.代码中的计算宽度也可以修改,设计的页面是定宽的瀑布流的话。这里主要是做了响应式的处理
var arrBox=getClassObj(parentID,childClass);// getClassObj()获取子class的数组 var iBoxW=arrBox[0].offsetWidth;// 获取瀑布流块的宽度 var num=Math.floor(document.documentElement.clientWidth/iBoxW);//计算窗口能容纳几列 oParent.style.width=iBoxW*num+"px';//设置父级宽度
6.每设置一块位移,都要在列高的数组上增加数值,防止块重叠
arrBox[i].style.position='absolute';//设置绝对位移 arrBox[i].style.top=minH+'px'; arrBox[i].style.left=minHIndex*iBoxW+'px';//也可以直接获取arrBox[minHIndex].offsetLeft arrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高
b.jquery
1.思路是跟js一样的,只是jquery封装了很多方法,让我们简便的就实现了
2.注意width(),跟innerWidth()的区别。前者只能获取宽度值(不包括补白padding)
css3版本
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流-css3</title> <style> *{margin:0;padding:0;} #content{margin:0 auto;position: relative;width:1200px;column-count:6;-moz-column-count:6;-webkit-column-count:6;} .box{padding:10px;width: 180px;} .box img{width: 180px;height:auto;display: block;} </style> <script> window.onload=function(){ //如果数据不够,没出现滚动条,自动加载数据 var time=setInterval(function(){ if(checkscrollside()){ addDate();//插入数据 }else{ clearInterval(time); window.onscroll=function(){ if(checkscrollside()){ addDate(); }; } } },1000) } // 数据插入 function addDate(){ var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模拟数据,也可以是对象 var oParent = document.getElementById('content'); for(var i=0;i<dataInt.length;i++){//循环插入数据 var oBox=document.createElement('div'); oBox.className='box'; oParent.appendChild(oBox); var oImg=document.createElement('img'); oImg.src='./img/'+dataInt[i]; oBox.appendChild(oImg); } } //获取子class的数组 function getClassObj(parentID,childClass){ var oParent=document.getElementById(parentID); var allChildObj=oParent.getElementsByTagName('*');//获取父级下的所有子集 var childObj=[];//创建一个数组 用于收集子元素 for (var i=0;i<allChildObj.length;i++) {//遍历子元素、判断类别、压入数组 if (allChildObj[i].className==childClass){ childObj.push(allChildObj[i]); } }; return childObj; } // 判断滚动条是否到底部 function checkscrollside(){ var arrBox=getClassObj("content",'box'); //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载) var lastBoxH=arrBox[arrBox.length-1].offsetTop; var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//获取滚动条卷走的高度 var documentH=document.documentElement.clientHeight;//显示页面文档的高 return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数 } </script> </head> <body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div> </body> </html>
注意点
1.滚动加载还是得另外加js
2.加载的数据,是竖向排列的。体验不是很友好
3.有兼容性问题,Internet Explorer 10 +
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍原生JS实现美图瀑布流布局赏析,包括了原生JS实现美图瀑布流布局赏析的使用技巧和注意事项,需要的朋友参考一下 自pinterest网站爆红以来,国内一度掀起“仿PIN”狂潮,诸如花瓣、蘑菇街等等。正是如此,“瀑布流”式布局受到广大网民的青睐。众多知名JS库,也相继出现“瀑布流”布局插件,譬如jQuery的Masonry插件、KISSY的waterfall插件等。今天闲来无聊,我也自己
本文向大家介绍原生js实现移动端瀑布流式代码示例,包括了原生js实现移动端瀑布流式代码示例的使用技巧和注意事项,需要的朋友参考一下 瀑布流布局已成为当今非常普遍的图片展示方式,无论是PC还是手机等移动设备上。最近使用到了“懒加载”,现在更新一般,因为平时主要使移动端的开发所以库文件使用的是zepto.js 。当然也可以和jQuery 通用。 代码如下: 以上所述就是本文给大家分享的全部内容了,希望
本文向大家介绍js瀑布流布局的实现,包括了js瀑布流布局的实现的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现瀑布流布局的具体代码,供大家参考,具体内容如下 原理: 1、瀑布流布局,要求进行布局的元素等宽,然后计算元素的宽与浏览器的宽度之比,得到需要布置的列数。 2、创建一个数组,长度为列数,数组元素为每一列已布置元素的总高度。(一开始为0)。 3、将未布置的元素,依次布置到
本文向大家介绍js实现仿百度瀑布流的方法,包括了js实现仿百度瀑布流的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现仿百度瀑布流的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。
本文向大家介绍jquery实现简单的瀑布流布局,包括了jquery实现简单的瀑布流布局的使用技巧和注意事项,需要的朋友参考一下 是开头都会说的原理 瀑布流布局有两种,一种是固定列,一种是非固定列。在此主要记述第一种的实现。 固定列的特征是:无论页面如何缩放,每行的总列数都一致。 一行4列的瀑布流从布局的角度来说,就是4个li标签。通过一定的事件(比如滚动条滚动多少px),然后读取之,再把数据动态地
本文向大家介绍基于jquery实现瀑布流布局,包括了基于jquery实现瀑布流布局的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了基于jquery实现瀑布流布局的关键代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 使用jquery-1.8.3.min.js,waterfall.js代码如下: 希望本文所述对大家学习有所帮助,谢谢大家的阅读。