JS實現瀑布流

原理:

  1. 獲取一張圖片的寬度(所有圖片的寬度是一定的)。

  2. 計算出瀏覽器一行圖片的列數(頁面寬度/圖片寬度)。

  3. new 一個新的數組,用於存放疊加圖片的高度。

  4. for循環圖片個數,小於列數時,直接往頁面上添加,同時把該圖片的高度push到數組中。

  5. 大於列數時,圖片的高度往上疊加。

HTML部分:

<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部分:

*{
   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:

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;
       }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章