因爲網頁的執行都是單線程的,在JS執行的過程當中,頁面會呈現阻塞狀態。所以,若是JS處理的數據量過大,過程複雜,可能會形成頁面的卡頓。傳統的數據展示都以分頁的形式,可是分頁的效果並很差,須要用戶手動點擊下一頁,才能看到更多的內容。javascript
有不少網站使用 無限分頁 的模式,即網頁視窗到達內容底部就自動加載下一部分的內容...css
本篇就無限分頁的實現模型,講述其中奧妙。html
實現無限分頁的過程大體以下:java
1 視窗滾動到底部jquery
2 觸發加載,添加到現有內容的後面。瀏覽器
所以,可能會出現兩種狀況:app
1 當頁面的內容不多,沒有出現滾動條。ide
2 當頁面的內容不少,出現了滾動條。post
針對這兩種狀況,須要理解幾個概念:測試
scrollHeight即真實內容的高度;
clientHeight比較好理解,是視窗的高度,就是咱們在瀏覽器中所能看到內容的高度;
scrollTop是視窗上面隱藏掉的部分。
實現的思路:
1 若是真實的內容比視窗高度小,則一直加載到超過視窗
2 若是超過了視窗,則判斷下面隱藏的部分的距離是否小於必定的值,若是是,則觸發加載。(即滾動到了底部)
代碼部分沒有太多的內容,須要注意的是:
1 使用fixed定位加載框
2 使用setTimeout定時觸發判斷方法,頻率能夠自定義
3 經過 真實內容高度 - 視窗高度 - 上面隱藏的高度 < 20,做爲加載的觸發條件
<!DOCTYPE html> <html> <head> <title>無限翻頁測試</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <style type="text/css"> #spinner{ position: fixed; top: 20px; left: 40%; display: block; color: red; font-weight: 900; background-color: rgba(80, 80, 90, 0.22); padding-top: 20px; padding-bottom: 20px; padding-left: 100px; padding-right: 100px; border-radius: 15px; } </style> </head> <body> <div id="sample"> </div> <div id="spinner"> 正在加載 </div> <script type="text/javascript"> var index = 0; function lowEnough(){ var pageHeight = Math.max(document.body.scrollHeight,document.body.offsetHeight); var viewportHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0; var scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; // console.log(pageHeight); // console.log(viewportHeight); // console.log(scrollHeight); return pageHeight - viewportHeight - scrollHeight < 20; } function doSomething(){ var htmlStr = ""; for(var i=0;i<10;i++){ htmlStr += "這是第"+index+"次加載<br>"; } $('#sample').append(htmlStr); index++; pollScroll();//繼續循環 $('#spinner').hide(); } function checkScroll(){ if(!lowEnough()) return pollScroll(); $('#spinner').show(); setTimeout(doSomething,900); } function pollScroll(){ setTimeout(checkScroll,1000); } checkScroll(); </script> </body> </html>
最開始沒有滾動滾動條時,上面隱藏的部分爲0,視窗的高度是667(這個值是一直不變的),內容的高度爲916
當向下滾動了一下後,視窗的高度不變;上面隱藏的高度增長到100,即滾動條上面表明的部分。
當觸發加載後,視窗的高度保持變;上面隱藏的高度保持不變;文本的內容增長到1816;
【1】height、clientHeight、scrollHeight、offsetHeight區別
【2】ScrollHeight、OffsetHeight、ClientHeight
【4】《JS修煉之道》