JS实现图片瀑布流

注意 
1. 在列表的父元素设置,列数column-count;在子元素li中设置宽度 
2. 它应该有默认的缝隙,对于移动端来说有点大,然后就需要自己设置列之间的缝隙column-gap值 
3. 还有个问题是,子元素li不能设置margin,会影响计算,只能设置padding

源码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>瀑布流</title>

    <style type="text/css">

*{

    margin: 0px;

    padding: 0px;

}

#superDivID{

    position: relative;

}

.baseDivClass{

    padding: 5px;

    float: left;

}

.imgDivClass{

    /*内边距*/

    padding: 5px;

    /*边框*/

    border: 1px solid #66CCFF;

    /*圆角*/

    border-radius: 5px;

    /*阴影*/

    box-shadow: 0px 1px 5px #66CCFF;

}

.imgDivClass img{

    width: 200px;

    height: auto;

}

    </style>

</head>

<body>

    <!--父视图-->

    <div id="superDivID">

        <!--图片根视图-->

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/2233娘4k动漫壁纸_彼岸图网.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/34397df9193ea2907c17267b2099fa38.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/382bd7072731420e911ac7813a55c951.jpeg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/452836a97f66a43a54a24640c402e010.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/7971e71e2b0fb375.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/95faa788aa0249b89fbb7ed96c3ea89c.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/98ada56b99b376905ad23e8136aa0542.jpg">

            </div>

        </div>

        <div class="baseDivClass">

            <div class="imgDivClass">

                <img src="img/1202075.gif">

            </div>

        </div>

    </div>

    <script type="text/javascript">

    var sectionHeights = [];// 获取第一列的高度,自后每张图都加载到该去的位置

 window.onload = function () {// 窗口加载时触发

    var superDiv = parameterSuperDiv();

    var baseDivs = parmeterBaseDivs();

    setLoadPictureOnRowAction(superDiv, baseDivs);

}

function parameterSuperDiv () {// 父视图div

    return document.getElementById("superDivID");

}

function parmeterBaseDivs () {// 图片根视图divs

    return getAllBaseDivAction(parameterSuperDiv(), "baseDivClass");

}

// 获取所有的baseDiv

function getAllBaseDivAction (superDiv, divClass) {

    var resultDivs = [];

    // tag name传"*"表示获取所有的子节点

    var subViews = superDiv.getElementsByTagName("*");

    for (var i = 0 ; i < subViews.length ; i ++) {

        var tempView = subViews[i];

        if (tempView.className == divClass) {

            resultDivs.push(tempView);

        }

    }

    return resultDivs;

}

// 根据窗口大小确定每行加载图片的张数

function setLoadPictureOnRowAction (superDiv, baseDivs) {

    var screenWidth = document.body.offsetWidth;

    var baseDivWidth = baseDivs[0].offsetWidth;

    var number = Math.floor(screenWidth/baseDivWidth);

    // 更改样式,固定每行显示几张图片

    superDiv.style.cssText = "width:"+baseDivWidth*number+"px;margin:0 auto"; // 居中

    for (var i = 0 ; i < baseDivs.length ; i ++) {

        var tempDiv = baseDivs[i];

        if (i < number) {

            sectionHeights.push(tempDiv.offsetHeight);

        } else {

            // 获取到列高数组中最短的高度

            var minHeight = Math.min.apply(null, sectionHeights);

            // 获取最短高度的索引

            var minIndex = getMinHeightIndexAction(sectionHeights, minHeight);

            // 放置div

            tempDiv.style.position = "absolute"; // 绝对布局

            tempDiv.style.top = minHeight + "px";

            tempDiv.style.left = baseDivs[minIndex].offsetLeft+"px";

            // 更新列高数组

            sectionHeights[minIndex] = sectionHeights[minIndex] + tempDiv.offsetHeight;

        }

    }

}

 

// 获取最短高度的索引

function getMinHeightIndexAction (heightArr, height) {

    for (var i in heightArr) {

        if (heightArr[i] == height) {

            return i;

        }

    }

}

// 拖动滚动条时触发

window.onscroll = function () {

    if (judgeHandleAction()) {

        var superDiv = parameterSuperDiv();

        var baseDivs = parmeterBaseDivs();

        var dataArr = getDataActon().data;

        for (var i = 0 ; i < dataArr.length ; i ++) {

            var tempBaseDiv = document.createElement("div");

            tempBaseDiv.className = "baseDivClass";

            superDiv.appendChild(tempBaseDiv);

            var tempImgDiv = document.createElement("div");

            tempImgDiv.className = "imgDivClass";

            tempBaseDiv.appendChild(tempImgDiv);

            var tempImg = document.createElement("img");

            tempImg.src = dataArr[i].href;

            tempImgDiv.appendChild(tempImg);

            //

            // 获取到列高数组中最短的高度

            var minHeight = Math.min.apply(null, sectionHeights);

            // 获取最短高度的索引

            var minIndex = getMinHeightIndexAction(sectionHeights, minHeight);

            // 放置div

            tempBaseDiv.style.position = "absolute"; // 绝对布局

            tempBaseDiv.style.top = minHeight + "px";

            tempBaseDiv.style.left = baseDivs[minIndex].offsetLeft+"px";

            // 更新列高数组

            sectionHeights[minIndex] = sectionHeights[minIndex] + tempBaseDiv.offsetHeight;

        }

    }

}

// 判断是否执行操作,滚动至最后一张图片

function judgeHandleAction () {

    var superDiv = parameterSuperDiv();

    var baseDivs = parmeterBaseDivs();

    var lastTopHeight = baseDivs[baseDivs.length-1].offsetTop;

    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

    var scrollHeight = document.documentElement.clientHeight || document.body.clientHeight;

    if (lastTopHeight <= scrollTop + scrollHeight) {

        return true;

    }

}

    </script>

</body>

</html>

实现效果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值