文件目錄:
images:
這個文件夾放了需要的照片,名字都按照0,1,2,3…排列,便於取的時候好取,我放了23張,當然實際應用肯定是Ajax請求來的
Html:
最外層#main
這個容器就是放整個瀑布流的盒子,裏面.pin
是每個商品詳情盒子,.box
是每張商品圖片的盒子,裏面放上商品圖片
<div id="main">
<div class="pin">
<div class="box">
<img src="./images/1.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/2.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/3.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/4.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/5.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/6.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/7.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/8.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/9.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/10.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/11.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/12.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/13.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/14.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/15.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/16.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/17.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/18.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/19.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/20.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="./images/21.jpg"/>
</div>
</div>
</div>
css:
<style type="text/css">
*{padding: 0;margin:0;} /* 不要效仿啊,要引入重置css文件 */
#main{
position: relative; /* 動態渲染的.pin都加上了絕對定位,所以父元素相對定位 */
}
.pin{
padding: 15px 0 0 15px; /* 這是每個商品盒子之間的距離,之所以用'padding'而不用'margin',是要獲取盒子之間或者距離頂部距離的時候,獲取不到‘margin’ */
float:left; /* 讓所有盒子橫向排列 */
}
.box{
padding: 10px; /* 內容內縮 */
border:1px solid #ccc;
box-shadow: 0 0 6px #ccc;
border-radius: 5px;
}
.box img{
width:162px; /* 所有照片定寬,高度自由 */
height:auto;
}
</style>
js:
首先放入jQuery源文件,去官網下載就好了,然後就是實現瀑布流的邏輯,註釋已經寫得很清楚了:
$( window ).on( "load", function(){
waterfall('main','pin');
var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; // 實際開發中這個數據從後臺獲取
window.onscroll=function(){ // 滾動條事件
if(checkscrollside()){
$.each( dataInt.data, function( index, value ){
var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) );
var $oBox = $('<div>').addClass('box').appendTo( $oPin );
$('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox);
});
waterfall(); // 滾動加載的時候要執行這個函數,否則後面動態渲染的商品都沒有樣式
};
}
});
/*
parent 父級id
pin 元素id
*/
function waterfall(parent,pin){
var $aPin = $( "#main>div" );
var iPinW = $aPin.eq( 0 ).width();// 一個塊框pin的寬
var num = Math.floor( $( window ).width() / iPinW );//每行中能容納的pin個數【窗口寬度除以一個塊框寬度】
//oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//設置父級居中樣式:定寬+自動水平外邊距
$( "#main" ).css({
'width:' : iPinW * num,
'margin': '0 auto'
});
var pinHArr=[];//用於存儲 每列中的所有塊框相加的高度。
$aPin.each( function( index, value ){
var pinH = $aPin.eq( index ).height();
if( index < num ){
pinHArr[ index ] = pinH; //第一行中的num個塊框pin 先添加進數組pinHArr
}else{
var minH = Math.min.apply( null, pinHArr );//數組pinHArr中的最小值minH
var minHIndex = $.inArray( minH, pinHArr );//數組中這個最小值的index索引
$( value ).css({
'position': 'absolute',
'top': minH + 15, // 加上15是padding
'left': $aPin.eq( minHIndex ).position().left
});
//數組 最小高元素的高 + 添加上的aPin[i]塊框高
pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了塊框後的列高
}
});
}
function checkscrollside(){
var $aPin = $( "#main>div" );
var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//創建【觸發添加塊框函數waterfall()】的高度:最後一個塊框的距離網頁頂部+自身高的一半(實現未滾到底就開始加載)
var scrollTop = $( window ).scrollTop()//注意解決兼容性
var documentH = $( document ).width();//頁面高度
return (lastPinH < scrollTop + documentH ) ? true : false;//到達指定高度後 返回true,觸發waterfall()函數
}