无需登录 数据私有 本地保存

IntersectionObserver 实验台 - 元素可见性触发

12
0
0
0
观察区域
Root: 滚动容器

⬆️ 向上滚动观察目标元素 ⬆️

下方散布着 8个观察目标,滚动查看 IntersectionObserver 的实时效果

目标 #1 -- 图片懒加载占位
目标 #2 -- 广告曝光追踪
目标 #3 -- 动画触发点
目标 #4 -- 无限滚动触发
目标 #5 -- 大元素(高140px+)
较大元素需要更多滚动才能完全可见
目标 #6 -- 视频自动播放
目标 #7 -- 窄元素(65%宽度)
目标 #8 -- 页脚统计上报

🔽 底部区域 - 继续向下滚动 🔽

参数控制
元素可见比例达到阈值时触发回调。多值模式:同时监听多个阈值点。
正值扩展检测区域,负值收缩。格式同CSS margin。
目标实时状态
回调日志 0

等待 IntersectionObserver 回调...

IntersectionObserver 常见问题与知识点
什么是 IntersectionObserver?
IntersectionObserver(交叉观察器)是浏览器原生API,用于异步监测目标元素与祖先元素或视口的交叉状态。它可以高效地检测元素是否进入、离开可视区域,或者交叉比例是否达到指定阈值。广泛用于懒加载、无限滚动、广告曝光统计、动画触发等场景。相比传统scroll事件+getBoundingClientRect方案,IntersectionObserver性能更优,因为它在浏览器合成线程中工作,不阻塞主线程。
threshold 阈值是什么?如何理解?
threshold(阈值)定义了目标元素与root交叉比例达到多少时触发回调。取值范围0~1。

threshold: 0 — 元素任意像素进入root区域即触发(默认行为)。
threshold: 0.5 — 元素50%进入root区域时触发。
threshold: 1 — 元素100%完全位于root区域内才触发。
threshold: [0, 0.25, 0.5, 0.75, 1] — 数组形式,在多个交叉比例点都会触发回调,适合需要精细控制进出状态的场景。

注意:threshold为0时,即使只有1px交叉也会触发;threshold为1时要求元素完全在root内。
rootMargin 有什么作用?
rootMargin(根边距)用于扩展或收缩root元素的判定区域,格式与CSS margin相同。

正值(如"50px"):将root判定区域向外扩展50px。元素在进入root前50px就会被判定为"进入",常用于预加载。
负值(如"-30px"):将root判定区域向内收缩30px。元素需要深入root内部30px后才被判定为"进入",确保元素确实在用户视野中。
非对称(如"10px 20px 30px 40px"):分别设置上右下左。

常见用法:懒加载图片时设置rootMargin: "200px"可在图片进入视口前200px就开始加载。
isIntersecting 和 intersectionRatio 的区别?
isIntersecting:布尔值,表示目标元素是否与root有交叉(即threshold条件是否满足)。最常用、最直观的判断属性。
intersectionRatio:0~1之间的浮点数,表示目标元素与root的实际交叉比例。例如0.75表示75%的目标元素在root区域内。

简单来说:isIntersecting告诉你"是否进入",intersectionRatio告诉你"进入了多少"。对于threshold: [0, 0.5, 1],当intersectionRatio从0.3变为0.6时会在0.5处触发回调。
IntersectionObserver 的典型应用场景?
6大典型应用:
图片懒加载 — 元素进入视口前开始加载图片,节省带宽。
无限滚动 — 检测底部哨兵元素,触发加载更多数据。
广告曝光统计 — 广告元素达到一定可见比例时上报曝光。
动画触发 — 元素进入视口时播放入场动画。
视频自动播放/暂停 — 视频滚出视口时自动暂停。
性能优化 — 仅渲染可视区域内的DOM(虚拟滚动)。
如何选择 root 元素?null 代表什么?
root 参数指定了判定交叉的参考容器。

root: null(默认)— 使用浏览器视口(viewport)作为root。这是最常见的选择。
root: document.querySelector('.scroll-container') — 使用指定的可滚动DOM元素作为root。适用于页面内嵌滚动区域。

注意事项:自定义root元素必须具有明确的overflow样式(如overflow: auto或scroll),且其overflow不能是visible。IntersectionObserver使用root的border-box作为判定区域。