Skip to content

IntersectionObserver

IntersectionObserver 是什么?

IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口(viewport)交叉状态的方法。其祖先元素或视口被称为根(root)

IntersectionObserver 解决了什么问题

IntersectionObserver 主要解决了前端开发中目标元素与视口交集(即可见性)监测的问题,并提供了高效且优雅的解决方案,使得开发者能够更好地实现资源按需加载、动态交互效果以及其他基于可见性的功能优化

示例:

js
const intersectionObserver = new IntersectionObserver((entries) => {
  // 如果 intersectionRatio 为 0,则目标在视野外,
  // 我们不需要做任何事情。
  if (entries[0].intersectionRatio <= 0) return;

  loadItems(10);
  console.log("Loaded new items");
});
// 开始监听
intersectionObserver.observe(document.querySelector(".scrollerFooter"));

IntersectionObserver 的 API

实例属性

options 是一个对象,用来配置参数,也可以不填。共有三个属性,具体如下:

  • IntersectionObserver.root 只读

    测试交叉时,用作边界盒的元素或文档。如果构造函数未传入 root 或其值为 null,则默认使用顶级文档的视口。

  • IntersectionObserver.rootMargin 只读

    计算交叉时添加到根边界盒 (en-US)的矩形偏移量,可以有效的缩小或扩大根的判定范围从而满足计算需要。此属性返回的值可能与调用构造函数时指定的值不同,因此可能需要更改该值,以匹配内部要求。所有的偏移量均可用像素(px)或百分比(%)来表达,默认值为“0px 0px 0px 0px”。

  • IntersectionObserver.thresholds (en-US) 只读

    一个包含阈值的列表,按升序排列,列表中的每个阈值都是监听对象的交叉区域与边界区域的比率。当监听对象的任何阈值被越过时,都会生成一个通知(Notification)。如果构造器未传入值,则默认值为 0。

callback

callback 是添加监听后,当监听目标发生滚动变化时触发的回调函数。接收一个参数 entries,即 IntersectionObserverEntry 实例。描述了目标元素与 root 的交叉状态。具体参数如下:

属性名称描述
boundingClientRect返回包含目标元素的边界信息,返回结果与 element.getBoundingClientRect() 相同
intersectionRatio返回目标元素出现在可视区的比例, 常用 0 来判断是否出现在可视区域
intersectionRect描述根(root)和目标元素之间的相交区域
isIntersecting返回一个布尔值:
1. 如果目标元素出现在 root 可视区,返回 true
2. 如果从 root 可视区消失,返回 false
rootBounds用来描述交叉区域观察者(intersection observer)中的根.
target目标元素:与根出现相交区域改变的元素 (Element)
time返回一个记录从 IntersectionObserver 的时间原点到交叉被触发的时间的时间戳

IntersectionObserver 方法

方法名说明
observe()开始监听一个目标元素
unobserve()停止监听特定目标元素
takeRecords()返返回所有观察目标的 IntersectionObserverEntry 对象数组
disconnect()使 IntersectionObserver 对象停止全部监听工作

参考文献

https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver

Released under the MIT License.