Inspire - Capo Productions
IntersectionObserver
IntersectionObserver
是一个非常实用的 Web API,它可以用来监听某个元素是否进入或离开另一个元素(或视口)的可视区域,而无需监听滚动事件。这在懒加载图片、实现无限滚动、元素可见性检测等场景中特别有用。
下面是一个 IntersectionObserver
的基础用法示例,逐步解释它的工作原理:
基本语法
js
const observer = new IntersectionObserver(callback, options)
observer.observe(targetElement)
参数说明
1. callback(entries, observer)
- 当被观察的元素进入或离开可视区域时触发。
entries
: 是一个IntersectionObserverEntry
数组,包含所有被观察的元素的状态。observer
: 当前的IntersectionObserver
实例。
2. options
root
: 作为视口的元素,默认是浏览器视口 (null
)。rootMargin
: 类似 CSS 的 margin,用来扩大或缩小 root 区域。threshold
: 触发回调的比例,范围0
~1
,也可以是数组。
示例:检测元素是否进入视口
html
<div class="box" id="target">观察我</div>
css
.box {
height: 200px;
margin-top: 1000px;
background: lightblue;
}
js
const target = document.getElementById('target')
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
console.log('元素进入视口')
}
else {
console.log('元素离开视口')
}
})
}, {
root: null, // 使用默认视口
rootMargin: '0px',
threshold: 0.1 // 10% 可见时触发
})
observer.observe(target)
示例用途
图片懒加载:
jsif (entry.isIntersecting) { img.src = img.dataset.src observer.unobserve(img) }
无限滚动加载更多数据
统计某元素曝光率(广告、埋点)
动画播放控制(进入视口才开始)