瀑布流布局,其实是一种绝对定位(absolute)布局.
原理分析:
1.html,css结构 : 子绝父相
<body>
<div class="items">
<div class="item"><img src="#"></div>
<div class="item"><img src="#"></div>
<div class="item"><img src="#"></div>
...
</div>
</body>
2.给每一个子元素进行top,left设置定位
/*需求1:设置原始数据
一排元素个数n : items的宽度/item的宽度 向下取整
间隙margin: (items的宽度-n*item的宽度)/(n+1)
一排元素的总高度集合topArr: 长度为n 元素为对应item的高度 初始值都为margin
需求2:设置第一排dom元素位置
需求2.1:修改topArr里面元素的值
*/
var
itemWidth = $('.item').width();
var n =Math.floor($('.items').width()
/itemWidth);
var margin = ($('.items').width() -n *itemWidth)
/ (n +1);
var topArr = [];
for (vari =0;
i < n;
i++) {
topArr[i] =margin;
$('.item').eq(i).css({
top: topArr[i],
left: (margin +itemWidth) *i +margin
});
topArr[i] +=$('.item').eq(i).height();
}
/*需求3:判断topArr中最小值及index,依次将后面的item元素放在其后面
需求3.1:每次放置后,修改topArr里面元素的值*/
for (vari =n;
i < $('.item').length;i++) {
var minH =Infinity;
var minIndex = -1;
for (varj =0;
j < n;
j++) {
if (topArr[j] <minH) {
minH = topArr[j];
minIndex = j;
}
}
$('.item').eq(i).css({
top: minH,
left: (margin +itemWidth) *minIndex +margin
});
topArr[minIndex] +=$('.item').eq(i).height();
}
/*需求4:设置父容器高度*/
var maxH = -Infinity;
for(vari=0;i<n;i++){
if(topArr[i]>maxH){
maxH = topArr[i];
}
}
$('.items').height(maxH);
$.fn.extend({
waterfall: function () {
/*this指向调用该函数的jQuery对象*/
var itemWidth =this.children().width();
var n =Math.floor(this.width() /itemWidth);
var margin = (this.width() -n *itemWidth)
/ (n +1);
var topArr = [];
for (vari =0;
i < n;
i++) {
topArr[i] =margin;
this.children().eq(i).css({
top: topArr[i],
left: (margin +itemWidth) *i +margin
});
topArr[i] +=this.children().eq(i).height();
}
for (vari =n;
i < this.children().length;i++) {
var minH =Infinity;
var minIndex = -1;
for (varj =0;
j < n;
j++) {
if (topArr[j] <minH) {
minH = topArr[j];
minIndex = j;
}
}
this.children().eq(i).css({
top: minH,
left: (margin +itemWidth) *minIndex +margin
});
topArr[minIndex] +=this.children().eq(i).height();
}
var maxH = -Infinity;
for(vari=0;i<n;i++){
if(topArr[i]>maxH){
maxH = topArr[i];
}
}
this.height(maxH);
/*返回this,也是jQuery链式编程的逻辑*/return this;
}
})
$('.items').waterfall();
$(window).resize(function () {
$('.items').waterfall();
});