首页 > 代码库 > jQuery瀑布流

jQuery瀑布流

之前写过,但是感觉没写过似的,看来有必要重新回想下当时的思路。

<style type="text/css">    *{margin:0; padding:0; box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box;}    img{max-width: 100%; height: auto;}    #wrap{position: relative; width:90%; margin:0 auto;}    .box{width:25%; float:left; padding: 0 15px 15px 0;}    .pic{padding:10px; border:1px solid #888;}</style>
<div id="wrap">    <div class="box">        <div class="pic"><img src="images/0.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/1.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/15.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/2.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/10.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/18.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/11.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/12.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/13.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/14.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/16.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/17.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/18.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/19.jpg" alt=""/></div>    </div>    <div class="box">        <div class="pic"><img src="images/20.jpg" alt=""/></div>    </div></div>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script><script>    /*    *  瀑布流 等宽不等高布局    */    var waterFall = function() {        var $wrap = $("#wrap"),            $list = $("#wrap>div"),            w = $list.eq(0).outerWidth(), //获取第一个元素宽度也就是所有子元素的宽度            cols = Math.round($("#wrap").width()/w); //计算每行有几列        var hArr = []; //数组用来存储每列相加的高度        var wrapH = 0; //定义最外层box高度        $list.each(function(index, value) {            var h = $list.eq(index).outerHeight(); //获取遍历的每个元素的高度            var minH, minHIndex;            if(index < cols) {   //循环所有子元素,如果索引小于每列数,那这些元素应该是在第一行.                hArr[index] = h;            }else {                minH = Math.min.apply(null, hArr);  //计算hArr数组中最小高度Math.min.apply(null, Array)方法                minHIndex = $.inArray(minH, hArr);  //计算hArr数组中最小高度的索引值$.inArray()方法                $(value).css({                    ‘position‘: ‘absolute‘,                    ‘top‘: minH + ‘px‘,                    ‘left‘: minHIndex*w + ‘px‘                })                hArr[minHIndex] += h; //将原最小高度加上 在下面新增的box高度            }            var height = minH + h;            if(height > wrapH) {                wrapH = height;            }        })        $("#wrap").height(wrapH);  //给最外层box设置高度    }    var checkScrollSide = function() {        var $lastEle = $list.last(),            lastEleTop = $lastEle.offset().top + $lastEle.height()/2;        var scrollH = $(window).scrollTop();        var windowH = $(document).height();        return (lastEleTop < scrollH + windowH) ? true : false;    }    //页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字文件),二是onload,表示页面包含图片等文件在内的所有元素加载完成。    $(window).on("load", function() {  //第一次页面加载如果图片下载速度过慢,使得图片高度无法获取到,元素高度计算会错误,图片出现重叠问题,所以需要等到load事件        waterFall();        var dataList = {‘data‘:[{‘src‘:‘15.jpg‘},{‘src‘:‘1.jpg‘},{‘src‘:‘18.jpg‘},{‘src‘:‘10.jpg‘}]};        $(window).scroll(function() {            if(checkScrollSide) {  //判断最后一个元素高度是否显示过半。                $.each(dataList.data, function(index, value) {                    var $oEle = $("<div>").addClass("box").appendTo($("#wrap")),                        $oPic = $("<div>").addClass("pic").appendTo($oEle),                        $oImg = $(‘<img>‘).attr("src", "images/" + $(value).attr("src")).appendTo($oPic);                })                waterFall();            }        })    })</script>

 

jQuery瀑布流