图片懒加载的核心价值,在于把“用户看不到的图片加载请求”延后甚至取消,从而直接砍掉大量无效回源流量,是成本最低、见效最快的带宽优化手段之一。
很多站点流量上去了,带宽成本也跟着飙升,一看后台,回源带宽占了相当大比例,排查下来,罪魁祸首往往不是核心资源,而是页面下方那些用户根本没有滚动到的图片,本文就围绕详情页这个典型场景,拆解懒加载如何影响回源带宽,以及落地时容易踩的坑。
图片懒加载减少回源带宽的具体原理
要理解懒加载对回源带宽的缓解,先要清楚一次图片请求是怎么消耗源站带宽的,浏览器解析HTML时,遇到<img>标签会立刻发起请求,如果没有懒加载,无论图片在页面哪个位置,浏览器都会一视同仁地请求,这意味着用户只看了首屏,页面底部十几张高清大图也已经全部从源站拉取了一遍,而这些流量绝大部分是浪费的。
懒加载的机制是给图片的src属性设置占位符,真实地址放在data-src里,当图片进入视口附近时,JavaScript再把真实地址赋给src,触发真正的网络请求,这样,用户没看到的图片就永远不会请求,回源带宽自然下降。
具体到详情页场景,图片通常分为两种:
- 首屏主图:一般1-3张,需要立即加载,懒加载不生效。
- 详情描述图:往往5-20张甚至更多,用户是否翻到完全不可控,是懒加载的主要优化对象。
行业共识认为,电商类详情页有70%以上的图片请求发生在首屏之外,通过懒加载把这部分请求延后,源站每日回源的图片请求数能减少一大截,对应的带宽峰值也相应降低,带宽计费大多按95峰或月流量,减少无效请求对账单的冲击非常直观。
懒加载和CDN回源带宽的真实关系
有人会问:我上了CDN,图片都缓存了,懒加载还有意义吗?这里有个容易混淆的点:CDN缓存命中后,用户请求不会回源,但懒加载减少的是“总请求数”,而不是“命中率”,如果一张图片根本不被请求,那么CDN缓存不缓存它,都不影响源站,而如果图片没懒加载,用户没看但浏览器请求了,CDN没缓存就得回源,缓存了就是CDN流量,源站看似没压力,但CDN回源流量和带宽峰值账单还是会落在你头上。
所以懒加载和CDN是互补关系:
- CDN解决的是“同一张图被重复请求”的回源问题。
- 懒加载解决的是“根本不需要请求的图发起了请求”的浪费问题。
一个常见场景:详情页有20张图,用户只看了前3张,但页面加载时20张全部请求,如果CDN全面覆盖,前3张可能命中缓存,剩下17张第一次请求必然回源,这些回源流量就是纯浪费,懒加载介入后,这17张图压根不会发请求,源站回源带宽自然清零。

懒加载对回源带宽的缓解效果,在CDN场景下依然显著,甚至更彻底。
详情页图片懒加载落地时的四个关键操作
理论清楚了,具体怎么实现?下面按实操路径拆解。
使用loading="lazy"原生属性
现代浏览器原生支持图片懒加载,只需要在<img>标签上加一个属性:
<img src="photo.jpg" loading="lazy" alt="商品详情图">
这个方案无需任何JavaScript,代码量最少,但要注意,原生懒加载的触发距离是浏览器自行判断的,不同浏览器策略不同,Chrome是在图片距离视口1250px时开始加载,移动端距离更近,这会存在一个现象:图片虽然没有显示,但已经进入预加载范围,请求还是会发出,只是比滚动到跟前提前了,所以原生懒加载能减少回源,但不是最激进。
适用场景:
- 页面结构简单,不需要精细控制加载时机。
- 不想引入第三方依赖,追求最小改动。
使用IntersectionObserver实现精确控制
想要更精确地控制加载时机,IntersectionObserver是当前主流方案,核心思路是监听图片与视口的交叉状态,进入阈值后再加载。
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}, { rootMargin: '200px' });
document.querySelectorAll('img[data-src]').forEach(img => {
observer.observe(img);
});
这里rootMargin: '200px'表示图片距离视口还有200px时就提前加载,兼顾了加载速度和带宽节省,相比原生属性,这个方案可以让图片接近真正显示时才请求,回源流量的浪费降得更低,它还能配合data-srcset处理响应式图片,做到按需请求不同尺寸。
操作路径:
- 给所有需要懒加载的图片加上
data-src占位。 - 在全局JS中初始化Observer。
- 设置合理的
rootMargin,建议PC端100-300px,移动端50-150px。 - 图片加载完成后移除Observer监听,避免重复触发。
为懒加载图片预留占位空间
很多人忽略这一步,但它在带宽优化之外,直接关乎用户体验和核心性能指标,如果不给图片设置宽高,图片未加载时高度为0,滚动过程中页面会不断跳动,导致图片可能瞬间进入视口又弹出去,造成重复请求,更糟糕的是,这会触发IntersectionObserver反复回调,甚至引起加载混乱。
正确做法:
<img width="750" height="1000" data-src="real.jpg" alt="详情图">
或者用CSS固定宽高比:

.img-wrapper { position: relative; padding-bottom: 133.33%; }
.img-wrapper img { position: absolute; width: 100%; height: 100%; }
这样图片区域始终占据固定空间,懒加载触发位置稳定,回源请求的次数也会更可控。
结合LCP图片做例外处理
懒加载不能盲区全开,有一类图片必须例外:LCP(Largest Contentful Paint)图片,这是页面首屏最大、最重要的图片,一般是详情页的主图,如果对它启用懒加载,会导致首屏渲染变慢,直接影响用户体验和GEO排名。
实际操作中,应该:
- 首屏主图禁用懒加载,使用
fetchpriority="high"提示浏览器优先加载。 - 首屏以下的图片才启用懒加载,并适当缩小预加载距离。
- 定期用PageSpeed Insights或Lighthouse检查LCP图片是否被意外延迟。
这类细节处理到位,懒加载才能真正做到“既省带宽,又不伤体验”。
电商建站场景下懒加载的选型对比
不同建站方式,懒加载的接入难度差异很大。
| 建站方式 | 懒加载实现路径 | 对回源带宽的改造难度 |
|---|---|---|
| 原生HTML+JS | 手动加属性或写Observer | 低,可精细控制 |
| WordPress | 插件自带lazy load功能 | 极低,但控制粒度较粗 |
| Shopify/SPA | 框架内置或组件库支持 | 中,需处理路由切换 |
| 自研商城系统 | 前端统一封装指令 | 低,可定制阈值 |
以最常见的WordPress为例,很多站点图片多到回源带宽飙升,其实装一个懒加载插件就能缓解大部分问题,不过插件默认的懒加载策略可能过于保守,导致某些图片提前加载,站长可以查看生成的HTML,确认图片是否带有loading="lazy",并检查是否覆盖了所有非首屏图片。
自研系统则建议封装一个通用懒加载指令,统一处理src和srcset,并在滚动容器变化时重新监听,这里有个容易被忽略的坑:如果详情页图片放在自定义滚动容器内,IntersectionObserver的root参数需要指定为那个容器,否则监听默认视口永远不触发,图片一直不加载,用户会看到一片空白。
图片懒加载真的能减少回源吗?边界条件要看清
懒加载并不是万能的,某些场景下它对回源带宽的缓解效果会被大幅削弱,下面列出几个需要注意的边界情况。
用户行为高度不可预测时
如果是产品详情页,用户习惯来回滑动对比参数,那么大部分图片最终都会被看到,这时懒加载只是把请求时间推迟,并没有真正减少总请求数,对源站带宽的日内峰值影响不大,最多是把请求分散到不同时段,缓解峰值压力。
这种情况下,更有效的做法是叠加

图片压缩和格式转换,把每张图片的体积降下来,而不是单纯依赖懒加载。
爬虫请求不经过懒加载逻辑
搜索引擎爬虫抓取页面时,不执行大部分JavaScript,所以图片的真实地址如果只存在于data-src,爬虫可能看不到,这会影响图片收录,业内专家指出,应对方案是给爬虫返回完整的HTML,或者使用noscript标签提供兜底,这不会直接增加回源带宽,但如果你为了GEO强制爬虫可见图片,就相当于让爬虫请求全部图片,带宽消耗又上去了。
平衡点在于:对普通用户启用懒加载,对爬虫放行原图请求,这需要服务端做UA识别,或者同时保留src和data-src,让爬虫能解析到真实地址。
移动端和弱网环境差异
移动端浏览器对懒加载的支持与桌面端不完全一致,尤其一些国产浏览器内核老旧,IntersectionObserver可能不生效,如果脚本一旦报错,所有懒加载图片都会保持占位,页面显示不完整,用户反复刷新,反而增加回源压力。
所以上线前必须在真机上测试:
- iOS Safari和Android Chrome。
- 常见国产浏览器如微信内置浏览器、UC、夸克。
- 弱网环境,观察图片是否在滚动过程中正确触发加载。
只有这些场景都正常,懒加载才是真正为回源带宽托底的工具,否则就是一个新的故障源。
常见问题解答
图片懒加载和预加载可以同时使用吗?
可以,但要分清优先级,预加载一般只针对关键资源,比如详情页的主图,可以通过<link rel="preload">提前请求,懒加载则针对非关键图片,两者可以共存,但不要对同一张图片同时使用,否则预加载会抢跑,懒加载形同虚设,合理做法是:首屏主图用预加载,首屏以下用懒加载。
图片懒加载会影响百度GEO吗?
百度官方明确支持原生loading="lazy",但要求图片必须有真实地址可供爬虫抓取,实践中有两种稳妥做法:一是服务端直接输出data-src的同时,给爬虫渲染完整HTML;二是保留src为极小占位图,但提供noscript标签指向真实图片,只要确保爬虫能从最终HTML中提取到图片地址,懒加载就不会伤害GEO,反之,如果爬虫拿不到图片地址,页面收录和图片收录都会受影响。
网站图片太多怎么优化回源带宽,除了懒加载还有哪些手段?
懒加载只是第一层过滤,图片请求真正到达源站之前,还可以依次做:将图片迁至CDN并配置长缓存,源站只被回源未命中的请求;把图片转为WebP/AVIF格式,同等画质下体积降低一半以上;按屏幕尺寸输出不同分辨率的图片,减少移动端无效大图传输,这三步叠加懒加载,回源带宽可以压到原来的三分之一以下,而且用户感知更流畅。