兩種方式實現水平瀑布流布局


在實際開發中,經常會遇到圖片排序處理的問題,進過多次嘗試,我在這里總結兩種圖片水平排序的方式:

第一種:CSS屬性直接設置圖片樣式

具體是使用CSS中的column-count屬性,給圖片的外部box設置后,里面的img可以直接根據數量來進行排序

頁面效果就是以下這樣:

 

html和css代碼如下:

 

 

 

 可能細心的你會發現,但是這個屬性可以進行水平對齊,但是排序會出現問題,所以應用場景有限,但是優勢也很明顯,就是省事(*^▽^*)。

第二種:使用js代碼來動態進行設置

原理是通過一個數學邏輯來對圖片進行計算,假設我們需要把4張大小不同的圖片進行水平瀑布流對齊,我們需要先計算好所有圖片的高寬比,然后給一個統一的高度,根據這個統一的高度進行排序,我們可以獲得一個長方形,

這個長方形也是有寬高比的,我們把它計算出來,然后將寬度調整為頁面寬度,那么這個時候高度我們自需要調整寬高比就可以確定,根據這個調整好的高度,我們再根據4張圖片的寬高比,來獲取這個時候的寬度,對圖片進行排序即可。

案例如下:

第一張圖片:400*300,寬高比為4:3

第二張圖片:500*100,寬高比為5:1

第三張圖片:200*500,寬高比為2:5

第四張圖片:200*100,寬高比為2:1

我們首先確定一個高度,這里設定為300

那么總的長方形寬度為2620,

這個長方形的寬高比為131:15

接下來我們需要獲取頁面寬度,這里以1920為例,

 那么安裝這個比例來調整總長方形,它的高度為219.84,這里小數點兩位后的可以直接舍棄,從頁面顯示來看無關痛癢

那么安裝這個高度,我們再反推4張圖片的寬度為:

第一張圖片:293.12*219.84

第二張圖片:1099.2*219.84

第三張圖片:87.963*219.84

第四張圖片:439.68*219.84

這四張圖片的總寬度為:1919.963

根據這個邏輯來設置js代碼,對所有的圖片進行分組,在分組中進行這樣的操作,就可以實現圖片水平瀑布流布局,代碼設計的好,可以兼容所有寬度,一切隨心所欲,但缺點也是有的,就是麻煩,麻煩,麻煩,而且考慮到這套邏輯實現,

對內存的占用量較大,對懶加載也很不友好,需要改邏輯才可以兼容欄加載和圖片緩存︿( ̄︶ ̄)︿。

這里提供一個案例dome給大家進行觀看和調試

http://www.linheng.xyz/project/sppbl/index.html

效果如下(具備簡單的懶加載功能):

 

 主要代碼如下:

<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>水平瀑布流懶加載</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }

    h1 {
        text-align: center;
    }

    .box {
        overflow: auto;
        /* width:80%; */
        border: 1px black solid;
        margin: 0 auto;
    }

    .box img {
        float: left;
        display: block;
    }
</style>

<body>
    <h1>水平瀑布流</h1>
    <div class="box"></div>
</body>
<script>
    var box = document.getElementsByClassName("box")[0];
    var imglist = [];
    var img,
        length = 0,
        count = 0,
        line = 3;
    // console.log(box);
    var maxwidth = window.innerWidth - 100;
    box.style.width = maxwidth + "px";
    addimg(20);

    function fomate() {
        var row = Math.floor(length / line);

        // console.log(row);
        for (var i = 0; i < row; i++) {
            var w = 0; //每行的寬度和

            for (var j = 0; j < line; j++) {
                if (imglist[i * line + j].prop != undefined) {
                    w += imglist[i * line + j].prop * 300; //單張圖片以300為高的寬度累加到w中
                }

            }

            // console.log(w);
            var h = 300 * maxwidth / w;

            for (var j = 0; j < line; j++) {
                if (imglist[i * line + j].prop != undefined) {
                    imglist[i * line + j].style.height = h + "px";
                    imglist[i * line + j].style.width = h * imglist[i * line + j].prop + "px";
                }

            }
        }
    }

    window.onresize = function () {
        maxwidth = window.innerWidth - 100;
        box.style.width = maxwidth + "px";
        fomate();
    }

    window.onscroll = function () {
        var scroll = document.documentElement.scrollTop;
        var screen = window.innerHeight;
        var offsetTop = box.offsetTop;
        var height = box.offsetHeight;

        if (scroll + screen - offsetTop - height > -20) {
            addimg(20);
        }

        ;
    }

    function addimg(i) {
        length += i;

        // console.log(length);
        for (var i = 1; i <= 20; i++) {
            img = createimg("img/pics (" + i + ").jpg", box);
            imglist.push(img);
            // console.log(imglist.length);

        }
    }

    function createimg(src, pad) {
        //創建圖片的方法
        var length = 20;
        count = 0;
        var img = document.createElement("img");
        img.src = src;
        pad.appendChild(img);

        img.onload = function () {
            this.prop = this.width / this.height;
            count++;
            // console.log(count);

            if (count == length) {
                fomate();
            }
        }

        return img;

    }
</script>

</html>

  

以上是我總結出的兩種方法,如果有更好的方法,歡迎你在評論進行補充ヾ(◍°∇°◍)ノ゙。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM