您现在的位置是:网站首页 > 心得笔记
jquery实现瀑布流布局
简介瀑布流主要采用的是定位,通过计算位置把这些数据块排列在盒子里的!所以,把所有数据块全放在一个大盒子main里,再把每一个数据块塞到一个小盒子box里,因为每个数据块要设置间隔、圆角、阴影等样式,所以在box盒子里再塞入一个小盒子pic,在小盒子pic里放置图片。
html代码:
<html> <head> <title>瀑布流布局</title> <meta charset="utf-8" /> </head> <body> <!--所有数据块的大盒子--> <div id="main"> <!--每个数据块的小盒子--> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/1.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/2.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/3.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/4.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/5.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/6.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/7.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/8.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/9.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/10.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/11.png" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/12.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/13.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/14.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/15.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/16.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/17.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/18.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/19.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/20.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/21.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/22.jpg" /> </div> </div> <div class="box"> <!--设置每个数据块的样式盒子--> <div class="pic"> <img src="/pbl/img/23.jpg" /> </div> </div> </div> </body> </html>
css代码:
*{margin:0;padding:0}
#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;}
.pic img{width:165px;height:auto;}js代码:
<script src="/admin/js/jquery.min.js?v=2.1.4"></script>
<script>
//页面加载时我们需要执行function脚本
$(window).on('load',function(){
waterfall();
var dataInt = {"data":[{'src':'/pbl/img/1.jpg'},{'src':'/pbl/img/2.jpg'},{'src':'/pbl/img/3.jpg'},{'src':'/pbl/img/4.jpg'},{'src':'/pbl/img/5.jpg'},{'src':'/pbl/img/6.jpg'},{'src':'/pbl/img/7.jpg'},{'src':'/pbl/img/8.jpg'},{'src':'/pbl/img/9.jpg'},{'src':'/pbl/img/10.jpg'},{'src':'/pbl/img/11.png'},{'src':'/pbl/img/12.jpg'},{'src':'/pbl/img/13.jpg'},{'src':'/pbl/img/14.jpg'},{'src':'/pbl/img/15.jpg'},{'src':'/pbl/img/16.jpg'},{'src':'/pbl/img/17.jpg'},{'src':'/pbl/img/18.jpg'},{'src':'/pbl/img/19.jpg'},{'src':'/pbl/img/20.jpg'}]};
$(window).on('scroll',function(){
//检测是否具备加载图片的条件
if (checkScrollSlide()) {
//获取后台数据,渲染到页面上
$.each(dataInt.data,function(index,value){
var oBox = '<div class="box">' +
'<div class="pic">' +
'<img src="'+value.src+'"/>' +
'</div>' +
'</div>';
$("#main").append(oBox);
});
waterfall();//第二次加载是为了把新加载的图片按瀑布流方式重新布局
}
});
});
//完成瀑布流布局
function waterfall(){
//1、将main下面的所有class为box的元素取出来
var oBoxs = $("#main .box");
//2、计算整个页面显示的列数 = 页面宽度/每个box盒子的宽度
var oBoxW = oBoxs.eq(0).outerWidth();//width()只获取你定义的那个宽度 outerWidth() 获取的宽度包括padding border等填充在内的
var cols = Math.floor($(window).width()/oBoxW);//窗口不存在边框和填充,所以使用width() Math.floor()取整
//3、设置main的宽度=每一列的宽*列数和对齐方式(缩放窗口,发现列数还是变化,因为大盒子main没有设置宽度,所以main在随着整个浏览器的变化而变化。所以,设置main的宽度)
$("#main").width(oBoxW*cols).css('margin','0 auto');//设置main宽度
//4、获取第一行高度最小高度值(第一行图片不需要做定位,但第二行的第一张需要排列在第一行最矮图片的下面,紧接着依次排列)
var hArr = [];//存放每一列高度的数组
$(".box").each(function(index, value){//遍历的索引, 遍历的值
var h = $(this).outerHeight();
if (index < cols) {//说明是第一行
hArr.push(h);
} else {
//获取最小高度值和最小高度值所在数组中的索引
var minH = Math.min.apply(null,hArr);
var minHIndex = $.inArray(minH,hArr);
//设置第一行之后的所有图片位置(从第二行开始,所有图片都要加绝对定位,循环过程中,数组中最小值始终是同一个,所以,之后的所有图片都固定在同一个位置重叠了.所以说数组要修改的!每塞进一个数,数组中最小值的高将在原来基础上+塞进的这个高)
$(this).css({'position':'absolute','top':minH+'px','left':minHIndex*oBoxW+'px'});
//改变数组的值
hArr[minHIndex]+=$(this).outerHeight();
}
});
}
//检测是否具备滚动加载图片的条件(以最后一个数据块距离判断.最后一个盒子进来一半时加载图片)
function checkScrollSlide(){
var lastBox = $("#main>div").last();//去最后一个元素
//最后一个盒子和整个页面顶部的距离+最后一个盒子高度的一半
var lastBoxH = lastBox.offset().top+Math.floor(lastBox.outerHeight()/2);
//页面滚走的距离+页面的高度
var scrollTop = $(window).scrollTop();
var height = $(window).height();
return (lastBoxH<scrollTop+height)?true:false;
}
</script>