IntersectionObserver
IntersectionObserver接口(从属于Intersection Observer API)为开发者提供了一种可以异步监听目标元素与其祖先或视窗(viewport)交叉状态的手段。祖先元素与视窗(viewport)被称为根(root)。 常见的使用方法如下
const io = new IntersectionObserver(callback, options)
const img = document.querySelector('img')
io.observe(img) // 开始观察,接受一个DOM节点对象
io.disconnect() // 关闭观察器
callback函数有个entries参数,它是个IntersectionObserverEntry对象数组
boundingClientRect目标元素的矩形信息intersectionRatio相交区域和目标元素的比例值 intersectionRect/boundingClientRect 不可见时小于等于0intersectionRect目标元素和视窗(根)相交的矩形信息 可以称为相交区域isIntersecting目标元素当前是否可见 Boolean值 可见为truerootBounds根元素的矩形信息,没有指定根元素就是当前视窗的矩形信息target观察的目标元素time返回一个记录从IntersectionObserver的时间到交叉被触发的时间的时间戳 option 参数如下:root所监听对象的具体祖先元素。如果未传入值或值为null,则默认使用顶级文档的视窗(一般为html)。rootMargin计算交叉时添加到根(root)边界盒(bounding box)的矩形偏移量, 可以有效的缩小或扩大根的判定范围从而满足计算需要。所有的偏移量均可用像素(px)或百分比(%)来表达, 默认值为"0px 0px 0px 0px"。threshold一个包含阈值的列表, 按升序排列, 列表中的每个阈值都是监听对象的交叉区域与边界区域的比率。当监听对象的任何阈值被越过时,都会触发callback。默认值为0。 该API可用了图片懒加载
const imgList = [...document.querySelectorAll('img')]
const io = new IntersectionObserver((entries) =>{
entries.forEach(item => {
// isIntersecting是一个Boolean值,判断目标元素当前是否可见
if (item.isIntersecting) {
item.target.src = item.target.dataset.src
// 图片加载后即停止监听该元素
io.unobserve(item.target)
}
})
}, {
root: document.querySelector('.root')
})
// observe遍历监听所有img节点
imgList.forEach(img => io.observe(img))