javascript特效之瀑布流

最近給大家分享一下在項目中用原生js實現的瀑布流特效。
要實現瀑布流,先讓我們來看看他的實現步驟。
1.給div設置浮動。 float:left。
2. 計算可視寬度下,每一行能放多少個
3. 把第一排的的元素的高度,存入一個數組中, 找到裏面最小的高度,下一張圖片就是要放在最小高度下面,元素設置定位,改變top,left。高度累加。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
      
    </style>
</body>
<script>
    window.onload = function(){
        // 隨機生成寬度一樣, 高度不一樣的div 模擬圖片
        var fragrment = document.createDocumentFragment();
        for(var i=0; i< 100; i++) {
            var _div = document.createElement('div');
            var l = random(0,255);
            var c = random(0,255);
            var r = random(0, 255);

            _div.style.backgroundColor = 'rgb('+l+','+c+','+r+')';

            _div.style.width = 200 +'px';
            _div.style.display ='inline-block';
            _div.style.float = 'left';
            // _div.style.position = 'absolute';
            _div.style.height = random(100, 400) +'px';
            fragrment.appendChild(_div);
        }
        document.body.appendChild(fragrment);

        waterFall();
    }
    function random (min, max){
        return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
    }

    function waterFall() {
        var _imgs = document.querySelectorAll('div');
        let heightArr = [];
        // 
        var columnNum = Math.floor(document.documentElement.clientWidth / _imgs[0].clientWidth);

        Array.prototype.forEach.call(_imgs, function(item, index){
            var height = item.clientHeight;
            var width = item.clientWidth;

            // 第一排默認排列, 把第一排的高度push到數組中
            if (index < columnNum) {
                heightArr[index] = height;
            } else {
                // 計算出每一列 高度最小的列, 並把 下一個元素 添加到這一列上
                var min = Math.min(...heightArr);
                var minIndex = heightArr.findIndex(item => item === min);
                item.style.position = 'absolute';
                item.style.top = min+ 'px';
                item.style.left = minIndex * width + 'px';
                heightArr[minIndex] += height;
            }
        })
    } 
</script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章