1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>瀑布流布局</title>
6 <link rel="stylesheet" href="css/index.css">
7 </head>
8 <body>
9 <div id="main">
10
11 <div class="box">
12 <div class="pic">
13 <img src="images/img01.jpg" alt="">
14 </div>
15 </div>
16
17 <div class="box"><div class="pic"><img src="images/img02.jpg" alt=""></div></div>
18 <div class="box"><div class="pic"><img src="images/img03.jpg" alt=""></div></div>
19 <div class="box"><div class="pic"><img src="images/img04.jpg" alt=""></div></div>
20 <div class="box"><div class="pic"><img src="images/img05.jpg" alt=""></div></div>
21 <div class="box"><div class="pic"><img src="images/img06.jpg" alt=""></div></div>
22 <div class="box"><div class="pic"><img src="images/img07.jpg" alt=""></div></div>
23 <div class="box"><div class="pic"><img src="images/img08.jpg" alt=""></div></div>
24 <div class="box"><div class="pic"><img src="images/img09.jpg" alt=""></div></div>
25 <div class="box"><div class="pic"><img src="images/img10.jpg" alt=""></div></div>
26 <div class="box"><div class="pic"><img src="images/img11.jpg" alt=""></div></div>
27 <div class="box"><div class="pic"><img src="images/img12.jpg" alt=""></div></div>
28 <div class="box"><div class="pic"><img src="images/img13.jpg" alt=""></div></div>
29 <div class="box"><div class="pic"><img src="images/img14.jpg" alt=""></div></div>
30 <div class="box"><div class="pic"><img src="images/img15.jpg" alt=""></div></div>
31 <div class="box"><div class="pic"><img src="images/img16.jpg" alt=""></div></div>
32 <div class="box"><div class="pic"><img src="images/img17.jpg" alt=""></div></div>
33 <div class="box"><div class="pic"><img src="images/img18.jpg" alt=""></div></div>
34 <div class="box"><div class="pic"><img src="images/img19.jpg" alt=""></div></div>
35 <div class="box"><div class="pic"><img src="images/img20.jpg" alt=""></div></div>
36 <div class="box"><div class="pic"><img src="images/img21.jpg" alt=""></div></div>
37 <div class="box"><div class="pic"><img src="images/img22.jpg" alt=""></div></div>
38 <div class="box"><div class="pic"><img src="images/img23.jpg" alt=""></div></div>
39 <div class="box"><div class="pic"><img src="images/img24.jpg" alt=""></div></div>
40 <div class="box"><div class="pic"><img src="images/img25.jpg" alt=""></div></div>
41 <div class="box"><div class="pic"><img src="images/img26.jpg" alt=""></div></div>
42 <div class="box"><div class="pic"><img src="images/img27.jpg" alt=""></div></div>
43 <div class="box"><div class="pic"><img src="images/img28.jpg" alt=""></div></div>
44 <div class="box"><div class="pic"><img src="images/img29.jpg" alt=""></div></div>
45 <div class="box"><div class="pic"><img src="images/img30.jpg" alt=""></div></div>
46 <div class="box"><div class="pic"><img src="images/img31.jpg" alt=""></div></div>
47 <div class="box"><div class="pic"><img src="images/img32.jpg" alt=""></div></div>
48 <div class="box"><div class="pic"><img src="images/img33.jpg" alt=""></div></div>
49 <div class="box"><div class="pic"><img src="images/img34.jpg" alt=""></div></div>
50 <div class="box"><div class="pic"><img src="images/img35.jpg" alt=""></div></div>
51 <div class="box"><div class="pic"><img src="images/img36.jpg" alt=""></div></div>
52 <div class="box"><div class="pic"><img src="images/img37.jpg" alt=""></div></div>
53 <div class="box"><div class="pic"><img src="images/img38.jpg" alt=""></div></div>
54 <div class="box"><div class="pic"><img src="images/img39.jpg" alt=""></div></div>
55 <div class="box"><div class="pic"><img src="images/img40.jpg" alt=""></div></div>
56 </div>
57
58 <script src="js/UnderScore.js"></script>
59 <script src="js/MyTool.js"></script>
60 <script src="js/index.js"></script>
61 </body>
62 </html>
1 (function (w) {
2 w.myTool = {
3 $: function (id) {
4 return typeof id === 'string' ? document.getElementById(id) : null;
5 },
6 hasClassName: function (obj, cs) {
7 var reg = new RegExp('\\b' + cs + '\\b');
8 return reg.test(obj.className);
9 },
10 addClassName: function (obj, cs) {
11 if(!this.hasClassName(obj,cs)){
12 obj.className += ' ' + cs;
13 }
14 },
15 removeClassName: function (obj, cs) {
16 var reg = new RegExp('\\b' + cs + '\\b');
17 // 删除class
18 obj.className = obj.className.replace(reg, '');
19 },
20 toggleClassName: function (obj, cs) {
21 if(this.hasClassName(obj,cs)){
22 // 有, 删除
23 this.removeClassName(obj,cs);
24 }else {
25 // 没有,则添加
26 this.addClassName(obj,cs);
27 }
28 },
29 scroll: function() {
30 if(window.pageYOffset !== null){ // 最新的浏览器
31 return {
32 "top": window.pageYOffset,
33 "left": window.pageXOffset
34 }
35 }else if(document.compatMode === 'CSS1Compat'){ // W3C
36 return {
37 "top": document.documentElement.scrollTop,
38 "left": document.documentElement.scrollLeft
39 }
40 }
41 return {
42 "top": document.body.scrollTop,
43 "left": document.body.scrollLeft
44 }
45 }
46 };
47 })(window);
1 window.addEventListener('load', function (ev) {
2 // 1. 实现瀑布流布局
3 waterFull('main', 'box');
4
5 // 2. 加载数据
6 var timer1 = null;
7 window.addEventListener('scroll', function (ev1) {
8 clearTimeout(timer1);
9 timer1 = setTimeout(function () {
10 if(checkWillLoadNewBox()){ // 真
11 // console.log('加载……')
12 // 2.1 假数据
13 var dataArr = [
14 {"src": "img02.jpg"},
15 {"src": "img04.jpg"},
16 {"src": "img06.jpg"},
17 {"src": "img01.jpg"},
18 {"src": "img03.jpg"},
19 {"src": "img20.jpg"},
20 {"src": "img14.jpg"}
21 ];
22
23 // 2.2 遍历数据
24 for (var i = 0; i < dataArr.length; i++) {
25 var newBox = document.createElement('div');
26 newBox.className = 'box';
27 myTool.$('main').appendChild(newBox);
28
29 var newPic = document.createElement('div');
30 newPic.className = 'pic';
31 newBox.appendChild(newPic);
32
33 var newImg = document.createElement('Img');
34 newImg.src = 'images/' + dataArr[i].src;
35 newPic.appendChild(newImg);
36 }
37
38 // 2.3 重新进行瀑布流布局
39 waterFull('main', 'box');
40 }
41 }, 1000);
42 });
43
44 // 3. 页面尺寸发生改变重新布局
45 var timer = null;
46 window.addEventListener('resize', function (ev1) {
47 clearTimeout(timer);
48 // 节流
49 timer = setTimeout(function () {
50 waterFull('main', 'box');
51 }, 200);
52 });
53 });
54
55 /**
56 * 实现瀑布流布局
57 * @param {String}parent
58 * @param {String}child
59 */
60 function waterFull(parent, child) {
61 // 1. 父盒子居中
62 // 1.1 获取标签
63 var allBox = myTool.$(parent).getElementsByClassName(child);
64 // console.log(allBox);
65 // 1.2 获取其中一个子盒子的宽度
66 var boxWidth = allBox[0].offsetWidth;
67 // 1.3 获取文档的宽度
68 var screenW = document.documentElement.clientWidth || document.body.clientWidth;
69 // 1.4 求出列数
70 var cols = parseInt(screenW / boxWidth);
71 // 1.5 父盒子居中
72 myTool.$(parent).style.width = cols * boxWidth + 'px';
73 myTool.$(parent).style.margin = '0 auto';
74
75 // 2. 子盒子定位
76 // 2.1 定义变量
77 var heightArr = [], boxHeight = 0, minBoxHeight = 0, minBoxIndex = 0;
78 // 2.2 遍历所有的盒子
79 for (var i = 0; i < allBox.length; i++) {
80 boxHeight = allBox[i].offsetHeight;
81 // 2.3 判断
82 if(i < cols){ // 第一行
83 heightArr.push(boxHeight);
84 allBox[i].style = '';
85 }else { // 剩余行
86 // 2.4 取出数组中最矮盒子的高度 underscro.js的方法
87 minBoxHeight = _.min(heightArr);
88 // 2.5 取出最矮盒子在数组中的索引
89 minBoxIndex = getMinBoxIndex(heightArr, minBoxHeight);
90 // 2.6 剩余子盒子的定位
91 allBox[i].style.position = 'absolute';
92 allBox[i].style.left = minBoxIndex * boxWidth + 'px';
93 allBox[i].style.top = minBoxHeight + 'px';
94 // 2.7 更新高度
95 heightArr[minBoxIndex] += boxHeight;
96 }
97 }
98
99 // console.log(heightArr, minBoxHeight, minBoxIndex);
100
101 }
102
103 function getMinBoxIndex(arr, val){
104 for (var i = 0; i < arr.length; i++) {
105 if(arr[i] === val){
106 return i;
107 }
108 }
109 }
110
111 function checkWillLoadNewBox() {
112 // 1. 获取最后的盒子
113 var allBox = myTool.$('main').getElementsByClassName('box');
114 var lastBox = allBox[allBox.length - 1];
115
116 // 2. 求最后盒子高度的一半
117 var lastBoxDis = lastBox.offsetHeight * 0.5 + lastBox.offsetTop;
118 // console.log(lastBoxDis);
119
120 // 3. 求出页面的高度
121 var screenH = document.documentElement.clientHeight || document.body.clientHeight;
122
123 // 4. 求出页面滚出浏览器的高度
124 var scrollTopH = myTool.scroll().top;
125
126 // 5. 返回结果
127 return lastBoxDis <= screenH + scrollTopH;
128 }