移動端無限滾動載入 js實現原理
由於網頁的執行都是單執行緒的,在JS
執行的過程中,頁面會呈現阻塞狀態。因此,如果JS
處理的資料量過大,過程複雜,可能會造成頁面的卡頓。傳統的資料展現都以分頁的形式,但是分頁的效果並不好,需要使用者手動點選下一頁,才能看到更多的內容。有很多網站使用無限分頁的模式,即網頁視窗到達內容底部就自動載入下一部分的內容…
實現無限分頁的過程大致如下:
- 視窗滾動到底部;
- 觸發載入,新增到現有內容的後面。
因此,可能會出現兩種情況:
- 當頁面的內容很少,沒有出現滾動條;觸發載入頁面事件,直到載入到滿足條件時停止載入;
- 當頁面的內容很多,出現了滾動條。
針對這兩種情況,需要理解幾個概念:
scrollHeight
即真實內容的高度;clientHeight
比較好理解,是視窗的高度,就是我們在瀏覽器中所能看到內容的高度;scrollTop
是視窗上面隱藏掉的部分。
實現的思路:
- 如果真實的內容比視窗高度小,則一直載入到超過視窗
- 如果超過了視窗,則判斷下面隱藏的部分的距離是否小於一定的值,如果是,則觸發載入。(即滾動到了底部)
程式碼樣例
程式碼部分沒有太多的內容,需要注意的是:
- 使用
fixed
定位載入框 - 使用setTimeout定時觸發判斷方法,頻率可以自定義
- 通過
真實內容高度 - 視窗高度 - 上面隱藏的高度 < 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>
相關文章
- 基於 Vue.js 的移動端元件庫mint-ui實現無限滾動載入更多Vue.js元件UI
- [譯] 使用 Angular 和 RxJS 實現的無限滾動載入AngularJS
- js瀑布流滾動無限載入(路徑需要修改)JS
- 原生JS利用transform實現banner的無限滾動JSORM
- 滾動載入圖片(懶載入)實現原理
- Vxe UI vxe-table 4.8+ 實現無限載入+虛擬滾動、行與列的無限載入UI
- [譯] Angular: 使用 RxJS Observables 來實現簡易版的無限滾動載入指令AngularJS
- 安卓中如何實現無限滾動列表安卓
- H5移動端獲獎無縫滾動動畫實現H5動畫
- 使用RecycleView實現無限滾動的日曆View
- 使用 laravel8 + ajax 實現無限滾動Laravel
- Xamarin.Forms: 無限滾動的ListView(懶載入方式)ORMView
- 婚戀交友原始碼開發,移動端滾動載入更多元件的實現原始碼元件
- 移動端實現內滾動的4種方案
- 10行程式碼實現頁面無限滾動行程
- Vue 無限滾動元件Vue元件
- “無限滾動載入”適用於你的產品嗎?
- 滾動優化(無限滾動載入、滾動元素內有大量dom,造成卡頓問題的優化方案)優化
- nodeJS 爬蟲,通過Puppeteer實現滾動載入NodeJS爬蟲
- [譯] 使用響應式程式設計來實現簡易版的無限滾動載入程式設計
- PHP+InfiniteScroll網頁無限滾動載入資料例項PHP網頁
- 設計無限滾動下拉載入,實踐高效能頁面真諦
- js滑鼠移動實現圖片立體滾動效果JS
- 走近Fusion元件——無限滾動元件
- Framework7 無限滾動Framework
- javascript無限迴圈滾動JavaScript
- 無限滾動的最佳實踐經驗
- angular 監聽 Windows 滾動事件 實現頁面滾動載入AngularWindows事件
- js實現 web頁面的滾動條下拉時載入更多JSWeb
- 移動端模擬滾動
- 90行程式碼,15個元素實現無限滾動行程
- 拖動滾動條實現內容自動載入效果
- 微信小程式實現滾動載入更多微信小程式
- django 實現滾動載入的功能薦Django
- 小程式:無限自動滾動的Gallery
- 移動端div跟隨滾動條滾動(自制
- 無限滾動HTML UL結構HTML
- 解決移動端滾動穿透穿透