" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js原生瀑布流插件制作

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

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

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

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

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

<body>
    <div class="main"></div>
 
    <script src="index.js"></script>
    <script>
        // 第一個參數(shù),瀑布流容器
        var dom = document.getElementsByClassName("main")[0];
        // 第二個參數(shù),圖片鏈接,寫入一個數(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ù),第三個是圖片寬度
        waterFallFlow(dom,imgArr,220);
    </script>
</body>

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

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

然后.main img{transition: all 0.5s;}是動畫代碼,給容器內(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ā)生改變的時候
    window.onresize = function(){
        setImgPos();
    }
    /**var timer = null;
     * 上面這么寫,絲滑,但是過于影響性能,拖動窗口時
     * 非常非常頻繁的調(diào)用函數(shù)對圖片進(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";
            // 所有圖片使用絕對定位
            img.style.left = "";
            img.style.top = "";
            img.onload = function(){
                setImgPos();//圖片的異步加載
            }
            dom.appendChild(img);
        }
    }
    // 設(shè)置每張圖片的坐標(biāo)
    function setImgPos() {
        cal();
        var colY = new Array(colNumber);//存放每一列下一個圖片的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ù)字,來解決父級div塌陷問題
        var h = Math.max(...colY);
        console.log(h);
        dom.style.height = h + "px";
    }
    // 計算相關(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);//計算間隙
 
    }
}

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

來看思路

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

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

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

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

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

想法是這樣的

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

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

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

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

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

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

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

這樣就有了位置

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

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

相關(guān)文章

  • bootstrap datetimepicker實現(xiàn)秒鐘選擇下拉框

    bootstrap datetimepicker實現(xiàn)秒鐘選擇下拉框

    這篇文章主要為大家詳細(xì)介紹了bootstrap datetimepicker添加秒鐘選擇下拉框的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • javascript移動開發(fā)中touch觸摸事件詳解

    javascript移動開發(fā)中touch觸摸事件詳解

    這篇文章主要為大家詳細(xì)介紹了javascript移動開發(fā)中touch觸摸事件,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JavaScript異步編程:異步數(shù)據(jù)收集的具體方法

    JavaScript異步編程:異步數(shù)據(jù)收集的具體方法

    我們先嘗試在不借助任何工具函數(shù)的情況下來解決這個問題。筆者能想到的最簡單的方法是:因前一個readFile的回調(diào)運(yùn)行下一個readFile,同時跟蹤記錄迄今已觸發(fā)的回調(diào)次數(shù),并最終顯示輸出。下面是筆者的實現(xiàn)結(jié)果。
    2013-08-08
  • 詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄

    詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄

    這篇文章主要介紹了詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • js獲取本日、本周、本月的時間代碼

    js獲取本日、本周、本月的時間代碼

    本篇文章給大家分享的內(nèi)容是利用js如何獲取本日、本周、本月的時間代碼,有一定的參考價值,有需要的朋友可以參考一下
    2020-02-02
  • JavaScript實現(xiàn)三級聯(lián)動菜單實例代碼

    JavaScript實現(xiàn)三級聯(lián)動菜單實例代碼

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)三級聯(lián)動菜單實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • momentjs使用詳細(xì)說明

    momentjs使用詳細(xì)說明

    這篇文章主要介紹了momentjs詳細(xì)使用說明,使用 Moment.js 可以輕松地獲取上周、上月和前三個月的起始和結(jié)束時間,在示例中,我們傳入了 '2023-07-15',并將返回的日期信息存儲在 dateInfo 變量中,然后將其打印到控制臺上,需要的朋友可以參考下
    2023-07-07
  • IE6下拉框圖層問題探討及解決

    IE6下拉框圖層問題探討及解決

    有關(guān)IE6下拉框圖層問題,一直困擾著大家,下面有個不錯的方法大家可以嘗試操作下
    2014-01-01
  • 12種JavaScript常用的MVC框架比較分析

    12種JavaScript常用的MVC框架比較分析

    這篇文章主要介紹了12種JavaScript常用的MVC框架比較分析,以獨特的視角分析了12中常見的JavaScript MVC框架各種優(yōu)缺點,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • mvc 、bootstrap 結(jié)合分布式圖簡單實現(xiàn)分頁

    mvc 、bootstrap 結(jié)合分布式圖簡單實現(xiàn)分頁

    這篇文章主要介紹了mvc 、bootstrap 結(jié)合分布式圖簡單實現(xiàn)分頁的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10

最新評論