移动端⽆限滚动加载js实现原理
由于⽹页的执⾏都是单线程的,在JS执⾏的过程中,页⾯会呈现阻塞状态。因此,如果JS处理的数据量过⼤,过程复杂,可能会造成页⾯的卡顿。传统的数据展现都以分页的形式,但是分页的效果并不好,需要⽤户⼿动点击下⼀页,才能看到更多的内容。有很多⽹站使⽤⽆限分页的模式,即⽹页视窗到达内容底部就⾃动加载下⼀部分的内容...
实现⽆限分页的过程⼤致如下:
1 视窗滚动到底部;
2 触发加载,添加到现有内容的后⾯。
因此,可能会出现两种情况:
1 当页⾯的内容很少,没有出现滚动条;触发加载页⾯事件,直到加载到满⾜条件时停⽌加载;
2 当页⾯的内容很多,出现了滚动条。
针对这两种情况,需要理解⼏个概念:
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="apps.bdimg/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++){
js控制滚动条
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>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论