利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果
今天學(xué)習(xí)了一個(gè)瀑布流加載效果,很多網(wǎng)站都有瀑布流效果,瀑布流就是很多產(chǎn)品顯示在網(wǎng)頁(yè)上,寬相同,高度不同,表現(xiàn)為多欄布局,隨著頁(yè)面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。
原理是:
1.設(shè)定一行中的列數(shù);
2.取第一行中每一個(gè)div的高度并把每一個(gè)高度放進(jìn)一個(gè)數(shù)組中;
3.算出數(shù)組中最小高度的index值;
4.把第二行的第一個(gè)div放到最小高度的div的下方并把重新算出的高度值放進(jìn)數(shù)組中,重新計(jì)算最小高度的index值;
5.以此類(lèi)推實(shí)現(xiàn)多欄布局的瀑布流效果;
6.如果最后一張div的高度已滾動(dòng)出現(xiàn)在底部時(shí)創(chuàng)建新的div添加到最后一張的后面,不斷循環(huán)以達(dá)到加載效果;接下來(lái)代碼實(shí)現(xiàn)。
<div id="main">
<div class="box">
<div class="Pic">
<img src="images/0.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/1.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/2.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/3.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/4.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/5.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/6.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/7.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/8.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/9.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/10.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/11.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/12.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/13.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/14.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/15.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/16.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/17.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/18.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/19.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/20.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/21.jpg" alt="" />
</div>
</div>
<div class="box">
<div class="Pic">
<img src="images/22.jpg" alt="" />
</div>
</div>
</div>
*{padding: 0;margin: 0;}
#main{
width: 1000px;
margin: 0 auto;
position: relative;
}
.box{
display: inline-block;
float: left;
padding: 10px 0 0 10px;
}
.Pic{
border: 1px #ccc solid;
padding: 10px;
border-radius: 8px;
}
.Pic img{
width: 162px;
}
js代碼:
<script>
window.onload=function(){
waterFall('main','box');
var dataInt={
"data":[{"src":"0.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"}]
};
/*滾動(dòng)條滾動(dòng)時(shí)觸發(fā)的事件*/
window.onscroll=function(){
if(checkIsSlide()){ //結(jié)果返回是true則執(zhí)行
var omain=document.getElementById('main');
/*添加div到頁(yè)面上*/
for(var l=0;l<dataInt.data.length;l++){
var box=document.createElement('div');
box.className="box";
omain.appendChild(box);
var pic=document.createElement('div');
pic.className='Pic';
box.appendChild(pic);
var oimg=document.createElement('img');
oimg.src="images/"+dataInt.data[l].src;
pic.appendChild(oimg);
}
waterFall('main','box'); //新添加的div都要重新執(zhí)行waterFall方法,以實(shí)現(xiàn)瀑布流效果
}
}
}
/*實(shí)現(xiàn)瀑布流效果,多欄布局*/
function waterFall(parent,pid){ //傳兩個(gè)參數(shù),父元素parent和子元素pid
var oparent=document.getElementById(parent); //獲取父元素
var opid=getClass(oparent,pid); //獲取父元素下的classname為pid的所有子元素
var cols=Math.floor(oparent.offsetWidth/opid[0].offsetWidth); //父元素寬度/一個(gè)子元素的寬度,即一行的列數(shù)
var arrH=[]; //存放每一列的高度的數(shù)組
for(var j=0;j<opid.length;j++){
if(j<cols){
arrH.push(opid[j].offsetHeight);//把第一行的高度都放進(jìn)數(shù)組中
}else{ //第二行開(kāi)始
var minH=Math.min.apply(null,arrH); //計(jì)算arrH的最小值
var Index=getHIndex(arrH,minH); //使用getHIndex方法獲取最小值的index值
/*把之后的div放到最小值div的下方*/
opid[j].style.position='absolute';
opid[j].style.top=minH+'px';
opid[j].style.left=opid[0].offsetWidth*Index+'px';
arrH[Index]+=opid[j].offsetHeight; //數(shù)組中的最小值加上已放在下方的div的高度值并重新循環(huán)
}
}
}
/*獲取父元素下的classname為cls的所有元素*/
function getClass(parent,cls){
var obj=parent.getElementsByTagName('*');
var Clsarr=[];
for(var i=0;i<obj.length;i++){
if(obj[i].className==cls){
Clsarr.push(obj[i]);
}
}
return Clsarr;
}
/*獲取arr數(shù)組中的最小值minH的Index值*/
function getHIndex(arr,minH){
for(var k=0;k<arr.length;k++){
if(arr[k]==minH){
return k;
}
}
}
/*判斷當(dāng)前滾動(dòng)的高度時(shí)候大于最后的div出現(xiàn)在底部的高度值,即是否要加載*/
function checkIsSlide(){
var omain=document.getElementById('main');
var obox=getClass(omain,'box');
var lastTop=obox[obox.length-1].offsetTop+Math.floor(obox[obox.length-1].offsetHeight/2);
var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
var documentH=document.documentElement.clientHeight;
return (lastTop)<(scrollTop+documentH)?true:false;
}
</script>
效果圖如下:

以上所述是小編給大家介紹的利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- js圖片加載效果實(shí)例代碼(延遲加載+瀑布流加載)
- JavaScript實(shí)現(xiàn)瀑布流以及加載效果
- javascript實(shí)現(xiàn)瀑布流動(dòng)態(tài)加載圖片原理
- javascript實(shí)現(xiàn)仿百度圖片的瀑布流加載效果
- JavaScript實(shí)現(xiàn)圖片自動(dòng)加載的瀑布流效果
- 解析javascript瀑布流原理實(shí)現(xiàn)圖片滾動(dòng)加載
- javascript瀑布流式圖片懶加載實(shí)例解析與優(yōu)化
- javascript瀑布流式圖片懶加載實(shí)例
- javascript實(shí)現(xiàn)瀑布流加載圖片原理
- js實(shí)現(xiàn)動(dòng)態(tài)加載數(shù)據(jù)瀑布流
相關(guān)文章
JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法,結(jié)合實(shí)例形式分析了javascript提示此類(lèi)異常的常見(jiàn)原因與相關(guān)解決方法,需要的朋友可以參考下2016-08-08
JS?getRandomValues和Math.random方法深入解析
這篇文章主要為大家介紹了JS?getRandomValues和Math.random方法深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
不使用ajax實(shí)現(xiàn)無(wú)刷新提交表單
這篇文章主要介紹了不使用ajax實(shí)現(xiàn)無(wú)刷新提交表單的方法,需要的朋友可以參考下2014-12-12
javascript 判斷中文字符長(zhǎng)度的函數(shù)代碼
在很多時(shí)候,我們?cè)谶M(jìn)行數(shù)據(jù)提交數(shù)據(jù)庫(kù)時(shí).先會(huì)用javascript對(duì)其進(jìn)行有效性驗(yàn)證.如一個(gè)中文javascript為的length是1.但是數(shù)據(jù)庫(kù)中會(huì)占二個(gè)字節(jié).容易出錯(cuò)2012-08-08
javascript full screen 全屏顯示頁(yè)面元素的方法
要想讓頁(yè)面的某個(gè)元素全屏顯示,就像在網(wǎng)頁(yè)上看視頻的時(shí)候,可以全屏觀看一樣,該怎么實(shí)現(xiàn)呢2013-09-09

