滚动加载,懒加载
滚动加载,懒加载的实现。
1. scroll计算
思路:通过滚动条判断是否到内容底部 => 到底部后向后台请求下一页得数据 => 将请求得新数据拼接在老数据上
三个关键点:
- 1:滚动条距离顶部的距离:
document.documentElement.scrollTop
||document.body.scrollTop
- 2:当前窗口内容的可视区域:
document.documentElement.clientHeight
||document.body.clientHeigh
- 3:滚动条内容的总高度:
document.documentElement.scrollHeight
||document.body.scrollHeight
需要注意的是,实际上,在js代码里,滚动条是被抽象为一个“点”来对待的。scrollHeight其实不是“滚动条的高度”,而是表示滚动条需要滚动的高度,即内部所有li的高度。而scrollTop表示滚动条(一个点)当前的位置在素有li高度里占了多少
项目实例
1 | let dataListDOM = document.getElementById('listUlContainer'); // 获取滚动内容父级元素,即容器DOM |
2. IntersectionObserver
在IntersectionObserver出世之前,要实现一个懒加载一般都需要大量计算scroll,这会引发性能问题,于是在2016年初,chrome51率先提供了一个新的API,即IntersectionObserver,它可以用来监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断。但是这毕竟是一个新兴API,所以各个浏览器
对其支持不太友好。点此查看各个浏览器对intersectionObserver的支持情况
正因为浏览器对该方法支持不太好,所以要想试用此方法最好加一个垫片,地址在此
有一点要记住:IntersectionObserver 不是完美精确到像素级别,也不是低延时性的,它是异步的。 使用它实现类似依赖滚动效果的动画注定会失败,因为回调函数被调用的时候那些数据——严格来说——已经过期了。
调用:
1 | var observer = new IntersectionObserver(callback, options); |
- callback: 当被监听元素的可见性变化时,触发的回调函数
- options: 配置参数,可传可不传,有默认属性值
下面先来看一个官方示例代码:
1 | //初始化一个实例 |
滚动加载示例
当实现列表滚动加载时,可在列表最后拼接一个元素(假设id为observer-dom),然后监听该元素,当离开页面或者不再需要滚动加载时可移除监听。
1 | var observe = new IntersectionObserver(function (entries) { |