js原生瀑布流插件制作
本文實(shí)例為大家分享了js原生瀑布流插件制作的具體代碼,供大家參考,具體內(nèi)容如下
和普通的瀑布流是一樣的,在調(diào)用時(shí)制需要傳入容器,圖片以及圖片寬度即可直接生成瀑布流
話不多說(shuō),看代碼,后面說(shuō)一下思路
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ù),圖片鏈接,寫(xiě)入一個(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)畫(huà)代碼,給容器內(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;
* 上面這么寫(xiě),絲滑,但是過(guò)于影響性能,拖動(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ù)字,來(lái)解決父級(jí)div塌陷問(wèn)題
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ì)算間隙
}
}基本上我都寫(xiě)了注釋,都可以看懂
來(lái)看思路
1.接受傳入的參數(shù),容器,圖片數(shù)組,圖片寬度
2.創(chuàng)建圖片元素,添加到對(duì)應(yīng)容器中
3.給每個(gè)圖片設(shè)置寬度,高度自適應(yīng),求列數(shù),間距
4.給圖片利用絕對(duì)定位來(lái)排布圖片,計(jì)算對(duì)應(yīng)的left和top值,也就是對(duì)應(yīng)的x,y坐標(biāo)
前三步應(yīng)該沒(méi)有問(wèn)題,來(lái)看第四步
想法是這樣的

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

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

這樣此類推完成瀑布流的排布,來(lái)看看具體過(guò)程
首先計(jì)算出一共有幾列圖片,創(chuàng)建一個(gè)長(zhǎng)度為列數(shù)的數(shù)組,全部填充為0,用來(lái)后面存放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),以及圖片的異步加載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單實(shí)例處理url特殊符號(hào)&處理(2種方法)
url里的參數(shù)內(nèi)容包含&符合,我有兩種方法解決一是:在頁(yè)面用JS轉(zhuǎn)碼;二是:在后端處理,另外還有網(wǎng)絡(luò)分享的一些方法,感興趣的朋友可以參考下哈2013-04-04
微信小程序methods中定義的方法互相調(diào)用的實(shí)例代碼
這篇文章主要介紹了微信小程序methods中定義的方法互相調(diào)用的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
JavaScript中object和Object的區(qū)別(詳解)
下面小編就為大家?guī)?lái)一篇JavaScript中object和Object的區(qū)別(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
javascript實(shí)現(xiàn)驗(yàn)證身份證號(hào)的有效性并提示
下面分享的JS腳本是我用過(guò)的最完善的身份證號(hào)的驗(yàn)證程序了,因?yàn)橹挥姓嬲纳矸葑C號(hào)才能被通過(guò),小伙伴們可以試試。直接復(fù)制運(yùn)行。2015-04-04
用cookies實(shí)現(xiàn)的可記憶的樣式切換效果代碼下載
比較不錯(cuò)的用cookies實(shí)現(xiàn)的可記憶的樣式切換效果,這個(gè)思路也在一定程序,方便客戶的長(zhǎng)期使用。2007-12-12
6種JavaScript判斷對(duì)象自身為空的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了6種JavaScript判斷對(duì)象自身為空的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
淺談js圖片前端預(yù)覽之filereader和window.URL.createObjectURL
下面小編就為大家?guī)?lái)一篇淺談js圖片前端預(yù)覽之filereader和window.URL.createObjectURL。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06

