JavaScript實現(xiàn)無窮滾動加載數(shù)據(jù)
首先實現(xiàn)滾動要借助onscroll事件處理程序。
無窮滾動就是滑動滾動條,實現(xiàn)數(shù)據(jù)塊的無窮加載。
我們以瀑布流的布局來實現(xiàn)無窮加載。瀑布流就是一些等寬不等高的數(shù)據(jù)塊布局。在滾動條下拉時,它會進行加載。那么問題就是在判斷什么時候應該加載。
我們首先應該明白瀑布流布局的特點。它將下一個圖片總是放在當前列數(shù)最低的那一列。所以當加載最后一個藍色的圖片時,也就無疑是最后一個圖片了。所以要判斷該圖片加載到什么程度來觸發(fā)滾動事件。
圖上灰色的表示頁面的大小,后面藍色邊框表示窗口的大小。當拖動滾動條時,灰色部分上移。我們希望頁面最后一個圖片(藍色圖片)加載一半時觸發(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ù),待會兒會附上源碼
我們要進行加載的數(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ù)塊應該是從后臺傳過來的,在這里我們用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ù)返回一個布爾值,當為true時,觸發(fā)滾動事件。
window.onscroll = function(){ var oparent = document.getElementById('main'); //當滿足加載條件時,就要向頁面中加載數(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); //設置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; } //獲取當前最小值得下標 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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 當滾動條滾動到頁面底部自動加載增加內(nèi)容的js代碼
- js實現(xiàn)滾動條滾動到頁面底部繼續(xù)加載
- 基于AngularJS實現(xiàn)頁面滾動到底自動加載數(shù)據(jù)的功能
- JavaScript實現(xiàn)頁面滾動圖片加載(仿lazyload效果)
- 滑輪滾動到頁面底部ajax加載數(shù)據(jù)配合jsonp實現(xiàn)探討
- 原生Js頁面滾動延遲加載圖片實現(xiàn)原理及過程
- JS圖片根據(jù)鼠標滾動延時加載的實例代碼
- Angularjs 滾動加載更多數(shù)據(jù)
- 使用jQuery或者原生js實現(xiàn)鼠標滾動加載頁面新數(shù)據(jù)
- AngularJS基于ngInfiniteScroll實現(xiàn)下拉滾動加載的方法
相關文章
JavaScript實現(xiàn)簡單的隱藏式側(cè)邊欄功能示例
這篇文章主要介紹了JavaScript實現(xiàn)簡單的隱藏式側(cè)邊欄功能,涉及javascript結合定時器針對頁面元素屬性動態(tài)操作相關實現(xiàn)技巧,需要的朋友可以參考下2018-08-08javascript游戲開發(fā)之《三國志曹操傳》零部件開發(fā)(五)可移動地圖的實現(xiàn)
首先來說,我對游戲開發(fā)可以算是不怎么深入,因為現(xiàn)在的程序員愛用canvas,我卻就只會拿幾個div湊和。不過沒關系,因為做出來的同樣是游戲。哈!廢話最近有點多,感興趣的朋友可以了解下2013-01-01JavaScript中的公有、私有、特權和靜態(tài)成員用法分析
這篇文章主要介紹了JavaScript中的公有、私有、特權和靜態(tài)成員用法,以實例形式分析了其使用方法,簡單易懂,對于初學javascript的朋友具有不錯的學習與借鑒價值,需要的朋友可以參考下2014-11-11Javascript類型系統(tǒng)之String字符串類型詳解
這篇文章主要介紹了Javascript類型系統(tǒng)之String字符串類型詳解的相關資料,需要的朋友可以參考下2016-06-06