2026-06-02 00:51:20
在JavaScript中实现图片懒加载的核心是延迟加载非视口内的图片,通过以下方案可兼顾性能、兼容性与用户体验:
一、推荐方案:IntersectionObserver API原理:通过监听元素与视口的交叉状态,在图片即将进入视口时加载真实资源。实现步骤:
HTML结构调整将图片真实地址存储在data-src属性中,初始src可设为占位图或留空:
<img alt="描述文字" class="lazyload-img" data-src="真实图片地址.jpg">JavaScript逻辑
document.addEventListener('DOMContentLoaded', () => { const lazyImages = document.querySelectorAll('.lazyload-img'); 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.removeAttribute('data-src'); // 移除冗余属性 observer.unobserve(img); // 停止观察已加载图片 } }); }, { rootMargin: '0px 0px 100px 0px', // 提前100px加载 threshold: 0.01 // 1%可见即触发 }); lazyImages.forEach(img => observer.observe(img)); } else { // 回退方案:监听scroll事件(见下文) }});优势:
适用场景:需兼容不支持IntersectionObserver的旧浏览器(如IE)。实现逻辑:
缺点:
占位符设计
使用低分辨率图、模糊图(CSS滤镜)或纯色背景避免布局偏移:.lazyload-img { background: #f0f0f0; /* 纯色占位 */}
或通过<img src="低质量占位图.jpg" data-src="高清图.jpg">实现平滑过渡。
错误处理监听onerror事件替换失败图片或隐藏元素:
img.onerror = () => { img.src = '默认错误图.jpg'; // 或 img.style.display = 'none';};背景图片懒加载动态修改background-image样式:
const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const div = entry.target; div.style.backgroundImage = `url(${div.dataset.bg})`; observer.unobserve(div); } });});document.querySelectorAll('.lazy-bg').forEach(div => { div.style.backgroundImage = 'url(占位图.jpg)'; // 初始占位 observer.observe(div);});适用场景:简单需求且无需精细控制时,优先使用原生属性:
<img src="占位图.jpg" data-src="真实图.jpg" loading="lazy" alt="描述">优势:
局限:
通过合理选择方案,可显著提升页面加载速度和用户体验,同时降低维护成本。