Intersection Observer 为什么监听不到元素进入视口?
我在做一个图片懒加载功能,用 Intersection Observer 监听图片是否进入视口,但回调一直没触发。页面滚动时完全没反应,是不是哪里写错了?
我创建 observer 的代码是这样的:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('图片可见了');
}
});
});
observer.observe(document.querySelector('.lazy-img'));
图片元素确实有 .lazy-img 类名,而且在页面下方需要滚动才能看到。难道要加 rootMargin 才行?
1. 元素没有实际尺寸
这是懒加载最常踩的坑。如果你用的是
![]()
这种空图片,没有 src 也没有宽高,它在页面上根本不占空间,Intersection Observer 根本检测不到它。解决:给图片加上宽高或者用占位容器。2. 元素在 observer 注册时还不存在
如果你的图片是动态加载的(比如 Ajax 拉数据后渲染的),在执行
observer.observe()时元素还没进 DOM,自然监听不到。3. 元素在视口外但你期望提前触发
你说图片在页面下方需要滚动才能看到,那应该能触发才对。但如果想要在"即将进入"时就触发(比如提前 200px),需要加 rootMargin:
你先调试一下:直接在控制台打
document.querySelector('.lazy-img')看看能不能拿到元素,再看看这个元素有没有宽高。如果拿不到元素,说明是时机问题;如果有元素但尺寸是 0,那就是尺寸问题。