" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js原生瀑布流插件制作

 更新時(shí)間:2021年10月04日 09:08:57   作者:墨者羽晨  
這篇文章主要為大家詳細(xì)介紹了js原生瀑布流插件制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了js原生瀑布流插件制作的具體代碼,供大家參考,具體內(nèi)容如下

和普通的瀑布流是一樣的,在調(diào)用時(shí)制需要傳入容器,圖片以及圖片寬度即可直接生成瀑布流

話不多說,看代碼,后面說一下思路

1.html以及調(diào)用,其中HTML只需要一行

<body>
    <div class="main"></div>
 
    <script src="index.js"></script>
    <script>
        // 第一個(gè)參數(shù),瀑布流容器
        var dom = document.getElementsByClassName("main")[0];
        // 第二個(gè)參數(shù),圖片鏈接,寫入一個(gè)數(shù)組
        var imgArr = ["img/0.jpg","img/45.jpg","img/225.jpg","img/3.png","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png","img/0.jpg","img/3.png","img/45.jpg","img/225.jpg","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png",];
        // 調(diào)用插件,傳入?yún)?shù),第三個(gè)是圖片寬度
        waterFallFlow(dom,imgArr,220);
    </script>
</body>

2.HTML對(duì)應(yīng)的css

.main是傳入的容器,其中position: relative;是必須要的

然后.main img{transition: all 0.5s;}是動(dòng)畫代碼,給容器內(nèi)所有圖片添加

.main{
    border: 1px solid #ccc;
    width: 90%;
    margin: 0 auto;
    position: relative;
}
.main img{
    transition: all 0.5s;
}

然后是js

/**
 * @param {*} dom 代表瀑布流容器
 * @param {*} imgArr 圖片數(shù)組
 * @param {*} wid 圖片寬度
 */
function waterFallFlow(dom, imgArr, wid) {
    var gap;//間隙
    var colNumber;//列數(shù)
    imgDom();
    setImgPos();
    //窗口發(fā)生改變的時(shí)候
    window.onresize = function(){
        setImgPos();
    }
    /**var timer = null;
     * 上面這么寫,絲滑,但是過于影響性能,拖動(dòng)窗口時(shí)
     * 非常非常頻繁的調(diào)用函數(shù)對(duì)圖片進(jìn)行重新拍排布
     * 
     * 可以這樣,防抖
     * 
     * window.onresize = function(){
     * if(timer){
     *  clearIntval(timer);
     * }
     *  timer = setTimeout(function(){
     *  setImgPos();
     * },300);
     * }
     * 
     */
    // 生成DOM元素
    function imgDom() {
        for (let i = 0; i < imgArr.length; i++) {
            const url = imgArr[i];
            let img = document.createElement("img");
            img.src = url;
            img.style.width = wid + "px";
            img.style.position = "absolute";
            // 所有圖片使用絕對(duì)定位
            img.style.left = "";
            img.style.top = "";
            img.onload = function(){
                setImgPos();//圖片的異步加載
            }
            dom.appendChild(img);
        }
    }
    // 設(shè)置每張圖片的坐標(biāo)
    function setImgPos() {
        cal();
        var colY = new Array(colNumber);//存放每一列下一個(gè)圖片的Y坐標(biāo)
        colY.fill(0);//填充數(shù)組為0
        for (let i = 0; i < dom.children.length; i++) {
            var imgM = dom.children[i];
            var y = Math.min(...colY);//求最小值
            var index = colY.indexOf(y);//第幾列
            var x = (index + 1) * gap + index * wid;
            imgM.style.left = x + "px";
            imgM.style.top = y + "px";
            //更新數(shù)組
            colY[index] += parseInt(imgM.height)+gap;
        }
        //找到數(shù)組中最大的數(shù)字,來解決父級(jí)div塌陷問題
        var h = Math.max(...colY);
        console.log(h);
        dom.style.height = h + "px";
    }
    // 計(jì)算相關(guān)數(shù)據(jù)
    function cal() {
        var containerWidth = parseInt(dom.clientWidth);
        colNumber = Math.floor(containerWidth / wid);//列數(shù)
        var space = containerWidth - colNumber * wid;
        gap = space / (colNumber + 1);//計(jì)算間隙
 
    }
}

基本上我都寫了注釋,都可以看懂

來看思路

1.接受傳入的參數(shù),容器,圖片數(shù)組,圖片寬度

2.創(chuàng)建圖片元素,添加到對(duì)應(yīng)容器中

3.給每個(gè)圖片設(shè)置寬度,高度自適應(yīng),求列數(shù),間距

4.給圖片利用絕對(duì)定位來排布圖片,計(jì)算對(duì)應(yīng)的left和top值,也就是對(duì)應(yīng)的x,y坐標(biāo)

前三步應(yīng)該沒有問題,來看第四步

想法是這樣的

主要思路就是尋找最短的一列來排布下一張圖片,現(xiàn)在最短出現(xiàn)在第二列

這個(gè)時(shí)候圖片添加到了之前最短的第二列,現(xiàn)在繼續(xù)尋找最短的一列,繼續(xù)添加圖片

這樣此類推完成瀑布流的排布,來看看具體過程

首先計(jì)算出一共有幾列圖片,創(chuàng)建一個(gè)長度為列數(shù)的數(shù)組,全部填充為0,用來后面存放y坐標(biāo)

遍歷容器內(nèi)子元素,在循環(huán)中求出當(dāng)前數(shù)組中最小值以及最小值所在位置(列數(shù))就是y坐標(biāo)

這個(gè)時(shí)候就可以求x坐標(biāo)了

x = (列數(shù)+1)* 間距 + 當(dāng)前列 * 寬度(傳入的實(shí)參)

這樣就有了位置

要注意每次需要更新一下數(shù)組,就是修改添加圖片位置的y坐標(biāo),以及圖片的異步加載

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論