JavaScript图片懒加载核心是监听图片是否进入视口后才加载真实资源,推荐用IntersectionObserver实现提前加载,不支持时降级为scroll+getBoundingClientRect,并需处理加载失败、布局偏移等优化。
JavaScript 实现图片懒加载,核心是监听图片是否进入视口(viewport),并在进入时才加载其真实图片资源。这能显著减少首屏请求、节省带宽、提升页面初始渲染性能。
现代推荐方式是使用 IntersectionObserver API,它原生支持异步监听元素与视口的交叉状态,性能好、写法简洁、无需频繁监听 scroll 或 resize。
data-src)暂存于自定义属性中,src 先设为空或占位图rootMargin(如 "100px")可实现“提前加载”,让图片在真正进入视口前就开始请求isIntersecting === true,则设置 img.src = img.dataset.src,并可调用 unobserve() 避免重复触发对于需兼容 IE 或老版本浏览器的场景,可用传统方式模拟:
scroll 和 resize 事件(注意
节流)element.getBoundingClientRect() 获取其相对于视口的位置rect.top 0(即顶部在视口下方、底部在视口上方),满足即加载结构示例:
@@##@@
简单 Observer 实现:
const lazyImages = document.querySelectorAll('img.lazy');
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
observer.unobserve(img);
}
});
}, { rootMargin: '50px' });
lazyImages.forEach(img => observer.observe(img));
}
实际项目中还需注意:
img.onerror 后显示默认图或错误提示loading="lazy" HTML 属性(现代浏览器原生懒加载),作为兜底或简化静态资源处理width/height 或使用 aspect-ratio,防止加载时布局偏移(CLS)Client-Hints(如 DPR、Width)动态返回适配尺寸的图片,进一步优化懒加载效果