IntersectionObserver API 小记

570 阅读2分钟

起因

今天朋友给我了一个无限滚动列表的例子,让我分析一波;给的源码来自掘金的大佬 的文章,在这里感谢大佬的分享。

IntersectionObserver

这个 API 的中文名称叫做 “交叉观察期”,意为被观察的元素与可视窗口是否有重合。这么说可能不是很清晰,其实就是检测被观察元素是否出现在屏幕上。

使用

它是一个构造函数,所以你要以下面的方式调用

const io = new IntersectionObserver(callback, options) 

实例 api

添加观察元素
io.observe(eleA)

// 观察多个元素
io.observe(eleA)
io.observe(eleB)
...
取消元素观察
io.unobserve(eleA)
关闭观察器
io.disconnect()

它接收两个参数 callbackoptions,下面来对参数进行具体的解析。

callback

回调函数会被调用两次,一次是元素开始进入视窗,另一次是元素完全离开视窗时。

回调函数接收一个参数 entries 表示的是被观察的进入可视区元素的数组,每个元素 IntersectionObserverEntry 的实现接口如下表:

名称 类型 介绍 备注
time number 可见性发生变化的时间,是一个高精度时间戳,单位为毫秒
target DomElement 被观察的目标元素,是一个 DOM 节点对象
rootBounds ClientRect 根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回null
boundingClientRect ClientRect 目标元素的矩形区域的信息
intersectionRect ClientRect 目标元素与视口(或根元素)的交叉区域的信息
intersectionRatio number 目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0

options

options 参数主要用于配置滚动容器和 callback 的触发时机:

名称 类型 介绍 备注
threshold number[] 此属性决定了什么时候触发回调函数。它是一个数组,每个成员都是一个门槛值,默认为[0],即交叉比例(intersectionRatio)达到0时触发回调函数。
root DomElement 属性指定目标元素所在的容器节点(即根元素)。注意,容器元素必须是目标元素的祖先节点。
rootMargin string 定义根元素的margin,用来扩展或缩小rootBounds这个矩形的大小,从而影响intersectionRect交叉区域的大小。它使用CSS的定义方法,比如10px 20px 30px 40px,表示 top、right、bottom 和 left 四个方向的值。

参考链接

  1. www.ruanyifeng.com/blog/2016/1…
  2. juejin.cn/post/684490…