css代码
---------------------------------------------
*{
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: 0 0 5px #ccc;
}
.pic img{
width: 230px;
height: auto;
}
-----------------------------------
js代码
-----------------------------------
window.onload=function(){
waterfall('main','box');
}
function waterfall(parent,box){
//将main下的所有claa 为box的元素取出来
var oParent=document.getElementById(parent);
var oBoxs=getByClass(oParent,box);
//console.log(oBoxs.length);
//计算整个页面显示的列数(页面宽/box的宽)
var oBoxW=oBoxs[0].offsetWidth;
//console.log(oBoxW);//267=图片宽度230+内边距10*2+边框宽度1*2+15
var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
//console.log(cols);
//设置main的宽,属性style.cssText可以使css样式以字符串形式设置进来
oParent.style.cssText='width:'+oBoxW*cols+'px;margin:0 auto';
var hArr=[];//存放每一列高度的数组
for(var i=0;i<oBoxs.length;i++){
if(i<cols){
hArr.push(oBoxs[i].offsetHeight);
}else{
var minH=Math.min.apply(null,hArr);
/*apply方法能劫持另外一个对象的方法,
继承另外一个对象的属性.
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function.*/
//console.log(minH);
var index=getMinhIndex(hArr,minH);
oBoxs[i].style.position='absolute';
oBoxs[i].style.top=minH+'px';
oBoxs[i].style.left=oBoxW*index+'px';
}
}
console.log(hArr);
}
//根据class获取元素
function getByClass(parent,clsName){
var boxArr=new Array(),//用来存储获取到的所有class 为box的元素
oElements=parent.getElementsByTagName('*');
for(var i=0;i<oElements.length;i++){
if(oElements[i].className==clsName){
boxArr.push(oElements[i]);
}
}
return boxArr;
}
function getMinhIndex(arr,val){
for(var i in arr){//遍历arr数组
if(arr[i]==val){
return i;
}
}
}
-----------------------
没有更新数组hArr