深入學(xué)習(xí)js瀑布流布局
本文實(shí)例為大家分享了js瀑布流布局學(xué)習(xí)資料,供大家參考,具體內(nèi)容如下
特點(diǎn):等寬不等高。
實(shí)現(xiàn)方式:Javascript/Jquery/CSS3多欄布局。
樣例網(wǎng)站:花瓣網(wǎng)-->分類
一、JS實(shí)現(xiàn)瀑布流
index.html:頁(yè)面結(jié)構(gòu)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>瀑布流布局</title>
<link rel="stylesheet" href="styles/layout.css">
</head>
<body>
<div id="main">
<div class="box"><div class="pic"><img src="../waterFall/pic/0.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/1.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/2.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/3.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/4.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/5.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/6.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/7.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/8.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/9.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/10.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/11.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/12.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/13.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/14.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/15.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/16.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/17.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/18.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/19.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/20.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/21.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/22.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/23.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/24.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/25.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/26.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/27.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/28.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/29.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/30.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/31.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/32.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/33.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/34.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/35.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/36.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/37.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/38.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/39.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/40.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/41.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/42.jpg" alt=""></div></div>
<div class="box"><div class="pic"><img src="../waterFall/pic/43.jpg" alt=""></div></div>
</div>
<script src="scripts/waterfall.js"></script>
</body>
</html>
layout.css:頁(yè)面元素樣式
*{
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;
}
waterfall.js
window.onload=function(){
waterFall('main','box');
//模擬后臺(tái)相應(yīng)數(shù)據(jù)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){
//將數(shù)據(jù)塊渲染到當(dāng)前頁(yè)面的尾部
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;//清空數(shù)據(jù)塊,防止無(wú)限加載
waterFall('main','box');//對(duì)頁(yè)面新元素進(jìn)行布局渲染
}
}
}
function waterFall(parent,box){
//將main下的class為box的所有元素取出來(lái)
var oParent=document.getElementById(parent);
var oBoxs=getByClass(oParent,box);
console.log(oBoxs.length);
//計(jì)算整個(gè)頁(yè)面顯示的列數(shù)(頁(yè)面寬/box寬)
var oBoxW=oBoxs[0].offsetWidth;
// console.log(oBoxW);
var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
// console.log(cols);
//設(shè)置main的寬
oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;"
var hArr=[];//存放每列高度的數(shù)組
for(var i=0;i<oBoxs.length;i++){
if(i<cols){
hArr.push(oBoxs[i].offsetHeight);
}else{
var minH=Math.min.apply(null,hArr);//獲取當(dāng)前數(shù)組最小高度值
// console.log(minH);
var index=getMinhIndex(hArr,minH);//獲取數(shù)組最小高度的索引
//console.log(index);
oBoxs[i].style.position="absolute";//將之后的圖片依次絕對(duì)定位
oBoxs[i].style.top=minH+"px";
oBoxs[i].style.left=index*oBoxW+"px";//計(jì)算新圖片所在的位置并賦值
hArr[index]+=oBoxs[i].offsetHeight;//變化數(shù)組列的高度值,因?yàn)榧由狭艘粡垐D片
}
//console.log(hArr);
}
}
//根據(jù)class獲取元素
function getByClass(parent,clsName){
var boxArr=new Array(),//用來(lái)存儲(chǔ)獲取到的所有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;
}
}
}
//檢測(cè)是否具備滾動(dòng)條加載數(shù)據(jù)塊條件
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;//混雜模式和標(biāo)準(zhǔn)模式下的scrollTop獲取
//console.log(scrollTop);
var height=document.body.clientHeight||document.documentElement.clientHeight;//混雜模式和標(biāo)準(zhǔn)模式下的瀏覽器窗口高度獲取
return (lastBoxH<scrollTop+height)?true:false;//檢測(cè)最后一個(gè)box高度是否小于滾動(dòng)高度+窗口高度,返回布爾值
}
二、JQuery
$( 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 父級(jí)id
pin 元素id
*/
function waterfall(parent,pin){
var $aPin = $( "#main>div" );
var iPinW = $aPin.eq( 0 ).width();// 一個(gè)塊框pin的寬
var num = Math.floor( $( window ).width() / iPinW );//每行中能容納的pin個(gè)數(shù)【窗口寬度除以一個(gè)塊框?qū)挾取?
//oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//設(shè)置父級(jí)居中樣式:定寬+自動(dòng)水平外邊距
$( "#main" ).css({
'width:' : iPinW * num,
'margin': '0 auto'
});
var pinHArr=[];//用于存儲(chǔ) 每列中的所有塊框相加的高度。
$aPin.each( function( index, value ){
var pinH = $aPin.eq( index ).height();
if( index < num ){
pinHArr[ index ] = pinH; //第一行中的num個(gè)塊框pin 先添加進(jìn)數(shù)組pinHArr
}else{
var minH = Math.min.apply( null, pinHArr );//數(shù)組pinHArr中的最小值minH
var minHIndex = $.inArray( minH, pinHArr );
$( value ).css({
'position': 'absolute',
'top': minH + 15,
'left': $aPin.eq( minHIndex ).position().left
});
//數(shù)組 最小高元素的高 + 添加上的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);//創(chuàng)建【觸發(fā)添加塊框函數(shù)waterfall()】的高度:最后一個(gè)塊框的距離網(wǎng)頁(yè)頂部+自身高的一半(實(shí)現(xiàn)未滾到底就開始加載)
var scrollTop = $( window ).scrollTop()//注意解決兼容性
var documentH = $( document ).height();//頁(yè)面高度
return (lastPinH < scrollTop + documentH ) ? true : false;//到達(dá)指定高度后 返回true,觸發(fā)waterfall()函數(shù)
}
三、CSS多欄布局
.container{
-webkit-column-width:160px;
-moz-column-width:160px;
-webkit-column-gap:5px;
-moz-column-gap:5px;
}
/*數(shù)據(jù)塊 磚塊*/
.container div{width:160px;
margin:4px 0;}
【css3和js實(shí)現(xiàn)方法比較】
--css3方式--
1:不需要計(jì)算,瀏覽器自動(dòng)計(jì)算,只需設(shè)置1列寬,性能高
2:列寬隨著瀏覽器寬口大小進(jìn)行改變,用戶體驗(yàn)不好;
3:圖片排序按照垂直順序排列,打亂圖片顯示順序
4.圖片加載還是需要js
--js方式--
js實(shí)現(xiàn)的瀑布流不會(huì)有上面的缺點(diǎn),但是性能相對(duì)要差!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生js實(shí)現(xiàn)瀑布流布局
- 純js實(shí)現(xiàn)瀑布流布局及ajax動(dòng)態(tài)新增數(shù)據(jù)
- javascript瀑布流布局實(shí)現(xiàn)方法詳解
- 基于JavaScript實(shí)現(xiàn)瀑布流布局(二)
- JavaScript實(shí)現(xiàn)瀑布流布局
- 原生JavaScript實(shí)現(xiàn)瀑布流布局
- 原生JS實(shí)現(xiàn)美圖瀑布流布局賞析
- 原生JS實(shí)現(xiàn)響應(yīng)式瀑布流布局
- 解析瀑布流布局:JS+絕對(duì)定位的實(shí)現(xiàn)
- JavaScript瀑布流布局實(shí)現(xiàn)代碼
相關(guān)文章
javascript 節(jié)點(diǎn)排序?qū)崿F(xiàn)代碼
為了讓自定義選擇選擇出的節(jié)點(diǎn)集合盡可能接近原生API選出的結(jié)果,我們往往要對(duì)結(jié)果集進(jìn)行排序,此順序當(dāng)然是從上到下,從左到右的DOM樹順序。2011-01-01
微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果
這篇文章主要為大家詳細(xì)介紹了微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Javascript如何實(shí)現(xiàn)雙指控制圖片功能
這篇文章主要介紹了Javascript如何實(shí)現(xiàn)雙指控制圖片功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
js 用于檢測(cè)類數(shù)組對(duì)象的函數(shù)方法
下面小編就為大家?guī)?lái)一篇js 用于檢測(cè)類數(shù)組對(duì)象的函數(shù)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

