图片懒加载通过延迟加载非可视区图片提升性能,核心是用data-src存储真实路径,结合Intersection Observer监听进入视口时加载,推荐使用Observer API以提升效率并降低主线程负担。

图片懒加载的核心思路是延迟加载页面中未进入可视区域的图片,等用户滚动到对应位置时再加载真实图片。这样可以减少初始页面加载时间、降低服务器压力、提升用户体验。
1. 基本原理:利用 data-src 占位
将真实的图片地址放在 data-src 属性中,src 先设置为空或占位图。当图片需要显示时,再把 data-src 的值赋给 src。
示例html结构:
@@##@@
2. 判断图片是否进入视口
通过 getBoundingClientRect() 方法判断元素是否出现在浏览器视窗内。
判断函数示例:
function isInViewport(element) { const rect = element.getBoundingClientRect(); return ( rect.top <= window.innerHeight && rect.bottom >= 0 ); }
3. 监听滚动事件并加载图片
在滚动时检查所有懒加载图片,如果进入视口,就将 data-src 赋值给 src,并移除监听避免重复触发。
实现代码:
const images = document.querySelectorAll('img.lazy'); function lazyLoad() { images.forEach(img => { if (isInViewport(img)) { img.src = img.dataset.src; img.classlist.remove('lazy'); // 加载后移除类名 } }); } // 初始化调用一次(防止首屏图片不触发) lazyLoad(); // 监听滚动和resize window.addEventListener('scroll', lazyLoad); window.addEventListener('resize', lazyLoad);
4. 提高性能:使用节流(throttle)
滚动事件频繁触发,建议加上节流避免性能问题。
Modoer 是一款以本地分享,多功能的点评网站管理系统。采用 PHP+MYSQL 开发设计,开放全部源代码。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱,不局限于商铺类点评,真正实现了多类型的点评,可以让您的网站点评任何事与物,同时增加产品模块,也更好的网站产品在网站上展示。Modoer点评系统 2.5 Build 20110710更新列表1.同步 旗舰版系统框架2.增加 限制图片
0 简单节流实现:
function throttle(func, delay) { let inThrottle; return function() { if (!inThrottle) { func.apply(this, arguments); inThrottle = true; setTimeout(() => inThrottle = false, delay); } }; } window.addEventListener('scroll', throttle(lazyLoad, 100));
5. 使用 Intersection Observer(推荐方案)
现代浏览器推荐使用 Intersection Observer API,性能更好,无需手动计算位置。
优化版本:
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); // 加载完成后停止观察 } }); }); // 观察所有懒加载图片 images.forEach(img => { if (img.classList.contains('lazy')) { observer.observe(img); } });
这种方式更高效,不会影响主线程性能,是目前最主流的做法。
基本上就这些。用 data-src 存储真实路径,结合 Intersection Observer 实现监听,能有效实现图片懒加载。兼容性方面,如需支持老浏览器,可搭配 polyfill 或降级到 scroll 事件方案。