深入學習js瀑布流佈局
本文實例為大家分享了js瀑布流佈局學習資料,供大家參考,具體內容如下
特點:等寬不等高。
實作方式:Javascript/Jquery/CSS3多欄佈局。
範例網站:花瓣網-->分類
一、JS實作瀑布流
index.html:頁面結構
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流布局</title> <link rel="stylesheet" href="styles/layout.css"> </head> <body> <div id="main"> <div><div><img src="../waterFall/pic/0.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/1.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/2.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/3.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/4.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/5.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/6.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/7.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/8.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/9.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/10.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/11.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/12.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/13.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/14.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/15.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/16.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/17.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/18.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/19.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/20.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/21.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/22.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/23.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/24.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/25.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/26.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/27.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/28.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/29.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/30.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/31.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/32.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/33.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/34.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/35.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/36.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/37.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/38.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/39.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/40.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/41.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/42.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/43.jpg" alt=""></div></div> </div> <script src="scripts/waterfall.js"></script> </body> </html>
layout.css:頁面元素樣式
*{ pdding:0; margin:0; } div#main{ position: relative; } div.box{ padding:15px 0 0 15px; float: left; } div.pic{ padding:10px; border:1px solid #ccc; border-radius:5px; box-shadow: 0 0 5px #ccc; } .pic img{ height:auto; width:165px; }
window.onload=function(){ waterFall('main','box'); //模拟后台相应数据json var dataInt={ "data": [ {"src":"0.jpg"}, {"src":"1.jpg"}, {"src":"2.jpg"}, {"src":"3.jpg"}, {"src":"4.jpg"}, {"src":"5.jpg"}, {"src":"6.jpg"} ] } window.onscroll=function(){ if(checkScrollSlide){ //将数据块渲染到当前页面的尾部 var oParent=document.getElementById("main"); for(var i=0;i<dataInt.data.length;i++){ var oBox=document.createElement("div"); oBox.className="box"; oParent.appendChild(oBox); var oPic=document.createElement("div"); oPic.className="pic"; oBox.appendChild(oPic); var img=document.createElement("img"); img.setAttribute("src",dataInt.data[i]); img.src="pic/"+dataInt.data[i].src; oPic.appendChild(img); } dataInt=null;//清空数据块,防止无限加载 waterFall('main','box');//对页面新元素进行布局渲染 } } } function waterFall(parent,box){ //将main下的class为box的所有元素取出来 var oParent=document.getElementById(parent); var oBoxs=getByClass(oParent,box); console.log(oBoxs.length); //计算整个页面显示的列数(页面宽/box宽) var oBoxW=oBoxs[0].offsetWidth; // console.log(oBoxW); var cols=Math.floor(document.documentElement.clientWidth/oBoxW); // console.log(cols); //设置main的宽 oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;" var hArr=[];//存放每列高度的数组 for(var i=0;i<oBoxs.length;i++){ if(i<cols){ hArr.push(oBoxs[i].offsetHeight); }else{ var minH=Math.min.apply(null,hArr);//获取当前数组最小高度值 // console.log(minH); var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引 //console.log(index); oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位 oBoxs[i].style.top=minH+"px"; oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值 hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片 } //console.log(hArr); } } //根据class获取元素 function getByClass(parent,clsName){ var boxArr=new Array(),//用来存储获取到的所有class为box的元素 oElements=parent.getElementsByTagName("*"); for(var i=0;i<oElements.length;i++){ if(oElements[i].className==clsName){ boxArr.push(oElements[i]); } } return boxArr; } function getMinhIndex(arr,val){ for(var i=0;i<arr.length;i++){ if(arr[i]==val){ return i; } } } //检测是否具备滚动条加载数据块条件 function checkScrollSlide(){ var oParent=document.getElementById("main"); var oBoxs=getByClass(oParent,"box"); var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2); var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取 //console.log(scrollTop); var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取 return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值 }
$( window ).on( "load", function(){ waterfall('main','pin'); var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; window.onscroll=function(){ if(checkscrollside()){ $.each( dataInt.data, function( index, value ){ var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) ); var $oBox = $('<div>').addClass('box').appendTo( $oPin ); $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox); }); waterfall(); }; } }); /* parend 父级id pin 元素id */ function waterfall(parent,pin){ var $aPin = $( "#main>div" ); var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽 var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】 //oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距 $( "#main" ).css({ 'width:' : iPinW * num, 'margin': '0 auto' }); var pinHArr=[];//用于存储 每列中的所有块框相加的高度。 $aPin.each( function( index, value ){ var pinH = $aPin.eq( index ).height(); if( index < num ){ pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr }else{ var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH var minHIndex = $.inArray( minH, pinHArr ); $( value ).css({ 'position': 'absolute', 'top': minH + 15, 'left': $aPin.eq( minHIndex ).position().left }); //数组 最小高元素的高 + 添加上的aPin[i]块框高 pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高 } }); } function checkscrollside(){ var $aPin = $( "#main>div" ); var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载) var scrollTop = $( window ).scrollTop()//注意解决兼容性 var documentH = $( document ).height();//页面高度 return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数 }
--css3方式--
1:不需要計算,瀏覽器自動計算,只要設定1列寬,效能高2 :列寬隨著瀏覽器寬口大小改變,使用者體驗不好;
3:圖片排序依照垂直順序排列,打亂圖片顯示順序
4.圖片載入還是需要js
--js方式--
js實現的瀑布流不會有上面的缺點,但是性能相對要差!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...
