使用$(window).on("resize", waterfall); 使得瀑布流列数可以动态变化。
包含加载数据的模拟。
useJQ.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>瀑布流布局</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="js/jquery.min.js"></script>
<script src="js/scriptJQ.js"></script>
</head>
<body>
<div id="main">
<div class="box">
<div class="pic"><img src="images/1.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/2.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/3.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/4.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/5.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/6.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/7.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/8.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/9.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/10.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/11.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/12.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/13.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/14.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/15.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/16.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/17.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/18.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/19.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/20.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/21.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/22.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/23.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/24.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/25.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/26.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/27.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/28.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/29.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/30.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/31.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/32.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/33.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/34.jpg" alt=".jpg"></div>
</div>
<div class="box">
<div class="pic"><img src="images/35.jpg" alt=".jpg"></div>
</div>
</div>
</body>
</html>
style.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;
}
/**
* Created by DreamBoy on 2016/2/4.
*/
$(window).on("load", function() {
waterfall();
var dataInt = {"data" : [
{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"}
]};
$(window).on("scroll", function() {
if(checkScrollSlide()) {
$.each(dataInt.data, function(key, value) {
$box = $("<div>").addClass("box").appendTo($("#main"));
$pic = $("<div>").addClass("pic").appendTo($box);
$("<img>").attr("src", "images/" + value.src).appendTo($pic);
});
waterfall();
}
});
$(window).on("resize", waterfall);
});
function waterfall() {
var $boxs = $("#main>div");
//求出每个盒子的宽度(包括内边距)
var w = $boxs.eq(0).outerWidth();
//求出当前窗口所能承载的瀑布流列数
var cols = Math.floor($(window).width() / w);
//设置容器的宽度
$("#main").width(w*cols).css("margin", "0px auto");
var hArr = []; //保存每一列的高度
$boxs.each(function(index, value) {
var h = $boxs.eq(index).outerHeight();
if(index < cols) {
$(value).removeAttr("style"); //移除style样式,配合 resize 事件(窗口变化时触发)
hArr[index] = h;
} else {
//最小高度的列
var minH = Math.min.apply(null, hArr);
//最小高度的列在数组中的索引
var minHIndex = $.inArray(minH, hArr);
$(value).css({
"position":"absolute",
"top":minH,
"left":minHIndex*w
});
hArr[minHIndex] += $(value).outerHeight();
}
});
}
function checkScrollSlide() {
var $lastBox = $("#main>div").last();
var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height() / 2);
var scrollTop = $(window).scrollTop();
var dh = $(window).height();
return lastBoxH < scrollTop + dh;
}
在Chrome运行结果如下:
修改窗口宽度:
列数发生了动态变化;滚动条滚到底部,数据动态的加载,模拟网络加载图片: