jQuery下的瀑布流效果(改)

使用$(window).on("resize", waterfall)使得瀑布流列数可以动态变化。

包含加载数据的模拟。

useJQ.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流布局</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <script src="js/jquery.min.js"></script>
    <script src="js/scriptJQ.js"></script>
</head>
<body>
<div id="main">
    <div class="box">
        <div class="pic"><img src="images/1.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/2.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/3.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/4.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/5.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/6.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/7.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/8.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/9.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/10.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/11.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/12.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/13.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/14.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/15.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/16.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/17.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/18.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/19.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/20.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/21.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/22.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/23.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/24.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/25.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/26.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/27.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/28.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/29.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/30.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/31.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/32.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/33.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/34.jpg" alt=".jpg"></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/35.jpg" alt=".jpg"></div>
    </div>
</div>
</body>
</html>


style.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: 0 0 5px #ccc;
}

.pic img {
    width: 165px;
    height: auto;
}


scriptJQ.js

/**
 * Created by DreamBoy on 2016/2/4.
 */
$(window).on("load", function() {
    waterfall();

    var dataInt = {"data" : [
        {"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"}
    ]};
    $(window).on("scroll", function() {
        if(checkScrollSlide()) {
            $.each(dataInt.data, function(key, value) {
                $box = $("<div>").addClass("box").appendTo($("#main"));
                $pic = $("<div>").addClass("pic").appendTo($box);
                $("<img>").attr("src", "images/" + value.src).appendTo($pic);
            });
            waterfall();
        }
    });

    $(window).on("resize", waterfall);
});

function waterfall() {
    var $boxs = $("#main>div");
    //求出每个盒子的宽度(包括内边距)
    var w = $boxs.eq(0).outerWidth();
    //求出当前窗口所能承载的瀑布流列数
    var cols = Math.floor($(window).width() / w);
    //设置容器的宽度
    $("#main").width(w*cols).css("margin", "0px auto");

    var hArr = []; //保存每一列的高度
    $boxs.each(function(index, value) {
        var h = $boxs.eq(index).outerHeight();

        if(index < cols) {
            $(value).removeAttr("style"); //移除style样式,配合 resize 事件(窗口变化时触发)

            hArr[index] = h;
        } else {
            //最小高度的列
            var minH = Math.min.apply(null, hArr);
            //最小高度的列在数组中的索引
            var minHIndex = $.inArray(minH, hArr);

            $(value).css({
                "position":"absolute",
                "top":minH,
                "left":minHIndex*w
            });

            hArr[minHIndex] += $(value).outerHeight();
        }
    });
}

function checkScrollSlide() {
    var $lastBox = $("#main>div").last();
    var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height() / 2);
    var scrollTop = $(window).scrollTop();
    var dh = $(window).height();
    return lastBoxH < scrollTop + dh;
}

在Chrome运行结果如下:


修改窗口宽度:


列数发生了动态变化;滚动条滚到底部,数据动态的加载,模拟网络加载图片:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值