首屏图片不能直接写,因其会立即触发网络请求,抢占关键资源、拖慢lcp、延长白屏;应按需加载,对初始首屏图保留src,滚动进入的图用intersectionobserver+rootmargin懒加载,并配合srcset/sizes实现响应式。

首屏图片为什么不能直接写 <img src="...">
浏览器解析 HTML 时,<img> 标签一旦出现在 DOM 中,就会立即触发网络请求,不管它是否在视口内。首屏图片若体积大、数量多,会抢占关键资源(如 HTML 解析、JS 执行、CSS 渲染),拖慢 LCP(最大内容绘制)指标,甚至导致白屏延长。
典型现象:Network 面板里看到多个大图在 DOMContentLoaded 前就已发起请求,而用户实际只看到顶部一两张。
- 解决方案不是“禁用图片”,而是“按需加载”——只让真正首屏可见的图片立刻加载,其余延迟或懒加载
- 注意:CSS 背景图(
background-image)同样会提前加载,不能靠display: none拦截 - 服务端渲染(SSR)场景下,首屏图片必须同步输出 HTML,否则会触发 FOUC 或 SSR/CSR 不一致
loading="lazy" 在首屏图片上要慎用
Chrome 76+ 支持原生 loading="lazy",但它对“首屏判断”非常保守:只要图片距离当前视口超过 ~1250px(具体值因 UA 而异),就延迟加载。这意味着很多本该首屏展示的图片(比如轮播图第二张、折叠面板默认展开项里的图)会被误判为“非首屏”,造成闪烁或空白。
- 仅对明确位于首屏下方、且无需立即呈现的图片使用
loading="lazy"(如长文底部的配图) - 首屏区域内的
<img>必须显式设为loading="eager",尤其在 Safari(旧版本不支持 lazy)或需要兼容低版本 Chrome 时 - 不要依赖
loading属性做首屏优化主策略——它不可控、不可测、不跨浏览器一致
用 IntersectionObserver 精确控制首屏图片加载时机
真正可控的方式是监听元素是否进入视口,并手动设置 src 或 srcset。这对首屏图片管理的关键在于:区分“初始首屏”和“滚动后进入首屏”的两类图片。
- 初始首屏图片(如 banner、头图)应在 DOM ready 后立即加载,无需观察 —— 直接保留
src即可 - 滚动中才可能进入首屏的图片(如卡片列表第 2–5 项),用
IntersectionObserver观察,首次进入视口时再赋值data-src到src - 务必设置
rootMargin: "0px 0px 100px 0px",提前加载即将进入视口的图片,避免滚动时闪白 - 示例逻辑:
const io = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; io.unobserve(img); } }); }, { rootMargin: "0px 0px 100px 0px" });
响应式首屏图必须用 srcset + sizes,别只靠 CSS
首屏图片常需适配不同设备宽度(如桌面端 1920px 宽图、移动端 400px 宽图),但仅用 CSS 缩放 <img style="max-width:90%"> 会导致移动端下载桌面图,浪费带宽。
- 必须用
srcset提供多尺寸源,配合sizes告诉浏览器“在不同断点下这张图占多少视口宽度”,让浏览器选最合适的资源 - 错误写法:
<img src="banner-1920.jpg" style="max-width:90%">→ 移动端仍下载 1920px 图 - 正确写法:
<img srcset="banner-400.jpg 400w, banner-800.jpg 800w, banner-1920.jpg 1920w" sizes="(max-width: 480px) 100vw, (max-width: 1024px) 50vw, 1920px" src="banner-800.jpg"> - 注意:
src是降级兜底,必须存在;sizes中的宽度值必须与实际布局占用一致,否则选图失准
loading、srcset)能解决一部分问题,但边界模糊、行为不一致;真正稳定可控的,还是结合 DOM 生命周期、视口状态和响应式规则的手动调度。最容易被忽略的是:首屏不是静态概念——SPA 路由切换后的新首屏、动态插入的内容块、甚至字体加载完成后的布局重排,都可能改变“首屏”的实际范围。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











