原生JS实现瀑布流

HTML部分

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        #water {
            width: 90%;
            margin: 0 auto;
            outline: 1px solid;
        }
        #water img{
            transition: all .5s;
        }
    </style>
</head>

<body>
    <div id="water">

    </div>
    <script src="./script/waterfall.js"></script>
    <script>
        var mockImgs = [];
        for (let i = 0; i < 41; i++) {
            mockImgs.push("./img/" + i + ".jpg");
        }
        createWaterfallArea(document.getElementById("water"), mockImgs);
    </script>
</body>

</html>

JS部分

function createWaterfallArea(areaDom, imgs, imgWidth = 220) {
    areaDom.innerHTML = "";
    areaDom.style.position = "relative";
    var containerWidth;
    var colNumber;//1行可以显示几张图片
    var gap; //图片之间的间隙
    var imgArray = [];
    //1. 添加图片
    addImgs();

    //2. 设置图片的位置
    setPositions();

    //3. 窗口尺寸改变事件
    var timer = null;
    window.addEventListener("resize", function(){
        //函数防抖
        if(timer){
           clearInterval(timer); 
        }
        timer = setTimeout(() => {
            setPositions();
        }, 500);
    })

    //函数区域

    function setParameters() {
        containerWidth = parseInt(areaDom.clientWidth);
        colNumber = parseInt(containerWidth / imgWidth);//1行可以显示几张图片
        gap = containerWidth - colNumber * imgWidth //图片之间的间隙
        if (colNumber > 1) {
            gap = gap / (colNumber - 1);
        }
    }

    /**
     * 添加图片
     */
    function addImgs() {
        for (var i = 0; i < imgs.length; i++) {
            var url = imgs[i];
            var img = document.createElement("img");
            img.src = url;
            img.style.width = imgWidth + "px";
            img.style.position = "absolute";
            img.addEventListener("load", function () {
                setPositions();
            })
            areaDom.appendChild(img);
            imgArray.push(img);
        }
    }

  
    /**
     * 设置所有图片的位置
     */
    function setPositions() {
        setParameters();
        var nextYs = new Array(colNumber);
        nextYs.fill(0);
        for (var i = 0; i < imgArray.length; i++) {
            var img = imgArray[i];
            //纵坐标
            var y = Math.min(...nextYs);
            var colIndex = nextYs.indexOf(y);
            //横坐标
            img.style.left = imgWidth * colIndex + gap * colIndex + "px";
            img.style.top = y + "px";
            //修改数组
            nextYs[colIndex] += parseInt(img.height) + gap;
        }
        //设置容器高度
        areaDom.style.height = Math.max(...nextYs) + "px";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值