R3.07.1per-use image variants设计

尺寸与格式需按使用场景生成

别名: srcset · 响应式图 · 多格式出图 · 使用场景变体

概念解释

一张源图不是一次投递。屏幕上的 CSS 像素、设备像素比、解码器支持的编码,合在一起才决定该送哪一个文件。按使用场景生成尺寸与格式,指的是为每个展示槽产出匹配的宽、高、密度和编码(AVIF / WebP / JPEG 等),再用 srcsetsizes 或等价清单让运行时挑选。用同一份 4000 像素原图去填头像和去填全屏英雄图,浪费的是字节和解码,不是“画质不够高”。

机制

解码按编码像素计费:宽×高×通道,再乘设备像素比。展示只要 80 CSS 像素的头像,却下载 2000 像素边长的图,主线程和 GPU 仍按 2000 解码,然后丢掉多余采样。格式决定压缩效率与是否能硬件解码:同一内容的 AVIF 往往小于 JPEG,但老设备可能解不了。srcset 提供候选,sizes 告诉引擎这个槽在当前布局里有多宽,引擎按 DPR 和槽宽选最接近的候选。没有按槽生成的候选,引擎只能选“仅有的那一张”,无论它对不对。

场景还包括裁切:列表缩略图需要中心裁切的小图,英雄图需要保留构图的大图。只缩不裁,会在小槽里送一张构图错误的缩小全图,既费字节又看不清主体。

边界

用户上传后立刻预览的原图,来不及走完整出图管道,可以先用本地缩小,再在后台生成场景变体。矢量图标、SVG 插画不走栅格 srcset。打印、海报导出要的是物理分辨率,不是屏幕槽宽。仅内网、次数极少的管理页,为每个槽维护变体的成本可能高于那几张原图。直播和实时画布的帧不是预生成文件。

怎么落地

  • 为每个展示槽规定 CSS 宽、最大 DPR 和允许的编码,构建时从源图生成对应文件,禁止组件写死一份原图 URL。
  • 标记里同时给 srcsetsizes(或客户端等价选择器),让引擎按槽宽而不是按视口瞎猜。
  • 缩略图单独出裁切尺寸,不要把英雄图缩小后充当列表图。
  • 验证:在 1x 与 3x 设备、窄列表与宽英雄槽上抓实际请求,文件像素边长应落在槽宽×DPR 的邻近档;解码耗时应随档位下降,而不是各槽都解同一张大图。

延伸

  • 同组R3.07.2 未声明尺寸会造成布局跳动 · R3.07.3 自动播放消耗流量与注意力 · R3.07.4 视口外的媒体延后加载,视口内的优先加载 · R3.07.5 占位与最终图的主色接近可减少突兀 · R3.07.6 媒体降级链需覆盖解码失败与格式不支持
  • 相邻J2.05 装饰性图像 · R3.04 性能预算
  • 站内检索srcset · image variants · decode

同组卡片

快捷操作

分享

分享当前页面

ios_share

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