瀑布流布局

js瀑布流布局

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
    <script src="js/fall.js"></script>
</head>
<style type="text/css">
    *{padding: 0;margin:0;}
    #main{
        position: relative;
    }
    .box{
        padding: 15px 0 0 15px;
        float:left;
    }
    .pic{
        padding: 10px;
        border:1px solid #ccc;
        box-shadow: 0 0 6px #ccc;
        border-radius: 5px;
    }
    .pic img{
        width:162px;
        height:auto;
    }
</style>
<body>
<div id="main">
    <div class="box">
        <div class="pic">
            <img src="./images/1.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/2.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/3.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/4.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/5.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/6.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/7.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/8.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/9.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/10.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/11.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/12.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/13.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/14.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/15.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/16.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/17.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/18.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/19.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/20.jpg"/>
        </div>
    </div>
    <div class="box">
        <div class="pic">
            <img src="./images/21.jpg"/>
        </div>
    </div>
</div>
</body>
</html>


js

window.onload = function () {
    waterfall('main', 'box');
    var dataInt = {'data': [{'src': '1.jpg'}, {'src': '2.jpg'}, {'src': '3.jpg'}, {'src': '4.jpg'}]};

    window.onscroll = function () {
        if (checkscrollSide) {
            var oParent = document.getElementById('main');
            //将数据块渲染到当前页面的尾部
            for (var i = 0; i < dataInt.data.length; i++) {
                var oBox = document.createElement('div');
                oBox.className = 'box';
                oParent.appendChild(oBox);
                var oPin=document.createElement('div');
                oPin.className='pin';
                oBox.appendChild(oPin);
                var oImg=document.createElement('img');
                oImg.src='./images/'+dataInt.data[i].src;
                oBox.appendChild(oImg);
            }
            waterfall('main', 'box');
        }
    }
}

function waterfall(parent, box) {
    //将main下的所有class为box的元素取出来
    var oParent = document.getElementById(parent);
    var oBoxs = getByClass(oParent, box);
    //计算整个页面显示的列数
    var oBoxw = oBoxs[0].offsetWidth;// 一个块框的宽
    var num = Math.floor(document.documentElement.clientWidth / oBoxw)
    //设置main的宽
    oParent.style.cssText = 'width:' + oBoxw * num + 'px;ma rgin:0 auto;';
    var hArr = [];//用于存储 每列中的所有块框相加的高度
    for (var i = 0; i < oBoxs.length; i++) {
        if (i < num) {
            hArr.push(oBoxs[i].offsetHeight)
        } else {
            var minH = Math.min.apply(null, hArr);
            var index = getminHIndex(hArr, minH);
            oBoxs[i].style.position = 'absolute';
            oBoxs[i].style.top = minH + 'px';
            oBoxs[i].style.left = oBoxs[index].offsetLeft + 'px';
            hArr[index] += oBoxs[i].offsetHeight;
        }
    }
}

//根据class获取元素
function getByClass(parent, clsName) {
    var boxArr = new Array(), //存储所有class为box的元素
        oElements = parent.getElementsByTagName('*');//获取 父级的所有子集
    for (var i = 0; i < oElements.length; i++) {//遍历子元素、判断类别、压入数组
        if (oElements[i].className == clsName) {
            boxArr.push(oElements[i]);
        }
    }
    return boxArr;
}

function getminHIndex(arr, minH) {
    for (var i in arr) {
        if (arr[i] == minH) {
            return i;
        }
    }
}

//检测是否具备滚动条加载数据块的条件
function checkscrollSide() {
    var oParent = document.getElementById('main');
    var oBoxs = getClassObj(oParent, 'box');
    var lastBoxH = oBoxs[oBoxs.length - 1].offsetTop + Math.floor(oBoxs[oBoxs.length - 1].offsetHeight / 2);  //最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//注意解决兼容性
    var height = document.documentElement.clientHeight || document.body.clientHeight//页面高度
    return (lastPinH < scrollTop + height) ? true : false;
}


jQuery瀑布流布局

js

$(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 (checkscrollside()) {
            $.each(dataInt.data, function (key, value) {
                var oBox = $('<div>').addClass('box').appendTo($('#main'));
                var oPic = $('<div>').addClass('pic').appendTo($(oBox));
                var oImg = $('<img>').attr('src', 'images/' + $(value).attr('src')).appendTo($(oPic))
            })
            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('magin', '0 auto')
    var hArr = [];
    $boxs.each(function (index, value) {
        var h = $boxs.eq(index).outerHeight();
        if (index < cols) {
            hArr[index] = h;
        } else {
            var minH = Math.min.apply(null, hArr);
            var minHIndex = $.inArray(minH, hArr);
            $(value).css({
                'position': 'absolute',
                'top': minH + 'px',
                'left': $boxs.eq(minHIndex).position().left
            })
            hArr[minHIndex] += $boxs.eq(index).outerHeight();
        }
    })
}

function checkscrollside() {
    var $lastBox = $('#main>div').last();
    var lastBoxDis = $lastBox.offset().top + Math.floor($lastBox.outerHeight() / 2);
    var scrollTop = $(window).scrollTop();
    var documentH = $(window).height();
    return (lastBoxDis < scrollTop + documentH) ? true : false;
}



效果图



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值