JavaScript實(shí)現(xiàn)無窮滾動加載數(shù)據(jù)
首先實(shí)現(xiàn)滾動要借助onscroll事件處理程序。
無窮滾動就是滑動滾動條,實(shí)現(xiàn)數(shù)據(jù)塊的無窮加載。
我們以瀑布流的布局來實(shí)現(xiàn)無窮加載。瀑布流就是一些等寬不等高的數(shù)據(jù)塊布局。在滾動條下拉時,它會進(jìn)行加載。那么問題就是在判斷什么時候應(yīng)該加載。
我們首先應(yīng)該明白瀑布流布局的特點(diǎn)。它將下一個圖片總是放在當(dāng)前列數(shù)最低的那一列。所以當(dāng)加載最后一個藍(lán)色的圖片時,也就無疑是最后一個圖片了。所以要判斷該圖片加載到什么程度來觸發(fā)滾動事件。
圖上灰色的表示頁面的大小,后面藍(lán)色邊框表示窗口的大小。當(dāng)拖動滾動條時,灰色部分上移。我們希望頁面最后一個圖片(藍(lán)色圖片)加載一半時觸發(fā)滾動事件。那么就要形成參照。
下來寫代碼:
//檢測是否具備滾動條加載數(shù)據(jù)塊的條件 function checkScrollSlide(){ var oparent = document.getElementById('main'); var oBoxs = getByClass(oparent,'box'); var scrollH = document.body.scrollTop || document.documentElement.scrollTop + document.body.clientHeight || document.documentElement.clientHeight; var lastBoxH = oBoxs[oBoxs.length - 1].offsetTop + Math.floor(oBoxs[oBoxs.length - 1].offsetHeight/2); return (lastBoxH < scrollH )? true : false; }
getClass是根據(jù)類名查找元素集合的自己寫的函數(shù),待會兒會附上源碼
我們要進(jìn)行加載的數(shù)據(jù)塊的格式是這樣的.每個圖片被一個class= pic的div包裹。最后整體屬于父元素main
<div id = "main"> <div class = "box"> <div class = "pic"> <img src = "images/0.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/1.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/2.jpg"> </div> </div> <div>
首先我們要加載的數(shù)據(jù)塊應(yīng)該是從后臺傳過來的,在這里我們用json模擬一下就可以:
var DataIn = {"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'},{"src":'4.jpg'},{"src":'5.jpg'}]};
比如這個就是后臺傳過來的數(shù)據(jù)。
上面的函數(shù)返回一個布爾值,當(dāng)為true時,觸發(fā)滾動事件。
window.onscroll = function(){ var oparent = document.getElementById('main'); //當(dāng)滿足加載條件時,就要向頁面中加載數(shù)據(jù)塊 if(checkScrollSlide){ for(var i = 0; i< DataIn.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 oImg = document.createElement('img'); oImg.src = './images/'+DataIn.data[i].src; opic.appendChild(oImg); } waterFull('main','box'); } } }
附上源碼:
css和html
<!DOCTYPE html> <html> <head> <meta charset = "utf-8" /> <script src = "./jswaterfll.js"></script> <title>瀑布流布局</title> <style type="text/css"> *{ padding: 0px; margin: 0px; } #main{ position: relative; } .box{ /* display: inline-block;*/ padding: 15px 0px 0px 15px; float: left; } .pic{ padding: 10px; border-radius: 5px; border:1px solid #ccc; box-shadow: 0 0 5px #ccc; } .pic img{ width: 165px; height: auto; } </style> </head> <body> <div id = 'main'> <div class = "box"> <div class = "pic"> <img src = "images/3.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/4.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/20.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/21.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/2.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/3.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/4.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/5.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/6.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/7.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/8.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/9.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/10.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/11.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/17.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/18.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/19.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/4.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/5.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/6.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/7.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/8.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/11.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/12.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/13.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/14.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/15.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/16.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/17.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/18.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/19.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/20.jpg"> </div> </div> <div class = "box"> <div class = "pic"> <img src = "images/21.jpg"> </div> </div> </div> </body> </html>
js代碼:
window.onload = function(){ waterFull('main','box'); var DataIn = {"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'},{"src":'4.jpg'},{"src":'5.jpg'}]}; window.onscroll = function(){ var oparent = document.getElementById('main'); if(checkScrollSlide){ for(var i = 0; i< DataIn.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 oImg = document.createElement('img'); oImg.src = './images/'+DataIn.data[i].src; opic.appendChild(oImg); } waterFull('main','box'); } } } function waterFull(parent,children){ var oParent = document.getElementById(parent); //var oBoxs = parent.querySelectorAll(".box"); var oBoxs = getByClass(oParent,children); //計算整個頁面顯示的列數(shù) var oBoxW = oBoxs[0].offsetWidth; var cols = Math.floor(document.documentElement.clientWidth/oBoxW); //設(shè)置main的寬度,并且居中 oParent.style.cssText = 'width:'+oBoxW * cols +'px; margin: 0 auto'; //找出高度最小的圖片,將下一個圖片放在下面 //定義一個數(shù)組,存放每一列的高度,初始化存的是第一行的所有列的高度 var arrH = []; for(var i = 0; i< oBoxs.length ; i++){ if(i < cols){ arrH.push(oBoxs[i].offsetHeight); } else{ var minH = Math.min.apply(null,arrH); var minIndex = getMinhIndex(arrH,minH); oBoxs[i].style.position = 'absolute'; oBoxs[i].style.top= minH + 'px'; //oBoxs[i].style.left = minIndex * oBoxW + 'px'; oBoxs[i].style.left = oBoxs[minIndex].offsetLeft+'px'; arrH[minIndex] += oBoxs[i].offsetHeight; } } } function getByClass(parent,className){ var boxArr = new Array();//用來獲取所有class為box的元素 oElement = parent.getElementsByTagName('*'); for (var i = 0; i <oElement.length; i++) { if(oElement[i].className == className){ boxArr.push(oElement[i]); } }; return boxArr; } //獲取當(dāng)前最小值得下標(biāo) function getMinhIndex(array,min){ for(var i in array){ if(array[i] == min) return i; } } //檢測是否具備滾動條加載數(shù)據(jù)塊的條件 function checkScrollSlide(){ var oparent = document.getElementById('main'); var oBoxs = getByClass(oparent,'box'); var scrollH = document.body.scrollTop || document.documentElement.scrollTop + document.body.clientHeight || document.documentElement.clientHeight; var lastBoxH = oBoxs[oBoxs.length - 1].offsetTop + Math.floor(oBoxs[oBoxs.length - 1].offsetHeight/2); return (lastBoxH < scrollH )? true : false; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 當(dāng)滾動條滾動到頁面底部自動加載增加內(nèi)容的js代碼
- js實(shí)現(xiàn)滾動條滾動到頁面底部繼續(xù)加載
- 基于AngularJS實(shí)現(xiàn)頁面滾動到底自動加載數(shù)據(jù)的功能
- JavaScript實(shí)現(xiàn)頁面滾動圖片加載(仿lazyload效果)
- 滑輪滾動到頁面底部ajax加載數(shù)據(jù)配合jsonp實(shí)現(xiàn)探討
- 原生Js頁面滾動延遲加載圖片實(shí)現(xiàn)原理及過程
- JS圖片根據(jù)鼠標(biāo)滾動延時加載的實(shí)例代碼
- Angularjs 滾動加載更多數(shù)據(jù)
- 使用jQuery或者原生js實(shí)現(xiàn)鼠標(biāo)滾動加載頁面新數(shù)據(jù)
- AngularJS基于ngInfiniteScroll實(shí)現(xiàn)下拉滾動加載的方法
相關(guān)文章
JavaScript實(shí)現(xiàn)簡單的隱藏式側(cè)邊欄功能示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡單的隱藏式側(cè)邊欄功能,涉及javascript結(jié)合定時器針對頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08javascript游戲開發(fā)之《三國志曹操傳》零部件開發(fā)(五)可移動地圖的實(shí)現(xiàn)
首先來說,我對游戲開發(fā)可以算是不怎么深入,因?yàn)楝F(xiàn)在的程序員愛用canvas,我卻就只會拿幾個div湊和。不過沒關(guān)系,因?yàn)樽龀鰜淼耐瑯邮怯螒?。哈!廢話最近有點(diǎn)多,感興趣的朋友可以了解下2013-01-01JavaScript中的公有、私有、特權(quán)和靜態(tài)成員用法分析
這篇文章主要介紹了JavaScript中的公有、私有、特權(quán)和靜態(tài)成員用法,以實(shí)例形式分析了其使用方法,簡單易懂,對于初學(xué)javascript的朋友具有不錯的學(xué)習(xí)與借鑒價值,需要的朋友可以參考下2014-11-11詳解JavaScript正則表達(dá)式之RegExp對象
這篇文章主要介紹了JavaScript正則表達(dá)式之RegExp對象,對RegExp對象的基本使用方法,以及各種方法進(jìn)行整理,感興趣的小伙伴們可以參考一下2015-12-12Javascript類型系統(tǒng)之String字符串類型詳解
這篇文章主要介紹了Javascript類型系統(tǒng)之String字符串類型詳解的相關(guān)資料,需要的朋友可以參考下2016-06-0620條學(xué)習(xí)javascript的編程規(guī)范的建議
本文總結(jié)了20條javascript的編程規(guī)范,都是平時項(xiàng)目中使用的時候需要注意的地方,這里推薦給大家,如對大家有所幫助,那便是極好的了。2014-11-11JavaScript運(yùn)動框架 鏈?zhǔn)竭\(yùn)動到完美運(yùn)動(五)
這篇文章主要為大家詳細(xì)介紹了JavaScript運(yùn)動框架的第五部分,鏈?zhǔn)竭\(yùn)動到完美運(yùn)動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05