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>

 

posted on 2015-01-06 01:55  比比已存在  阅读(170)  评论(0编辑  收藏  举报