基于jquery的插件fn相当于prototype,下面最先封装。
$.fn.waterFall=function (option) { //option 用户传过来的{gap:15}
var defaults = {gap:20} //默认值
defaults = $.extend(defaults,option); //假如用户传参数,以用户为准兼并
var _this = $(this); //_this就是最父级,装载图片和笔墨的盒子
var allItem = _this.children('.item'); //猎取父级下每个的 元素
var itemWidth = allItem.width(); //猎取每个item的宽度
var count = Math.floor(_this.width()/(itemWidth+defaults.gap)); //向下取整,算出每一行最多可放的列数
var arr = []; //建立一个空数组,轻易存储每一列的高度
allItem.each(function (index,ele) { //遍历每个item
if(index<count){ //假如不够占满一列
$(ele).css({ //遍历一切的元素 给每一图片设置坐标值
top:0,
left:(itemWidth+defaults.gap)*index+'px' //一切元素的left坐标 left= (item的宽度+defaults.gap)* index (列数-1)
})
arr[index] = $(ele).height()
}else { //假如有多行
// 第二行以下 增加的规律:找出高度最小的列,往这个背面追加图片
var minHeight = arr[0]; //最小值
var minkey = 0; //纪录最小的高度地点的列数
var i =0,l=arr.length;
for(;i<l;i++){
if(minHeight>arr[i]){
minHeight=arr[i];
minkey = i
}
}
var height = $(ele).height()
$(ele).css({
'top':minHeight+defaults.gap+'px',
'left':minkey*(itemWidth+defaults.gap)+'px' //从第二行最先最小的高度
})
//动态更新最小列的高度
arr[minkey]+=height+defaults.gap
}
})
//算出一切列的高度,给外层父元素加上。
var maxHeight = arr[0];
for(var i =0;i<arr.length;i++){
if(maxHeight<arr[i]){
maxHeight=arr[i]
}
}
_this.height(maxHeight)
}
下面挪用演示:
dom模板:
<div class="wrapper">
<div class="items">
<!-- 此处请多个item -->
<div class="item">
<img src="./images/1.jpg" alt="">
<p>花非花,雾非雾,半夜来,天明去,来如春梦不多时。</p>
</div>
</div>
</div>
js部份:
$('.items').waterFall({gap:15});