JS實(shí)現(xiàn)滾動(dòng)條觸底加載更多
原理
1.通過(guò)監(jiān)聽(tīng)滾動(dòng)區(qū)域DOM的scroll事件, 計(jì)算出觸底
// 滾動(dòng)可視區(qū)域高度 + 當(dāng)前滾動(dòng)位置 === 整個(gè)滾動(dòng)高度
scrollDom.clientHeight + scrollDom.scrollTop === scrollDom.scrollHeight
2.觸底后觸發(fā)列表添加, 列表添加使用createDocumentFragment, 將多次插入的DOM先存入內(nèi)存, 最后一次填充進(jìn)去, 提高性能, 也方便后面的MutationObserver監(jiān)聽(tīng)
3.使用MutationObserver監(jiān)聽(tīng)列表的DOM添加, 添加完畢后, 隱藏加載中提示
示例
https://codepen.io/klren0312/full/dybgayL

參考資料
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/clientHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollTop
https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalEventHandlers/onscroll
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragment
https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.hide {
display: none;
}
.scroll {
height: 200px;
width: 300px;
overflow-y: auto;
border: 1px solid #ddd;
}
.loading {
text-align: center;
}
ul {
margin: 0;
padding: 0;
}
li {
padding: 10px;
margin: 10px;
text-align: center;
background: #FFF6F6;
list-style-type: none;
}
</style>
</head>
<body>
<div id="js-scroll" class="scroll">
<ul id="js-list">
<li>000000</li>
<li>000000</li>
<li>000000</li>
<li>000000</li>
<li>000000</li>
</ul>
<div class="loading hide" id="js-loading">加載中...</div>
</div>
<script>
let index = 0 // 列表個(gè)數(shù)
const listDom = document.getElementById('js-list')
const loadingDom = document.getElementById('js-loading')
/**
* 使用MutationObserver監(jiān)聽(tīng)列表的 DOM 改變
*/
const config = {
attributes: true,
childList: true,
subtree: true
}
const callback = function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
if (index === 5) {
loadingDom.innerText = '加載完畢'
} else {
loadingDom.classList.add('hide')
}
}
}
}
const observer = new MutationObserver(callback)
observer.observe(listDom, config)
/**
* clientHeight 滾動(dòng)可視區(qū)域高度
* scrollTop 當(dāng)前滾動(dòng)位置
* scrollHeight 整個(gè)滾動(dòng)高度
*/
const scrollDom = document.getElementById('js-scroll')
scrollDom.onscroll = () => {
if (scrollDom.clientHeight + parseInt(scrollDom.scrollTop) === scrollDom.scrollHeight) {
if (loadingDom.classList.contains('hide') && index <= 5) {
loadingDom.classList.remove('hide')
addList()
}
if (index >= 5) {
observer.disconnect() // 加載完畢停止監(jiān)聽(tīng)列表 DOM 變化
}
}
}
/**
* 添加列表
*/
function addList () {
const fragment = document.createDocumentFragment()
setTimeout(() => {
++index
for (let i = 0; i < 5; i++) {
const li = document.createElement('li')
li.innerText = new Array(6).fill(index).join('')
fragment.appendChild(li)
}
listDom.appendChild(fragment)
} , 1000)
}
</script>
</body>
</html>
總結(jié)
以上所述是小編給大家介紹的JS實(shí)現(xiàn)滾動(dòng)條觸底加載更多,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
javascript中強(qiáng)制執(zhí)行toString()具體實(shí)現(xiàn)
Javascript通常會(huì)根據(jù)方法或運(yùn)算符的需要而自動(dòng)把值轉(zhuǎn)成所需的類(lèi)型,這可能導(dǎo)致各種錯(cuò)誤,接下來(lái)為大家介紹下javascript如何強(qiáng)制執(zhí)行toString(),感興趣的朋友可以參考下哈2013-04-04
深入淺析JavaScript的API設(shè)計(jì)原則
這篇文章主要介紹了JavaScript的API設(shè)計(jì)原則,包括接口的流暢性,一致性,參數(shù)的處理,可擴(kuò)展性,對(duì)錯(cuò)誤的處理,可預(yù)見(jiàn)性,注釋和文檔的可讀性,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06
JavaScript 數(shù)組展平方法: flat() 和 flatMap()詳解
從 ES2019 中開(kāi)始引入了一種扁平化數(shù)組的新方法,可以展平任何深度的數(shù)組,這篇文章主要介紹了JavaScript 數(shù)組展平方法: flat() 和 flatMap()詳解,需要的朋友可以參考下2023-06-06
在JavaScript中對(duì)HTML進(jìn)行反轉(zhuǎn)義詳解
下面小編就為大家?guī)?lái)一篇在JavaScript中對(duì)HTML進(jìn)行反轉(zhuǎn)義詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
JavaScript中this關(guān)鍵字使用方法詳解
JavaScript中this關(guān)鍵字使用方法詳解...2007-03-03
微信小程序通過(guò)一個(gè)json實(shí)現(xiàn)分享朋友圈圖片
這篇文章主要給大家介紹了關(guān)于微信小程序通過(guò)一個(gè)json實(shí)現(xiàn)分享朋友圈圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
JavaScript Event學(xué)習(xí)第八章 事件的順序
在第一章中我提到一個(gè)初次看起來(lái)可能不是那么好理解的是一個(gè)問(wèn)題:“如果一個(gè)元素和他的父元素對(duì)于同樣的事件都有事件處理程序,那么哪個(gè)會(huì)首先執(zhí)行呢?”毫無(wú)疑問(wèn),看是什么瀏覽器。2010-02-02
微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件,滾動(dòng)導(dǎo)航效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

