瀑布流效果实现

<!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>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <style>
       #box {
        margin: 0;
        padding: 0;
        position: relative;
    }
    
    .item div {
        width: 220px;
        display: block;
    }
    
    .item {
        box-shadow: 2px 2px 2px #999;
        position: absolute;
    }
    </style>
</head>
<body>
    <div id="box">
        <div class="item">
            <div class="itemContent" style="background-color: blue;height: 150px">1</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: rosybrown;height: 100px">2</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 80px">3</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: #456;height: 100px">4</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 200px">5</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: blue;height: 150px">6</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 80px">7</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: green;height: 180px">8</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: #ccc;height: 80px">9</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 280px">27</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: orange;height: 380px">10</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: blue;height: 150px">11</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: rosybrown;height: 100px">12</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 80px">13</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: #456;height: 100px">14</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 200px">15</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: blue;height: 150px">16</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 80px">17</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: green;height: 180px">18</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: #ccc;height: 80px">19</div>
        </div>
        <div class="item">
            <div class="itemContent" style="background-color: red;height: 280px">20</div>
        </div>
    </div>
    <script>
        let box = document.getElementById('box');
        let items = box.children;
        // 定义每一列之间的间隙 为10像素
        let gap = 20;
        // 封装成一个函数
        const waterFall = () => {
            // 1- 确定列数  = 页面的宽度 / 图片的宽度
            let pageWidth = getClient().width;
            pageWidth = 800;
            let itemWidth = items[0].offsetWidth;
            itemWidth = 280;
            let columns = parseInt(pageWidth / (itemWidth + gap));
            // columns = 2;
            let arr = [];
            Array.from(items).forEach((item, index) => {
            if (index < columns) {
                // 确定第一行
                item.style.top = 0;
                item.style.left
                = (itemWidth + gap) * index + 'px';
                arr.push(item.offsetHeight);
    
            } else {
                // 找到数组中最小高度和它的索引
                let minHeight = arr[0];
                let index = 0;
                arr.forEach((tripleItems, tripleIndex) => {
                    if (minHeight > tripleItems) {
                        minHeight = tripleItems;
                        index = tripleIndex;
                    }
                });
                // top值就是最小列的高度 + gap
                item.style.top = arr[index] + gap + 'px';
                // left值就是最小列距离左边的距离
                item.style.left = items[index].offsetLeft + 'px';
                // 最小列的高度 = 当前自己的高度 + 拼接过来的高度 + 间隙的高度
                arr[index] = arr[index] + item.offsetHeight + gap;
            }
        });
        };

        // clientWidth 处理兼容性
        const getClient = () => {
            return {
                width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
                height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
            };
        };
        window.onload = function() {
            // 一进来就调用一次
            waterFall();
        };
    </script>
</body>
</html>

效果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值