用JavaScript和jQuery实现瀑布流

大致介绍

在网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记

用JavaScript实现

基本结构:

rush:xhtml;">
Box">
Box">
... ... ...

rush:css;"> *{ margin: 0px; padding: 0px; } #main{ position: relative; } .Box{ padding: 15px 0 0 15px; float: left; } .pic{ padding: 10px; border: 1px solid #ccc; border-radius: 5px; Box-shadow: 0 0 5px #ccc; }

思路:

1、获取#main下的所有.Box

2、计算页面图片有几列,并设置页面的宽度

3、找出这几列中高度最小的列

4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面

5、更新列的高度,重复3、4、5步骤,直至图片加载完

6、根据最后一张图片的位置确定是否继续加载图片(懒加载)

实现:

1、获取#main下的所有.Box

rush:js;"> //将main下的所有class为Box的元素取出来 var oParent = document.getElementById(parent); var oBox = getByClass(oParent,Box);
rush:js;"> // 根据class获取元素 function getByClass(parent,clsname){ var arr = [];//用来存储获取到的所有class为Box的元素 var oElement = parent.getElementsByTagName('*'); for(var i=0;i

2、计算页面图片有几列,并设置页面的宽度

rush:js;"> //计算整个页面显示的列数(页面宽/Box的宽) var oBoxW = oBox[0].offsetWidth; var cols = Math.floor(document.documentElement.clientWidth/oBoxW); //设置main的宽 oParent.style.csstext = 'width:' + oBoxW*cols + 'px;margin:0 auto;';

3、找出这几列中高度最小的列

4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面

5、更新列的高度,重复3、4、5步骤,直至图片加载完

rush:js;"> //存储每列的高度 var hArr = []; for(var i=0;iBox.length;i++){ if(i图片的高度 hArr.push(oBox[i].offsetHeight); }else{ var minH = Math.min.apply(null,hArr); var index = getMinIndex(hArr,minH); oBox[i].style.position = "absolute"; oBox[i].style.top = minH + 'px'; //oBox[i].style.left = oBoxW*index+'px'; oBox[i].style.left = oBox[index].offsetLeft + 'px'; //更新每列的高度 hArr[index] += oBox[i].offsetHeight; } }
rush:js;"> //获取每列高度最小的索引值 function getMinIndex(arr,value){ for(var i in arr){ if(arr[i] == value){ return i; } } }

6、根据最后一张图片的位置确定是否继续加载图片(懒加载)

假设是后台给的数据

rush:js;"> //数据 var dataInt = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};  

当滚动条滚动时执行

rush:js;"> //滚动条滚动时 window.onscroll = function(){ scrollSlide(dataInt); }  

根据最后一张图片的位置,来判断是否进行加载

rush:js;"> //判断是否具有了滚条加载数据块的条件 function checkScrollSlide(parent,clsname){ var oParent = document.getElementById(parent); var oBox = getByClass(oParent,clsname); var lastBoxH = oBox[oBox.length-1].offsetTop + Math.floor(oBox[oBox.length-1].offsetHeight/2); var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var height = document.documentElement.clientHeight || document.body.clientHeight; return (lastBoxH < scrollTop + height)? true:false; }

加载图片

rush:js;"> //滚动条滚动时执行 function scrollSlide(dataInt){ ////判断是否具有了滚条加载数据块的条件 if(checkScrollSlide('main','Box')){ var oParent = document.getElementById('main'); //将数据块渲染到当前页面的尾部 for(var i=0;iBoxs = document.createElement('div'); oBoxs.className = 'Box'; oParent.appendChild(oBoxs); var oPic = document.createElement('div'); oPic.className = 'pic'; oBoxs.appendChild(oPic); var oImg = document.createElement('img'); oImg.src = 'images/' + dataInt.data[i].src; oPic.appendChild(oImg); } waterfall('main','Box'); }

用jQurey实现

用jQuery实现的思路都是一样的,就直接放代码

div'); var oBoxW = $oBox.eq(0).outerWidth(); var cols = Math.floor($(window).width()/oBoxW); $('#main').css({ 'width' : cols * oBoxW,'margin' : '0 auto' }); var hArr = []; $oBox.each(function(index,value){ var oBoxH = $oBox.eq(index).height(); if(indexdiv').last(); var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height()/2); var scrollTop = $(window).scrollTop(); var clientH = $(window).height(); return (lastBoxH < scrollTop + clientH) ? true : false; } function scrollSlide(dataInt){ if(checkScrollSlide()){ $.each(dataInt.data,function(index,value){ var $Box = $('
').addClass('Box').appendTo('#main'); var $Pic = $('
').addClass('pic').appendTo($Box); $('').attr('src','images/' + $(value).attr('src')).appendTo($Pic); }) waterfall(); } }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程之家!

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: &lt;span id=&quot...
jQuery 添加水印 &lt;script src=&quot;../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...