您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么用JS實現網頁瀑布流布局,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發,可以給網站添加各種各樣的動態效果,讓網頁更加美觀。
先看效果:
圖片多行等寬元素排列,后面的元素依次添加到其后,等寬不等高,根據圖片原比例縮放直至寬度達到我們的要求,依次按照規則放入指定位置。
為了方便理解,在此先給上html、css代碼
不完整html代碼:
<div id="container"> <div class="box"> <div class="box-img"> <img src="./img/1.jpg" > </div> </div> <div class="box"> <div class="box-img"> <img src="./img/2.jpg" > </div> </div> <div class="box"> <div class="box-img"> <img src="./img/3.jpg" > </div> </div> </div> ......<!-- 省略了圖片,多少張圖片自行決定-->
完整的css代碼
*{ padding: 0; margin: 0; } #container{ position: relative; } .box{ float: left; padding: 15px; } .box-img { width: 150px; padding: 5px; border: 1px solid #ccc ; box-shadow: 0 0 5px #ccc; border-radius: 5px; } .box-img img{ width: 100%; height: auto; }
簡單地來說,如果要實現瀑布流布局,得完成這幾件事?
function getChildElemnt() { const contentArr = []//定義數組準備裝圖 const parent = document.getElementById(container)//得到整個頁面 const allContent = parent.getElementsByTagName('*')//得到整個標簽 console.log(allContent); for (var i = 0; i < allContent.length; i++) { if (allContent[i].className == 'box') { contentArr.push(allContent[i])//將class='box'的標簽裝入數組 } } console.log(contentArr); return contentArr//返回數組 }
var ccontent = getChildElemnt() var imgWidth = ccontent[0].offsetWidth//令所有圖片寬度等于第一張圖片
var dWidth=document.documentElement.clientWidth//頁面寬度 var num = Math.floor(dWidth/ imgWidth) //Math.floor()向下取整
因為在瀑布流布局中,當第一行圖片已經擺滿后,第二行的第一張圖片要放在第一行中高度最小的圖片的下面
var BoxHeightArr = []//定義一個數組,把每張圖片的高度依次放進去 for (var i = 0; i < ccontent.length; i++) { if (i < num) { BoxHeightArr[i] = ccontent[i].offsetHeight//將圖片的高度存入數組 } else {//當第一行已經存放不了圖片后 var minHeight = Math.min.apply(null, BoxHeightArr)//比較出上一行最小的高度 } }
//定義一個getMinHeightLocation函數,給它傳入BoxHeightArr上一行全部圖片,和minHeight上一行圖片的最小高度 function getMinHeightLocation(BoxHeightArr, minHeight) { for (var i in BoxHeightArr) { if (BoxHeightArr[i] === minHeight) {//當圖片高度等于最小高度時,該圖片的位置為最小高度圖片的位置 return i } } }
for (var i = 0; i < ccontent.length; i++) { if (i < num) { BoxHeightArr[i] = ccontent[i].offsetHeight } else { var minHeight = Math.min.apply(null, BoxHeightArr) var minIndex = getMinHeightLocation(BoxHeightArr, minHeight) ccontent[i].style.position = 'absolute'//將要插入的圖片絕對定位,即元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定 ccontent[i].style.top = minHeight + 'px'//令插入的圖片到頂端的距離剛好等于要插其下面圖片的高度 ccontent[i].style.left = ccontent[minIndex].offsetLeft + 'px'//令插入的圖片到最左邊的距離剛好等于要插其下面圖片到最左邊的距離 BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight//插入圖片后,得將這位置的高度設為兩張圖片的高度和 } }
優化代碼,提高性能
window.onload = function() { imgLocation('container', 'box')//構造函數imgLocation } //用window.onload = function() {}函數就不用等著body頁面中調用就可以執行了 // 獲取到當前有多少張圖片要擺放 function imgLocation(parent, content) {//令parent='container',content='box' // 將parent下所有的內容全部取出 var cparent = document.getElementById(parent) var ccontent = getChildElemnt(cparent, content) var imgWidth = ccontent[0].offsetWidth var num = Math.floor(document.documentElement.clientWidth / imgWidth) cparent.style.cssText = `width: ${imgWidth * num} px` var BoxHeightArr = [] for (var i = 0; i < ccontent.length; i++) { if (i < num) { BoxHeightArr[i] = ccontent[i].offsetHeight } else { var minHeight = Math.min.apply(null, BoxHeightArr) var minIndex = getMinHeightLocation(BoxHeightArr, minHeight) ccontent[i].style.position = 'absolute' ccontent[i].style.top = minHeight + 'px' ccontent[i].style.left = ccontent[minIndex].offsetLeft + 'px' BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight } } // console.log(BoxHeightArr); } function getChildElemnt(parent, content) {parent='container',content='box' const contentArr = [] const allContent = parent.getElementsByTagName('*') console.log(allContent); for (var i = 0; i < allContent.length; i++) { if (allContent[i].className == content) { contentArr.push(allContent[i]) } } console.log(contentArr); return contentArr } function getMinHeightLocation(BoxHeightArr, minHeight) { for (var i in BoxHeightArr) { if (BoxHeightArr[i] === minHeight) { return i } } }
以上是“怎么用JS實現網頁瀑布流布局”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。