JavaScript實作簡單的圖片瀑布流插件
this.myPlugin = this.myPlugin || {}; /** * 制作圖片瀑布流 */ this.myPlugin.createImgWaterfall = function (option) { var defaultOption = { minGap: 10, //最小間隙 imgSrcs: [], //存盤圖片路徑的陣列 imgWidth: 200, //單張圖片的寬度 container: document.body //存盤圖片瀑布流的容器 }; //將傳入的引數option和默認的配置defaultOption合并 option = Object.assign({}, defaultOption, option); var imgs = []; //存放所有的圖片元素的陣列 //處理父元素 handleParent(); //創建圖片元素 createImgs(); //將setImgPosition設定為防抖函式, //所有的圖片加載完成后,隔一段時間執行setImgPosition函式 var viewDebounce = debounce(setImgPosition, 300); window.onresize = viewDebounce; //瀏覽器視口尺寸改變,則重新設定圖片位置資訊 /** * 檢查父元素是否是定位元素 * 不是定位元素,要轉變為定位元素 */ function handleParent() { var style = getComputedStyle(option.container); if (style.position === "static") { //沒有定位 option.container.style.position = "relative"; //使用相對定位 } } /** * 為每一張圖片創建一個img元素 * 并且設定img元素的樣式 */ function createImgs() { var imgDebounce = debounce(setImgPosition, 300); for (var i = 0; i < option.imgSrcs.length; i++) { var img = document.createElement("img"); img.src = option.imgSrcs[i]; //設定圖片路徑 img.style.width = option.imgWidth + "px"; //設定圖片寬度 img.style.position = "absolute"; //設定圖片絕對定位 img.style.transition = ".5s"; //設定圖片過渡時間 imgs.push(img); img.onload = imgDebounce; //等圖片加載完畢,設定圖片位置資訊 option.container.appendChild(img); //加入圖片容器 } } /** * 設定每個圖片元素的位置資訊 */ function setImgPosition() { //獲取圖片的水平資訊 var info = getHorizontalInfo(); console.log(info); var arr = new Array(info.imgNum); //存放下一行,每張圖片的top值 arr.fill(0); //陣列各項值填充為0 imgs.forEach(function (img) { //設定每張圖片的位置資訊 var minTop = Math.min.apply(null, arr); //找到陣列中最小的top值 img.style.top = minTop + "px"; //設定圖片的top值 var index = arr.indexOf(minTop); //找到陣列中最小值的下標 arr[index] += img.clientHeight + info.gap; //設定下張圖片的top值 img.style.left = index * (option.imgWidth + info.gap) + "px"; //設定圖片的left值 }); //所有圖片位置設定好后,計算容器最終的高度 var maxTop = Math.max.apply(null, arr); //找到最大的top值 option.container.style.height = maxTop - info.gap + "px"; } /** * 獲取圖片的水平資訊,包括 * 容器寬度:填充盒 * 一行可以放置圖片的數量 * 圖片與圖片之間的水平和垂直空隙 */ function getHorizontalInfo() { var obj = {}; obj.containerWidth = option.container.clientWidth; //存放圖片容器的寬度 //imgWidth*imgNum + minGab*(imgNum - 1) = containerWidth; //圖片寬度 * 圖片數量 + 圖片間的最小間隙*(圖片數量-1) = 容器總寬度 //根據上面的公式變形后,得到一行可以放置的圖片數量 obj.imgNum = (obj.containerWidth + option.minGap) / (option.imgWidth + option.minGap); obj.imgNum = Math.floor(obj.imgNum); //圖片數量要向下取整 //圖片之間的間隙 = (容器總寬度 - 圖片寬度*圖片數量) / (圖片數量 - 1) obj.gap = (obj.containerWidth - option.imgWidth * obj.imgNum) / (obj.imgNum - 1); return obj; } /** * 函式防抖,過一段時間后,執行某個函式 */ function debounce(callback, time) { var timer = null; //計時器 console.log(timer); return function () { console.log(timer); timer && clearTimeout(timer); //每次執行,重新計時 var args = arguments; timer = setTimeout(function () { callback.apply(null, args); }, time); } } };myPlugin.js
功能:
1).可以自動根據瀏覽器視口寬度,改變圖片瀑布流的寬度
2).添加了函式防抖功能
呼叫圖片瀑布流插件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .container { border: 1px solid #000; width: 90%; margin: 0 auto; } </style> </head> <body> <div class="container"> </div> <script src="./js/myPlugin.js"></script> <script> var imgSrcs = []; for(var i = 1; i <= 40; i++){ imgSrcs.push(`./image/${i}.jpg`); } myPlugin.createImgWaterfall({ imgSrcs: imgSrcs, container: document.querySelector(".container") //存盤圖片瀑布流的容器 }); </script> </body> </html>index.html
使用了40張圖片的圖片最后的效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/98451.html
標籤:JavaScript
下一篇:TypeScript陣列型別
