2026-04-02 16:37:19
图片懒加载是一种优化网站性能的技术,通过仅加载用户当前可见的图片来提高页面加载速度、减少带宽消耗。 实现方式包括:
HTML5 Intersection Observer API:
原理:Intersection Observer API 是一种原生 JavaScript API,用于检测元素是否进入可视区域。通过监听图片元素与视口的交叉状态,仅当图片进入可视区域时才触发加载。
实现步骤:
为图片设置 data-src 属性存储真实图片地址,src 属性设置为占位图或空。
创建 Intersection Observer 实例,配置回调函数。
在回调函数中,当图片进入视口时,将 data-src 的值赋给 src,触发图片加载。
代码示例:const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; observer.unobserve(img); // 加载后停止观察 } });});document.querySelectorAll('img[data-src]').forEach(img => { observer.observe(img);});
自定义 JavaScript 函数:
原理:通过监听滚动事件,计算图片元素与视口的位置关系,判断是否需要加载。
实现步骤:
获取所有待加载图片(如带有 lazyload 类的图片)。
监听 scroll 或 resize 事件,触发检查函数。
在检查函数中,遍历图片,判断其是否进入视口(通过 getBoundingClientRect() 获取位置信息)。
若图片在视口内,加载图片并移除监听(避免重复检查)。
代码示例:function lazyLoad() { const images = document.querySelectorAll('img.lazyload'); images.forEach(img => { if (img.getBoundingClientRect().top < window.innerHeight) { img.src = img.dataset.src; img.classList.remove('lazyload'); } });}window.addEventListener('scroll', lazyLoad);window.addEventListener('resize', lazyLoad);lazyLoad(); // 初始加载可视区域图片
第三方库:
推荐库:
Lazysizes:轻量级,支持响应式图片和占位符。
lozad.js:基于 Intersection Observer,配置简单。
picturefill:主要用于响应式图片(<picture> 元素),但也可结合懒加载。
优势:提供占位符、自动初始化、兼容性处理等额外功能。
示例(Lazysizes):<img data-src="image.jpg" class="lazyload" /><script src="lazysizes.min.js"></script>
注意事项:
总结: