js 图片瀑布流

2022-03-03  本文已影响0人  Peter_2B

思路:

(function(){
    
    var allItems = document.getElementsByClassName('wf-item');
    var arr = [];

    var init = function () {
        setImgPos();
    }

    function setImgPos(){
        
        for(var i = 0; i < allItems.length; i++){
            var item = allItems[i];
            //232px如何求得:
            //1200px宽度 - 40px(5列共4个10px空隙), 再除以5份图宽度 = 232px
            item.style.width = '232px';             //图片宽度固定,高度自适应

            if(i < 5){  //设置第一行
                arr.push( item.offsetHeight );      // 设置首行5张图所处位置
                item.style.top = '0px';             // 它们高度都是0px
                
                if( (i+1) % 5 === 1 ){              // 第一行的第1张图片的左边距
                    item.style.left = '0px';
                }else{
                    item.style.left = i * (232 + 10) + 'px';  // 第一行的第2、3、4、5列的图片左边距 (图片宽度 + margin边距)
                };
            }else{     //设置第N行

                // 如第6张图片时,getMinIdx函数获取到前5张图片的最小高度的下标;
                var minIdx = getMinIdx(arr);

                // 第6张图所处的left位置就是在 前5图最小高度图片的下面(前5上已经设置了left),top高度就是图片的高度+10margin;
                item.style.left = allItems[minIdx].offsetLeft + 'px';
                item.style.top = ( arr[minIdx] + 10 ) + 'px';

                // 最后再给前5的数组,当前操作的下标下, 更新加入的图片的高度
                arr[minIdx] = arr[minIdx] + ( item.offsetHeight + 10 );
            }

        }
    }

    // 获取数组中最小值的下标位置;
    function getMinIdx(arr){
        var min = Math.min(...arr);
        return arr.indexOf(min);
    }

    window.onload = function () {
        init();
    }

})()
.wrap{
    position: relative;
    width: 1200px;
    margin: 0 auto;
}
.wf-item{
    position: absolute;
    background-color: orange;
    overflow: hidden;
}
.wf-item img{
    display: block;
    width: 100%;
}
上一篇 下一篇

猜你喜欢

热点阅读