R3.07.4viewport-aware media loading设计

视口外的媒体延后加载,视口内的优先加载

别名: lazy loading · 视口优先 · 英雄图抢带宽 · 延后解码

概念解释

带宽和解码槽是有限的。视口里正在看的媒体应先占用它们,视口外的延后。视口感知的加载(viewport-aware loading)用 loading="lazy"、Intersection Observer 或优先级提示,把请求和 decode 排到可见性之后或之前。它管的是调度,不是文件该有多大、也不是播不播放。英雄图被标成懒加载、页脚图却立刻请求,就是优先级颠倒。

机制

浏览器对每个文档有连接数、带宽和图像解码队列。所有 <img>eager 时,首屏和折页下的图抢同一条管道,首屏图的首字节被推迟。懒加载把元素进入根边距之前的请求挂起;fetchpriority="high" 或预加载则把当前视口的 LCP 候选插到队列前。正确的调度是:当前视口及一小段预滚动边距内的媒体优先,其余等待。边距太小,滚动时会看到空白等图;边距太大,又把远处的图提前拉回来,等于没懒加载。

解码同样要排期。即便字节已到,主线程或图像解码器一次只能消化有限张。视口外的图若先解码,会挤占视口内那张的完成时刻。所以“延后”包括延后请求和延后解码,不只是把 src 写晚一点。

边界

打印、分享图卡、爬虫截图往往没有“当前视口”,懒加载会导致导出缺图,需要在这些通道强制 eager。邮件 HTML 对懒加载支持不一致。无限列表若边距设过小,快速滑动会连续空白。预渲染或往返缓存恢复时,视口可能已经不在文档顶部,应按恢复后的视口而不是按页头来排优先级。视频海报可以懒,但已在视口内且即将成为 LCP 的海报不能懒。

怎么落地

  • 首屏英雄图、主海报设为 eager 并提高优先级;折页下默认 lazy,预滚动边距按一到两屏而不是整页。
  • 检查框架默认:有的组件把所有图设成 lazy,包括 LCP 候选,必须对首屏槽反向覆盖。
  • 用优先级提示或预加载只对准当前视口的那一张 LCP 图,不要预加载一排缩略图。
  • 验证:冷加载看瀑布图,首屏图的请求应早于折页下;快速滚到中部时,目标图应在进入视口前开始,且首屏 LCP 时间不应因下面的图而变差。

延伸

  • 同组R3.07.1 尺寸与格式需按使用场景生成 · R3.07.2 未声明尺寸会造成布局跳动 · R3.07.3 自动播放消耗流量与注意力 · R3.07.5 占位与最终图的主色接近可减少突兀 · R3.07.6 媒体降级链需覆盖解码失败与格式不支持
  • 相邻I2.07 感知性能 · R3.15 首屏指标与交互就绪
  • 站内检索lazy loading · fetchpriority · LCP image

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R3.07.4