最近在用layui做一个社区站点,有个页面想做成瀑布流形式,但是layui本身的流加载并没有实现这个功能,所以在研究了几个臃肿的插件源码后,自己做了一个可以结合layui流加载使用的轻量级瀑布流插件,用起来也比较简单。

图丢了,演示效果无。

使用说明:

友情提示:如果不熟悉layui的用法,请百度过去仔细阅读一下文档。

  • 在页面中用layui的定义的模式扩展引入common.js
  • ajax加载数据信息,获得数据总分页数
  • laytpl渲染数据
  • 流加载判断是否还有下一页数据
  • waterfall整理页面元素的定位

javascript 内容:

common.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
layui.define(['jquery', 'element', 'util', 'laytpl'], function (exports) {

var $ = layui.jquery
, element = layui.element
, layer = layui.layer
, util = layui.util
, laytpl = layui.laytpl;

var gather = {
waterfall: function () {
var box = $(".layui-col-md3");
var boxWidth = box.eq(0).width();
var num = Math.floor($("#zone-list").width() / boxWidth);
var boxArr = [];
box.each(function (index, value) {
var boxHeight = box.eq(index).height();
if (index < num) {
boxArr[index] = boxHeight;
} else {
var minboxHeight = Math.min.apply(null, boxArr), minboxIndex = $.inArray(minboxHeight, boxArr);
$(value).css({
"position": "absolute",
"top": minboxHeight + 15,
"left": box.eq(minboxIndex).position().left
});

boxArr[minboxIndex] += box.eq(index).height() + 15;
if (boxHeight + minboxHeight > $("#zone-list").height()) {
$("#zone-list").height(150 + boxArr[minboxIndex]);
}
}
});

},
json: function (url, data, func, options) {
var that = this, type = typeof data === 'function';
if (type) {
options = func
func = data;
data = {};
}
options = options || {};
return $.ajax({
type: options.type || 'post',
dataType: options.dataType || 'json',
data: data,
url: url,
success: function (res) {
func && func(res);
}, error: function (e) {
layer.msg('请求异常,请重试', {shift: 6});
options.error && options.error(e);
}
});
},

};
exports('common', gather);
});

调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var action = '/zone';
common.json(action, '', function (res) {
flow.load({
elem: '#zone-list'
, isAuto: true
, isLazyimg: true
, mb: 100
, done: function (page, next) {
var lis = [];
common.json(action, {page: page}, function (res) {
var getTpl = zonesTpl.innerHTML, view = document.getElementById('zone-list');

layui.each(res.data.data, function (index, item) {
laytpl(getTpl).render(item, function (html) {
lis.push(html);
});
});

if (page < res.data.last_page) {
next(lis.join(''), true);
} else {
next(lis.join(''), false);
}
common.waterfall();
});
}
});
});

html内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script id="zonesTpl" type="text/html">
<div class="layui-col-md3">
<div class="zone-box">
<div class="dt_text">
<span class="zone-word">@{{ d.content }}</span>
</div>
@{{# var img = layui.jquery.grep(d.imgs.split(','), function(n) {return layui.jquery.trim(n).length > 0;}) }}
<div class="img_box base-img-w img-w-@{{ img.length }}" >
<a class="img_w " href="javascript:;">
@{{# for(var k=0;k< img.length;k++){ }}
<img src="@{{ img[k] }}" >
@{{# } }}
</a>
</div>
</div>
</div>
</script>

好了,就是这么简单。