响应式瀑布流

<!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>
    ul, li {
        list-style: none;
        box-sizing: border-box;
    }
    ul {
        /*  600px; */
        border: 5px solid silver;
        border-radius: 8px;
        margin: 0 auto;
        padding: 15px;
        display: flex;
    }
    li {
         200px;height: 300px;
        background-color: rgb(0, 162, 255);
        padding: 10px;
    }
    li>div {
        text-align: center;
        font-size: 50px;
        color: white;
    }
    </style>
</head>
<body>
    <ul class="list"></ul>
    <script>
        var list = document.querySelector(".list");
        // 列的数组,列创建完后才赋值
        var liArr;
        var ha = [];
        // 根据当前可视窗口宽度计算列的数量
        // 减去margin padding,是li的可用宽度
        var bw = document.body.clientWidth - 30 - 20;
        // 下舍入,因为能放3.9个实际上会只能放下3个
        // 总宽度除当前宽度
        var n = Math.floor(bw/200);
        // 创建对应个数的列,创建对应的高度数组
        for(var i = 0; i < n ; i++){
            var newLi = document.createElement("li");
            console.log(list);
            console.log(newLi);

            list.appendChild(newLi);
            // ha承接所有列的高度,刚创建时初始高度为0
            // 创建几列,push几次
            ha.push(0);
        }
        liArr = document.querySelectorAll("ul li");
        // 找到ha数组中最小的元素,确定下标
        // function getMinIndex(){
        //     // 假设ha第一个元素是最小值,把他和其他元素分别比较,如果小于其他值,覆盖
        //     var min = ha[0];
        //     for(var j = 0 ; j < ha.length; j++){
        //         min = min < ha[j] ? min : ha[j];
        //     }
        //     // 返回最小值的下标
        //     return ha.indexOf(min);
        // }
        // 以上代码比较值,可优化为直接比较索引的值
        function getMinIndex(){
            var mi = 0;
            for(var j =1; j <ha.length;j++){
                mi = ha[mi] < ha[j] ? mi : j;
            }
            return mi;
        }

        // 封装随机数函数
        function rn(a,b){
            return Math.round(Math.random()*(b-a)+a);
        }
        // 创建元素 每个元素添加到当前最短的一列中
        for(var x = 0; x < 50; x++){
            // 创建元素
            var el = document.createElement("div");
            // 随机高度,颜色,设置内容
            var h = rn(100,200);
            var bg = "#" + (Math.random()+ "").substr(2,6);
            el.style.height = h + "px";
            el.style.background = bg;
            el.innerHTML = x;
            el.style.lineHeight = h + "px";
            // 找到最矮一列下标,添加到对应列
            var _mi = getMinIndex();
            // 更新ha数组
            liArr[_mi].appendChild(el);
            // 添加刚加进去的元素的高度
            ha[_mi] += h;
        }
       
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/sandraryan/p/11388826.html