【简易实用】源生js瀑布流示列

1 篇文章 0 订阅

 代码片段示列:

<!DOCTYPE html>
<html>
    <head>
        <title>js流布局</title>
        <style>
            *{margin:0;padding:0;}
            li{list-style:none;}
            .list {position: relative;}
            .list .item{ position: absolute;}
            .list img{display:block;width:100%;}
        </style>
    </head>
    <body>
        <div class="warp">
            <ul class="list" id="list">
                <li class="item"><img src="./img/1.jpg" />01</li>
                <li class="item"><img src="./img/2.jpg" />02</li>
                <li class="item"><img src="./img/3.jpg" />03</li>
                <li class="item"><img src="./img/4.jpg" />04</li>
                <li class="item"><img src="./img/5.gif" />05</li>
                <li class="item"><img src="./img/6.jpg" />06</li>
                <li class="item"><img src="./img/7.jpg" />07</li>
                <li class="item"><img src="./img/5.gif" />08</li>
                <li class="item"><img src="./img/6.jpg" />09</li>
                <li class="item"><img src="./img/7.jpg" />10</li>
            </ul>
        </div>
    </body>
</html>
<script>
    function flowObj () {
        this.ImgList = document.querySelector('#list');
        this.itemList = document.getElementsByClassName('item');
    }
    flowObj.prototype.setCol = function () {
        // 获取屏幕总宽度
        var totalWidth = document.clientWidth || document.body.clientWidth;
        // 计算item宽度
        var itemWidth = '';
        // 每行多少张
        var colImg = '';
        switch (true) {
            case totalWidth <= 808:
                // 显示三张
                itemWidth = Math.ceil(totalWidth / (colImg = 3));
            break;
            case totalWidth > 808 && totalWidth <= 1242:
                // 显示五张
                itemWidth = Math.ceil(totalWidth / (colImg = 5));
            break;
            case totalWidth > 1242:
                // 显示七张
                itemWidth = Math.ceil(totalWidth / (colImg = 7));
            break;
            default:
            break;
        }
        // 存高度数组
        var harr = new Array(colImg+1).join('0').split('');
        for ( var i = 0; i < this.itemList.length; i++) {
            var mins = Math.min.apply(null,harr);
            var bol = true;
            this.itemList[i].style.width = itemWidth + "px";
            for (var j = 0; j < harr.length; j++) {
                // 若有相同高度的最小高度
                if (harr[j] == mins && bol) {
                   bol = false;
                   // 设置 top
                   this.itemList[i].style.top = harr[j]+"px";
                   // 设置left
                   this.itemList[i].style.left = j * itemWidth + "px";
                   // 赋值height
                   harr[j] = parseFloat(harr[j]) + this.itemList[i].clientHeight;
                }
            }
        }
    }
    var flow = new flowObj();
    window.onload = function () {
        flow.setCol();
    }
    window.onresize = function () {
        flow.setCol();
    }
</script>

1.没有做封装,简单版本

 代码片段说明:

           建立两个数组

            如:harr --> 保存列的高度值,每个值初始化为0,避免下面循环时做为空等判断。

            这个列可根据多少屏幕宽度自己自定义吧。 

            每列展示多少个即可算出每个li.item的宽度,并赋值。

            如:this.itemList ---> 展示的li, 这个是操作li的

            循环itemList 目的->赋值操作每个列的 left , top 。 

            left,top从哪里来 --> harr中来。第二行的第一张图要放在第一行的最小那一列的下方, 所以此处要先找harr中的最小高度值,会得到它的索引。left = j * 它的宽度 ,top = harr[j]

             每一次循环的找到的最小高度值,要进行‘更新’,需要重新赋予新的高度值(也就是插入进瀑布流图片的高度值)。

 总结:

           每一张图片 要进行三个操作 :

            ① 取最小高度值 (图片要放的哪一张图下面)

            ② 设置left,top值 (根据第一步得到的)

            ③ 赋值 (更新 harr[],插入的那张图片的高度)

2.有几个需要注意的地方:

   ① this.itemList[i].style.width = itemWidth + "px";

   设置每个li.item的宽度,请在之前就设置好,不然下面获取的clientHeight 不准确 (因为宽高度是img跟里面的内容撑开的,img的宽度是100% ,会等比缩放的。)

   ② var bol = true;

     harr[] 这个数组,用来保存li.item的高度值的,好找最小高度值,考虑到最小高度值可能有一样的,那么取第一个就好,也就是说,找到了直接false即可。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值