在开发当中,某些情况下需要监控元素是否进入了指定位置,再进行数据加载操作(例如图片的懒加载、效果的初入播放等等),传统的方式主要以监听scroll事件为主,但是这样的方式对性能有一定的影响,现在出了一个草案提出了IntersectionObserver对象,这个对象可以帮助获取两个对象之间相交时的事件,而不需要通过计时、监听事件的方式进行处理
IntersectionObserver
简单例子

1 |
|
构造函数 IntersectionObserver(callback[, options])
IntersectionObserver的构造函数含有两个参数:callback
和options
callback: (entries, observer) => void
第一个参数为触发的回调函数,entries
是IntersectionObserverEntry
对象数组,observer
是触发的IntersectionObserver
观察者实例
回调的触发是收集的这段时间内触发阈值变化的内容,一个观察对象在这一次内跨过多个阈值只能产生一个entry
,多个观察对象跨越阈值则会产生多个entry

options
配置主要包含三个属性:root
、rootMargin
、threshold
其中root
设定的为监听对象的具体祖先元素(必须是观察对象的祖先元素,否则无效),这个默认为顶级文档的视图窗口
rootMargin
可以用于扩展或搜索root
的判断区域,例如"-30px -30px -30px -30px"
表示判断的边框向内收缩30px

threshold
表示的触发的阈值,这个可以是一个数值,也可以是一个数值数组,但是值必须在0~1
,触发时获取的比例不一定是触发的阈值
这三个选项也是IntersectionObserver
的属性,但是是只读的
实例函数
在创建了IntersectionObserver
对象后,它有observer(targetElement)
,unobserver(targetElement)
和disconnect()
,其中observer(targetElement)
,unobserver(targetElement)
用于绑定和解绑监听对象,disconnect()
用于结束对象的监听行为
IntersectionObserverEntry
IntersectionObserverEntry
对象,描述了目标元素与其根元素容器在某一特定过渡时刻的交叉状态,属性如下
属性名称 | 类型 | 描述 |
---|---|---|
boundingClientRect | DOMRectReadOnly | 目标元素的边界信息 |
rootBounds | DOMRectReadOnly | 观察者的根元素的边界信息 |
intersectionRect | DOMRectReadOnly | 根和目标元素的相交区域的边界信息 |
intersectionRatio | number | intersectionRect与boundingClientRect的比例值 |
isIntersecting | boolean | 根和目标元素是否相交 |
target | Element | 触发这个Entry的被观察元素 |
time | DOMHighResTimeStamp | IntersectionObserver的时间原点到交叉被触发的时间的时间戳 |
兼容性

总结
IntersectionObserver
主要用于监听子元素与祖先元素视图之间的交叉情况,从而实现对元素展现情况的捕获
注意点
1.intersectionRatio
为0不代表不想交,是否相交需要依靠isIntersecting
进行判断
参考资料
END
2019-07-12 完成
2019-01-17 立项