JavaScript實(shí)現(xiàn)瀑布流布局的代碼分享
前言
不知道大家在線上購物的時(shí)候有沒有發(fā)現(xiàn)到,自己逛起來根本就停不下來,越往下翻越是覺得就會出現(xiàn)需要的東西。這就是很多電商公司都在使用的瀑布流布局,為了更好的留住用戶,給你的感覺就是下面會有更精彩的東西,讓你不停地往下滑,一步步走進(jìn)消費(fèi)“陷阱”。如何實(shí)現(xiàn)瀑布流布局,這也是阿里面試的經(jīng)典考題。
如何實(shí)現(xiàn)
思路:將內(nèi)容寬度一致,高度不一致的圖片,從左至右排列,一行內(nèi)容排滿后,下一張就會按順序排在最短的內(nèi)容后,以此類推。
html部分
在頁面放入20個(gè)box容器(幾張圖片就放幾個(gè)容器),為方便給圖片添加好看的樣式,我在box容器里放了個(gè)box-img容器,再將圖片放入。
<body> <div id="container"> <div class="box"> <div class="box-img"> <img src="./img1/1 (1).JPG" alt=""> </div> </div> <div class="box"> <div class="box-img"> <img src="./img1/1 (2).JPG" alt=""> </div> </div> /*此處省多個(gè)box 幾張圖片就放幾個(gè)box容器*/ </body>
css部分
* { margin: 0; padding: 0; } /*讓圖片向左浮動(dòng)*/ .box { float: left; } /*定位*/ .container { position: relative; } /*給圖片容器設(shè)置相同的寬度 邊框 盒子陰影*/ .box-img { width: 150px; padding: 5px; border: 1px solid #ccc; box-shadow: 0 0 5px #ccc; } /*讓圖片與圖片容器寬度相等*/ .box-img img { width: 100%; }
js部分
我們的目的其實(shí)就是要擺放圖片的位置,先獲取到所有的圖片,當(dāng)?shù)谝慌畔蜃蟾?dòng)擺放好后,我們需要找到在第二排開始從誰是被需要擺放位置的。那就用屏幕視窗的寬度除以一個(gè)圖片盒子的寬度,向下取整,那就知道第一行能放幾張圖,然后我們操作第num張之后的每一張圖,把它們一一擺放到最矮那一列的位置。
window.onload = function() { imgLocation('container', 'box') } //獲取到所有要擺放的圖片 function imgLocation(parent,content){ var cparent = document.getElementById(parent) // cparent 下的所有的第一層的子容器 box var ccontent = getChildElement(cparent,content) //[裝了20個(gè)div] //找從誰開始是需要被擺放位置的 var winWidth = document.documentElement.clientWidth //獲取視窗的寬度 var imgWidth = ccontent[0].offsetWidth //獲取圖片盒子的寬度 var num = Math.floor(winWidth / imgWidth) //向下取整 // 操作第 num+1 張圖 var BoxHeightArr = [] for (var i = 0; i < ccontent.length; i++){ // 前num張只要計(jì)算高度 if (i < num) { BoxHeightArr[i] = ccontent[i].offsetHeight }else{ //我們要操作的Box var minHeight = Math.min.apply(null,BoxHeightArr) var minIndex = BoxHeightArr.indexOf(minHeight) ccontent[i].style.position = 'absolute' ccontent[i].style.top = minHeight + 'px' ccontent[i].style.left = (imgWidth * minIndex) + 'px' //更新最矮的那一列的高度 BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight } } }
在外面創(chuàng)建一個(gè)輔助函數(shù),可以幫我們?nèi)〉礁溉萜髦械哪骋粚幼尤萜?/p>
function getChildElement(parent,content){ var contentArr = [] var allContent = parent.getElementsByTagName('*') //[xxxx數(shù)組] //遍歷allContent 把中其類名為 content 的容器都存到contentArr數(shù)組中 for (var i = 0; i < allContent.length; i++){ //當(dāng)前這個(gè)容器的類名是否為 content if (allContent[i].className == content){ contentArr.push(allContent[i]) } } return contentArr }
實(shí)現(xiàn)效果圖如下:
瀑布流布局的優(yōu)點(diǎn)
良好的視覺體驗(yàn) ;參差不齊的排列方式,以及流動(dòng)布局的擴(kuò)展性,打破常規(guī)網(wǎng)站布局排版,用戶在瀏覽內(nèi)容時(shí)會有新鮮感,帶來良好的視覺體驗(yàn)。
吸引用戶;可以通過界面展示給用戶多條數(shù)據(jù),并且讓用戶有可以向下瀏覽的沖動(dòng)。
適應(yīng)移動(dòng)端;移動(dòng)設(shè)備都偏小,屏幕能顯示的內(nèi)容不會很多,如果經(jīng)常翻頁的話顯得疲勞,使用瀑布流布局用戶只需要不停滾動(dòng)就能不斷地進(jìn)行瀏覽。
到此這篇關(guān)于JavaScript實(shí)現(xiàn)瀑布流布局的代碼分享的文章就介紹到這了,更多相關(guān)JavaScript瀑布流布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
echarts折線圖每段顯示不同的顏色的實(shí)現(xiàn)
本文主要介紹了echarts折線圖每段顯示不同的顏色的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09JS字符串與二進(jìn)制的相互轉(zhuǎn)化實(shí)例代碼詳解
這篇文章主要介紹了JS字符串與二進(jìn)制的相互轉(zhuǎn)化 ,在文中給大家提到了Js之字符串和字節(jié)碼之間的相互轉(zhuǎn)換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06微信內(nèi)置瀏覽器WeixinJSBridge的使用技巧(隱藏右上角按鈕,獲取用戶網(wǎng)絡(luò)狀態(tài),支付等)
這篇文章主要介紹了微信內(nèi)置瀏覽器WeixinJSBridge的使用技巧,隱藏右上角按鈕,獲取用戶網(wǎng)絡(luò)狀態(tài),支付,隱藏下方工具欄等,需要的朋友可以參考下2024-02-02javascript ie6兼容position:fixed實(shí)現(xiàn)思路
positon:fixed 讓HTML元素脫離文檔流固定在瀏覽器的某個(gè)位置,由于網(wǎng)頁中類似這樣的元素很多,所以本文的出現(xiàn)是很有必要的了,接下為大家介紹下javascript如何實(shí)現(xiàn)ie6下的position:fixed2013-04-04