Intersection Observer 是浏览器提供的一个用于异步监听目标元素与其祖先元素(或视窗 viewport)交叉状态变化的 API,常用于懒加载、元素进入/离开可视区域的检测、统计曝光、实现“无限滚动”等场景。
// 1. 创建一个回调函数
function onIntersection(entries, observer) {
entries.forEach((entry) => {
if (entry.isIntersecting) {
console.log("元素进入可视区:", entry.target);
// 比如加载图片、触发动画、上报曝光…
observer.unobserve(entry.target); // 如果只需要一次,可以取消监听
}
});
}
IntersectionObserverEntry
重要字段
名称 | 说明 |
---|---|
target |
被监听的元素 |
isIntersecting |
布尔值,表示是否与根相交 |
intersectionRatio |
相交面积占目标自身面积的比例(0~1) |
boundingClientRect / intersectionRect |
目标和相交区域的几何信息 |
time |
触发回调时的时间戳 |
// 2. 实例化 IntersectionObserver
const observer = new IntersectionObserver(onIntersection, {
root: null, // 默认为 null (viewport)
rootMargin: '0px 0px 0px 0px',
threshold: 0.25 // 目标至少有 25% 可见时触发
});
// 3. 开始监听:传入一个或多个目标元素
const imgs = document.querySelectorAll('img[data-src]');
imgs.forEach(img => observer.observe(img));
根元素(root)
指定用于比对交叉状态的容器,默认是浏览器视窗 viewport
;也可以指定某个滚动容器元素。
根元素的外边距(rootMargin)
用于扩展或缩小根元素的边界,格式同 CSS margin,如 "0px 0px -100px 0px"
。
阈值(threshold)
一个 0~1 之间的数字或数字数组,表示目标元素与根相交面积比例达到该值时触发回调。例如 0.5
表示 50%,[0, 0.5, 1]
表示在 0%、50%、100% 三个阶段都会触发。
回调(callback)
每当目标元素的相交状态发生到达阈值的变化时执行,接收两个参数:一个是 IntersectionObserverEntry
数组,另一个是当前的 IntersectionObserver
实例。
observer.unobserve(target)
target
元素的监听。.observe(...)
。IntersectionObserver
去监听别的目标。observer.disconnect()
.observe(...)
,但在调用前它不再对任何元素发出回调。