可以监测某个元素是否进入 视口 viewport(即用户是否能看到这个元素)的一个可靠且高性能的接口。
作用
- 图片懒加载
- 当图片滚动到可见时才进行加载
- 内容无限滚动
- 也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉
- 检测广告的曝光情况
- 为了计算广告收益,需要知道广告元素的曝光情况
-
传统实现方法
对
scroll
事件绑定处理函数调用目标元素的
getBoundingClientRect()
- 得到目标元素对应 viewport 左上角坐标,判断是否在 viewport
缺点
scroll 事件密集发生(事件监听和调用都在主线程上运行),产生大量计算,容易造成性能问题。这种检测方式极其怪异且不优雅。使用方法
var options = {
root: document.querySelect('#scrollArea'),
rootMargin: '0px',
threshold: 1.0
}
var observer = new IntersectionObserver(callback, option);
callback
回调函数一般会触发两次,一次是目标元素刚进入根元素,别一次是完全离开根元素。
回调函数会在主线程中执行。参数
- 得到目标元素对应 viewport 左上角坐标,判断是否在 viewport
entries IntersectionObserverEntry[] 对象数组
- IntersectionObserverEntry
- boundingClinentRect 目标元素的矩形区域的信息
- intersetionRatio 目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0
- intersectioniRect 目标元素与视口(或根元素)的交叉区域的信息
- isIntersecting
- rootBounds 根元素的矩形区域的信息,可以用getBoundingClientRect()方法得到,如果没有根元素(即直接相对于视口滚动),则返回null
- target 被观察的目标元素,是一个 DOM 节点对象
- time 监听器元素的持续时间
- IntersectionObserverEntry
-
Intersection observer options
options 对象有以下的属性
root 根元素 (目标元素的父级元素)
- 用于检查目标的可见标。
- 默认为 viewport
- rootMargin 根元素外边距 (类似 CSS 的 margin 属性,可以设置为 ‘10px 20px 30px 40px’)
- 用于控制根元素每一边的收缩或扩张
- 默认为 0
- threshold 阈值 (可以设置 number 或 number[])
- 目标元素出现多少在根元素可见时,回调函数才会被执行
- 0 为一出现像素就立即触发回调,1.0 为目标元素完全出现在要根元素才触发回调
- 设置为数组时,是当出现数组的某一值时就触发一次回调函数
- 默认为 0
兼容性
如果还有 IE 的话,还是用传统实现方法