瀑布流布局

一、瀑布流布局

Mark之,蘑菇街,点点网,以及淘宝最新上线的“哇哦” 等等,倒是很流行哈~ 在淘宝即将上线的众多产品中,你还会大量看到这样的形式呢。


这种布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们给这样的布局起了一个形象的名字 — 瀑布流式布局。

瀑布流布局



二、实现方式


1.绝对定位:一种最优秀的方案,方便添加数据内容,窗口变化,列数/数据块都会自动调整;


<div id="main'>

<div class="imgbox">

<div class="pic"> <img src=""></div>

</div>

</div>

$(window ).on("load",function(){

waterfall();
var dataInt={
   'data': [
       {
           'src': '1.jpg'
       },
       {
           'src': '11.jpg'
       },
       {
           'src': '3.jpg'
       },
       {
           'src': '4.jpg'
       },
       {
           'src': '5.jpg'
       },
       {
           'src': '6.jpg'
       }
   ]
};
//检测是否具备加载图片
$(window).scroll(function(){
if(cheakscroll){
$.each(dataInt.data, function( index, value ){
               var $oPin = $('<div>').addClass('imgbox').appendTo( $( "#main" ) );
               var $oBox = $('<div>').addClass('pic').appendTo($oPin );
               //console.log($(value).attr( 'src'));
               $('<img>').attr('src','./images/' + $(value).attr( 'src') ).appendTo($oBox);

});
           waterfall();
}
})
})


function waterfall(){
var $imgbox= $( "#main>div");
var $iwidth= $imgbox.eq(0).outerWidth();
var num = Math.floor( $( window ).width() / $iwidth);//每行中能容纳的imgbox个数【窗口宽度除以一个块框宽度】
$("#main").css({'width' : $iwidth * num,'margin': '0 auto'});
    var hArr=[];//存放图片盒子的高度
    $imgbox.each(function(index,value){
    if(index<num){
    hArr[index] = $imgbox.eq(index).outerHeight();
    }else{
    var minH = Math.min.apply( null,hArr)
    var minHIndex = $.inArray( minH,hArr)
    //console.log(minHIndex)
    $(value).css({
                'position': 'absolute',
                'top': minH +'px',
                'left': $iwidth * minHIndex+'px'
            })
            hArr[minHIndex]+=$imgbox.eq(index).outerHeight();
    }
       })
}

//检查是否滚动到了最后一张数据块
function cheakscroll(){
var $lastimgbox=$('#main>div').last();
var lastimgboxdis=$lastimgbox.offset().top+Math.floor($lastimgbox.outerHeight()/2);
var scrollTop=$(window).scrollTop();
var documentH=$(window).height();
return (lastimgboxdis>scrollTop+documentH)? true: false;
 }


三、解释说明

$(document).ready(function(){
    ...code...
})

$(document).load(function(){
    ...code...
})

ready事件在DOM结构绘制完成之后就绘执行。这样能确保就算有大量的媒体文件没加载出来,JS代码一样可以执行。load事件必须等到网页中所有内容全部加载完毕之后才被执行。如果一个网页中有大量的图片的话,则就会出现这种情况:网页文档已经呈现出来,但由于网页数据还没有完全加载完毕,导致load事件不能够即时被触发。


var $oPin = $('<div>').addClass('imgbox').appendTo( $( "#main" ) );
var $oBox = $('<div>').addClass('pic').appendTo($oPin );
$('<img>').attr('src','./images/' + $(value).attr( 'src') ).appendTo($oBox);

其实这段代码的意思就是动态的生成上文所说的html结构。

jq的各种宽度的比较

width(): 获取第一个匹配元素内部宽度(不包括补白 padding 和边框 border)。

innerWidth() 获取第一个匹配元素边框以内的宽度(包括补白 padding ,不包括 边框border)。

outerWidth() 获取第一个匹配元素外部宽度(默认包括补白 padding和边框border )。此方法对可见和隐藏元素均有效。

outerWidth(true) 获取第一个匹配元素外部宽度(默认包括补白 padding和边框border和外边距Margin )。此方法对可见和隐藏元素均有效。