如何判断元素是否出现在可视区?
方法一:
1.通过document.documentElement.clientHeight || window.innerHeight 获取屏幕可视窗口高度
2.通过element.offsetTop获取元素相对于文档顶部的距离
3.通过document.documentElement.scrollTop || document.body.scrollTop 获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离
如果2 - 3 < 1成立,则元素在可视区域
1 | function isInSight1(el) { |
方法二:getBoundingClientRect()
这个方法返回一个名为ClientRect的DOMRect对象,包含了top、right、botton、left、width、height这些值。
1 | function isInSight2(el) { |
方法三:IntersectionObserver
这个API可以自动观察元素是否在视口内。
参考资料:
API Sketch for Intersection Observers
基本使用:
1 | var io = new IntersectionObserver(callback, option); |
callback的参数是一个数组,每个数组都是一个IntersectionObserverEntry对象,包括以下属性:
属性 | 描述 |
---|---|
time | 可见性发生变化的时间,单位为毫秒 |
rootBounds | 同getBoundingClientRect方法返回值相同 |
boundingClientRect | 目标元素的矩形区域信息 |
intersectionRect | 目标元素与视(或根元素)的交叉区域信息 |
intersectionRatio | 目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0 |
target | 被观察的目标元素 |
我们需要用到intersectionRatio来判断是否在可视区域内,当intersectionRatio > 0 && intersectionRatio <= 1即在可视区域内。
应用:实现图片懒加载
1 | // 替换img标签的src,加载图片资源 |