1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>瀑布流布局</title>
6 <style type="text/css">
7 body{margin:0; font-family:微软雅黑;}
8 #flow-box{margin:10px auto 0 auto; padding:0; position:relative}
9 #flow-box li{
10 width:190px; position:absolute; padding:10px; border:solid 1px #efefef; list-style:none;
11 opacity:0;
12 -moz-opacity:0;
13 filter:alpha(opacity=0);
14 -webkit-transition:opacity 500ms ease-in-out;
15 -moz-transition:opacity 500ms ease-in-out;
16 -o-transition:opaicty 500ms ease-in-out;
17 transition:opaicty 500ms ease-in-out;}
18 #flow-box li img{width:100%;}
19 #flow-box li a{display:block; width:100%; text-align:center; font-size:14px; color:#333; line-height:18px; margin-top:10px; text-decoration:none;}
20 .loadwrap{position:absolute; left:0; width:100%; text-align:center;}
21 </style>
22 </head>
23 <body>
24 <ul id="flow-box">
25 <li><img src="http://www.mitxiong.com/NewsImages/2012121821504156.jpg" /><a href="#">图片标题1</a></li>
26 <li><img src="http://www.mitxiong.com/NewsImages/2012112718241731.jpg" /><a href="#">图片标题2</a></li>
27 <li><img src="http://www.mitxiong.com/NewsImages/2012111806582944.jpg" /><a href="#">图片标题3</a></li>
28 <li><img src="http://www.mitxiong.com/NewsImages/2012110907231232.jpg" /><a href="#">图片标题4</a></li>
29 <li><img src="http://www.mitxiong.com/NewsImages/2012110406319529.jpg" /><a href="#">图片标题5</a></li>
30 <li><img src="http://www.mitxiong.com/NewsImages/2012101808066955.jpg" /><a href="#">图片标题6</a></li>
31 <li><img src="http://www.mitxiong.com/NewsImages/2012101307276582.jpg" /><a href="#">图片标题7</a></li>
32 <li><img src="http://www.mitxiong.com/NewsImages/2012082223432719.jpg" /><a href="#">图片标题8</a></li>
33 <li><img src="http://www.mitxiong.com/NewsImages/2012082121509065.jpg" /><a href="#">图片标题9</a></li>
34 <li><img src="http://www.mitxiong.com/NewsImages/2012081922387254.jpg" /><a href="#">图片标题10</a></li>
35 <li><img src="http://www.mitxiong.com/NewsImages/2012081700252403.jpg" /><a href="#">图片标题11</a></li>
36 <li><img src="http://www.mitxiong.com/NewsImages/2012081407597304.jpg" /><a href="#">图片标题12</a></li>
37 <li><img src="http://www.mitxiong.com/NewsImages/2012081218248259.jpg" /><a href="#">图片标题13</a></li>
38 <li><img src="http://www.mitxiong.com/NewsImages/2012080621278799.jpg" /><a href="#">图片标题14</a></li>
39 <li><img src="http://www.mitxiong.com/NewsImages/2012072907484455.jpg" /><a href="#">图片标题15</a></li>
40 <li><img src="http://www.mitxiong.com/NewsImages/2012072521564314.jpg" /><a href="#">图片标题16</a></li>
41 <li><img src="http://www.mitxiong.com/NewsImages/2012072507238259.jpg" /><a href="#">图片标题17</a></li>
42 <li><img src="http://www.mitxiong.com/NewsImages/2012072409035684.jpg" /><a href="#">图片标题18</a></li>
43 <li><img src="http://www.mitxiong.com/NewsImages/2012072219405236.jpg" /><a href="#">图片标题19</a></li>
44 <li><img src="http://www.mitxiong.com/NewsImages/2012071218416980.jpg" /><a href="#">图片标题20</a></li>
45 </ul>
46 <div id="loadimg" class="loadwrap"><img src="Images/load.jpg" /></div>
47 <script type="text/javascript">
48 function flow(mh, mv) {//参数mh和mv是定义数据块之间的间距,mh是水平距离,mv是垂直距离
49 var w = document.documentElement.offsetWidth;//计算页面宽度
50 var ul = document.getElementById("flow-box");
51 var li = ul.getElementsByTagName("li");
52 var iw = li[0].offsetWidth + mh;//计算数据块的宽度
53 var c = Math.floor(w / iw);//计算列数
54 ul.style.width = iw * c - mh + "px";//设置ul的宽度至适合便可以利用css定义的margin把所有内容居中
55
56 var liLen = li.length;
57 var lenArr = [];
58 for (var i = 0; i < liLen; i++) {//遍历每一个数据块将高度记入数组
59 lenArr.push(li[i].offsetHeight);
60 }
61
62 var oArr = [];
63 for (var i = 0; i < c; i++) {//把第一行排放好,并将每一列的高度记入数据oArr
64 li[i].style.top = "0";
65 li[i].style.left = iw * i + "px";
66 li[i].style.opacity = "1";
67 li[i].style["-moz-opacity"] = "1";
68 li[i].style["filter"] = "alpha(opacity=100)";
69 oArr.push(lenArr[i]);
70 }
71
72 for (var i = c; i < liLen; i++) {//将其他数据块定位到最短的一列后面,然后再更新该列的高度
73 var x = _getMinKey(oArr);//获取最短的一列的索引值
74 li[i].style.top = oArr[x] + mv + "px";
75 li[i].style.left = iw * x + "px";
76 li[i].style.opacity = "1";
77 li[i].style["-moz-opacity"] = "1";
78 li[i].style["filter"] = "alpha(opacity=100)";
79 oArr[x] = lenArr[i] + oArr[x] + mv;//更新该列的高度
80 }
81 document.getElementById("loadimg").style.top = _getMaxValue(oArr) + 50 + "px";//将loading移到下面
82
83 function scroll() {//滚动加载数据
84 var st = oArr[_getMinKey(oArr)];
85 var scrollTop = document.documentElement.scrollTop > document.body.scrollTop? document.documentElement.scrollTop : document.body.scrollTop;
86 if (scrollTop >= st - document.documentElement.clientHeight) {
87 window.onscroll = null;//为防止重复执行,先清除事件
88 _request(null, "GetList.php", function(data) {//当滚动到达最短的一列的距离时便发送ajax请求新的数据,然后执行回调函数
89 _addItem(data.d, function() {//追加数据
90 var liLenNew = li.length;
91 for(var i = liLen; i < liLenNew; i++) {
92 lenArr.push(li[i].offsetHeight);
93 }
94 for(var i = liLen; i < liLenNew; i++) {
95 var x = _getMinKey(oArr);
96 li[i].style.top = oArr[x] + 10 + "px";
97 li[i].style.left = iw * x + "px";
98 li[i].style.opacity = "1";
99 li[i].style["-moz-opacity"] = "1";
100 li[i].style["filter"] = "alpha(opacity=100)";
101 oArr[x] = lenArr[i] + oArr[x] + 10;
102 }
103 document.getElementById("loadimg").style.top = _getMaxValue(oArr) + 50 + "px";//loading向下移位
104 liLen = liLenNew;
105 window.onscroll = scroll;//执行完成,恢愎onscroll事件
106 });
107 })
108 }
109 }
110 window.onscroll =scroll;
111 }
112 //图片加载完成后执行
113 window.onload = function() {flow(10, 10)};
114 //改变窗口大小时重新布局
115 var re;
116 window.onresize = function() {
117 clearTimeout(re);
118 re = setTimeout(function() {flow(10, 10);}, 200);
119 }
120 //追加项
121 function _addItem(arr, callback) {
122 var _html = "";
123 var a = 0;
124 var l = arr.length;
125 (function loadimg() {
126 var img = new Image();
127 img.onload = function() {
128 a += 1;
129 if (a == l) {
130 for (var k in arr) {
131 var img = new Image();
132 img.src = arr[k].img;
133 _html += '<li><img src="' + arr[k].img + '" /><a href="#">' + arr[k].title + '</a></li>';
134 }
135 _appendhtml(document.getElementById("flow-box"), _html);
136 callback();
137 }
138 else {
139 loadimg();
140 }
141 }
142 img.src = arr[a].img;
143 })()
144 }
145 //ajax请求
146 function _request(reqdata, url, callback) {
147 var xmlhttp;
148 if (window.XMLHttpRequest) {
149 xmlhttp = new XMLHttpRequest();
150 }
151 else {
152 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
153 }
154 xmlhttp.onreadystatechange = function () {
155 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
156 var data = eval("(" + xmlhttp.responseText + ")");
157 callback(data);
158 }
159 }
160 xmlhttp.open("POST", url);
161 xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
162 xmlhttp.send(reqdata);
163 }
164 //追加html
165 function _appendhtml(parent, child) {
166 if (typeof (child) == "string") {
167 var div = document.createElement("div");
168 div.innerHTML = child;
169 var frag = document.createDocumentFragment();
170 (function() {
171 if (div.firstChild) {
172 frag.appendChild(div.firstChild);
173 arguments.callee();
174 }
175 else {
176 parent.appendChild(frag);
177 }
178 })();
179 }
180 else {
181 parent.appendChild(child);
182 }
183 }
184 //获取数字数组的最大值
185 function _getMaxValue(arr) {
186 var a = arr[0];
187 for (var k in arr) {
188 if (arr[k] > a) {
189 a = arr[k];
190 }
191 }
192 return a;
193 }
194 //获取数字数组最小值的索引
195 function _getMinKey(arr) {
196 var a = arr[0];
197 var b = 0;
198 for (var k in arr) {
199 if (arr[k] < a) {
200 a = arr[k];
201 b = k;
202 }
203 }
204 return b;
205 }
206 </script>
207 </body>
208 </html>