js原生瀑布流插件制作
本文實(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)文章
bootstrap datetimepicker實(shí)現(xiàn)秒鐘選擇下拉框
這篇文章主要為大家詳細(xì)介紹了bootstrap datetimepicker添加秒鐘選擇下拉框的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01javascript移動(dòng)開發(fā)中touch觸摸事件詳解
這篇文章主要為大家詳細(xì)介紹了javascript移動(dòng)開發(fā)中touch觸摸事件,感興趣的小伙伴們可以參考一下2016-03-03JavaScript異步編程:異步數(shù)據(jù)收集的具體方法
我們先嘗試在不借助任何工具函數(shù)的情況下來解決這個(gè)問題。筆者能想到的最簡單的方法是:因前一個(gè)readFile的回調(diào)運(yùn)行下一個(gè)readFile,同時(shí)跟蹤記錄迄今已觸發(fā)的回調(diào)次數(shù),并最終顯示輸出。下面是筆者的實(shí)現(xiàn)結(jié)果。2013-08-08詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄
這篇文章主要介紹了詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07JavaScript實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)菜單實(shí)例代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)菜單實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06mvc 、bootstrap 結(jié)合分布式圖簡單實(shí)現(xiàn)分頁
這篇文章主要介紹了mvc 、bootstrap 結(jié)合分布式圖簡單實(shí)現(xiàn)分頁的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10