原理:
-
获取一张图片的宽度(所有图片的宽度是一定的)。
-
计算出浏览器一行图片的列数(页面宽度/图片宽度)。
-
new 一个新的数组,用于存放叠加图片的高度。
-
for循环图片个数,小于列数时,直接往页面上添加,同时把该图片的高度push到数组中。
-
大于列数时,图片的高度往上叠加。
HTML部分:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<
body
>
<
div
id
=
"main"
>
<
div
class
=
"box"
>
<
div
class
=
"pic"
>
<
img
src
=
"images/0.jpg"
/>
</
div
>
</
div
>
<
div
class
=
"box"
>
<
div
class
=
"pic"
>
<
img
src
=
"images/1.jpg"
/>
</
div
>
</
div
>
<
div
class
=
"box"
>
<
div
class
=
"pic"
>
<
img
src
=
"images/2.jpg"
/>
</
div
>
</
div
>
/*一下多余图片与上一致*/
</
div
>
</
body
>
|
CSS部分:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
*{
margin
:
0
;
padding
:
0
;
}
#main{
position
:
relative
;}
.box{
padding
:
15px
0
0
15px
;
float
:
left
;
}
.pic{
padding
:
10px
;
border
:
1px
solid
#ccc
;
border-radius:
5px
;
box-shadow:
0px
0px
5px
#ccc
;
}
.pic img{
width
:
165px
;
height
:
auto
;
}
|
最核心的部分--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
|
window.onload =
function
() {
waterfall(
'main'
,
'box'
);
}
function
waterfall(parent,box){
var
oParent = document.getElementById(parent);
var
oBoxs=getByClass(oParent,box);
//获取父元素下的所有的class为box的子元素
var
oBoxW=oBoxs[0].offsetWidth;
//列数
var
clos=Math.floor(document.documentElement.clientWidth/oBoxW);
//设置main的宽度
oParent.style.cssText=
'width:'
+oBoxW*clos+
'px;margin:0 auto'
;
var
arrH=
new
Array();
for
(
var
i=0;i<oBoxs.length;i++){
if
(i<clos){
arrH.push(oBoxs[i].offsetHeight);
}
else
{
//获取高度最小的图片
var
minH=Math.min.apply(
null
,arrH);
//获取高度最小的图片的index
var
index=getIndexMinH(arrH,minH);
oBoxs[i].style.position=
'absolute'
;
oBoxs[i].style.top=arrH[index];
oBoxs[i].style.left=oBoxs[index].offsetLeft;
arrH[index]=arrH[index]+oBoxs[i].offsetHeight;
}
}
console.log(arrH);
}
function
getByClass(parent,box){
var
boxs=
new
Array();
//用来存取box的元素
tags= parent.getElementsByTagName(
'*'
);
//获取父元素下的所有元素
for
(
var
i=0;i<tags.length;i++){
if
(tags[i].className==box){
boxs.push(tags[i]);
}
}
return
boxs;
}
function
getIndexMinH(arr,val){
for
(
var
i
in
arr){
if
(arr[i]==val){
return
i;
}
}
}
|
本文转自 爱笑嘚蛋蛋 51CTO博客,原文链接:http://blog.51cto.com/dd118/1679731,如需转载请自行联系原作者