JS实现滚动条触底加载更多
原理
1.通过监听滚动区域DOM的scroll事件, 计算出触底
// 滚动可视区域⾼度 + 当前滚动位置 === 整个滚动⾼度
scrollDom.clientHeight + scrollDom.scrollTop === scrollDom.scrollHeight
2.触底后触发列表添加, 列表添加使⽤createDocumentFragment, 将多次插⼊的DOM先存⼊内存, 最后⼀次填充进去, 提⾼性能,也⽅便后⾯的MutationObserver监听
3.使⽤MutationObserver监听列表的DOM添加, 添加完毕后, 隐藏加载中提⽰
⽰例
参考资料
代码
<!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 // 列表个数
const listDom = ElementById('js-list')
const loadingDom = ElementById('js-loading')
/**
* 使⽤MutationObserver监听列表的 DOM 改变
*/
const config = {
attributes: true,
childList: true,
subtree: true
}
const callback = function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (pe === 'childList') {
if (index === 5) {
loadingDom.innerText = '加载完毕'
} else {
loadingDom.classList.add('hide')
}
}
}
}
const observer = new MutationObserver(callback)
observer.observe(listDom, config)
/**
* clientHeight 滚动可视区域⾼度
* scrollTop 当前滚动位置
* scrollHeight 整个滚动⾼度
*/
const scrollDom = ElementById('js-scroll')
if (scrollDom.clientHeight + parseInt(scrollDom.scrollTop) === scrollDom.scrollHeight) {
if (ains('hide') && index <= 5) {
ve('hide')
addList()
}
if (index >= 5) {
observer.disconnect() // 加载完毕停⽌监听列表 DOM 变化
}
}
}
/**
* 添加列表
*/
js控制滚动条
function addList () {
const fragment = ateDocumentFragment()
setTimeout(() => {
++index
for (let i = 0; i < 5; i++) {
const li = ateElement('li')
li.innerText = new Array(6).fill(index).join('')
fragment.appendChild(li)
}
listDom.appendChild(fragment)
} , 1000)
}
</script>
</body>
</html>
总结
以上所述是⼩编给⼤家介绍的JS实现滚动条触底加载更多,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。