关于 responsive-images
面向 Web 开发者的响应式图片实践技能,关注性能与无障碍。内容涉及图片源选择、替代文本和宽高比处理,并引用 web.dev 与 MDN 资料。
主要功能
- 01响应式图片标记指南
- 02使用宽度描述符选择图片源
- 03替代文本要求
- 04宽高比与 object-fit 指南
适用场景
- 01为不同视口尺寸提供图片
- 02提升图片无障碍性
- 03防止图片在容器中变形
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill responsive-images安装后在 Claude Code 中输入/responsive-images确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.md.claude-plugin/plugin.jsonreferences/aspect-ratio.mdlazy-loading.mdmodern-formats.mdpicture-element.mdsrcset-sizes.mdrules/responsive-images.mdtemplates/image-component.tsx详细介绍
响应式图像
状态:已投入生产 ✅ 最后更新:2026-01-14 标准:Web 性能最佳实践、Core Web Vitals
快速入门
基本响应式图像
<img
src="/images/hero-800.jpg"
srcset="
/images/hero-400.jpg 400w,
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="(max-width: 640px) 100vw,
(max-width: 1024px) 90vw,
1200px"
alt="Hero image description"
width="1200"
height="675"
loading="lazy"
/>
主视觉图像(LCP)
<img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/>
配置
推荐图像尺寸
| 用例 | 要生成的宽度 | Sizes 属性 |
|---|---|---|
| 全宽主视觉 | 800w、1200w、1600w、2400w | 100vw |
| 内容宽度 | 400w、800w、1200w | (max-width: 768px) 100vw, 800px |
| 网格卡片(3 列) | 300w、600w、900w | (max-width: 768px) 100vw, 33vw |
| 侧边栏缩略图 | 150w、300w | 150px |
延迟加载规则
| 图像位置 | loading | fetchpriority | 原因 |
|---|---|---|---|
| 主视觉/LCP | eager | high | 优化 LCP,优先下载 |
| 首屏内(非 LCP) | eager | 省略 | 正常加载 |
| 首屏外 | lazy | 省略 | 延迟加载,直到接近视口 |
| 屏幕外轮播 | lazy | 省略 | 延迟加载,直到交互发生 |
常见模式
全宽响应式图像
<img
src="/images/banner-1200.jpg"
srcset="
/images/banner-600.jpg 600w,
/images/banner-1200.jpg 1200w,
/images/banner-1800.jpg 1800w,
/images/banner-2400.jpg 2400w
"
sizes="100vw"
alt="Full width banner"
width="2400"
height="800"
loading="lazy"
class="w-full h-auto"
/>
网格卡片图像(3 列)
<img
src="/images/card-600.jpg"
srcset="
/images/card-300.jpg 300w,
/images/card-600.jpg 600w,
/images/card-900.jpg 900w
"
sizes="(max-width: 768px) 100vw,
(max-width: 1024px) 50vw,
33vw"
alt="Card image"
width="900"
height="600"
loading="lazy"
class="w-full h-auto"
/>
固定宽高比容器
<div class="aspect-[16/9] overflow-hidden">
<img
src="/images/video-thumbnail-800.jpg"
srcset="
/images/video-thumbnail-400.jpg 400w,
/images/video-thumbnail-800.jpg 800w,
/images/video-thumbnail-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Video thumbnail"
width="800"
height="450"
loading="lazy"
class="w-full h-full object-cover"
/>
</div>
现代格式(WebP + AVIF)
<picture>
<source
srcset="
/images/hero-800.avif 800w,
/images/hero-1200.avif 1200w,
/images/hero-1600.avif 1600w
"
sizes="100vw"
type="image/avif"
/>
<source
srcset="
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w,
/images/hero-1600.webp 1600w
"
sizes="100vw"
type="image/webp"
/>
<img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/>
</picture>
艺术指导(不同裁剪)
<picture>
<source
media="(max-width: 640px)"
srcset="
/images/product-portrait-400.jpg 400w,
/images/product-portrait-800.jpg 800w
"
sizes="100vw"
/>
<source
media="(min-width: 641px)"
srcset="
/images/product-landscape-800.jpg 800w,
/images/product-landscape-1200.jpg 1200w,
/images/product-landscape-1600.jpg 1600w
"
sizes="(max-width: 1024px) 90vw, 1200px"
/>
<img
src="/images/product-landscape-1200.jpg"
alt="Product image"
width="1200"
height="675"
loading="lazy"
/>
</picture>
防止错误
始终包含宽度和高度
问题:图像加载时发生布局偏移(CLS 得分较差)
<img src="/image.jpg" alt="Image" loading="lazy" />
<img
src="/image.jpg"
alt="Image"
width="800"
height="600"
loading="lazy"
/>
不要对 LCP 图像进行延迟加载
问题:LCP 延迟,Core Web Vitals 得分较差
<img
src="/hero.jpg"
alt="Hero"
loading="lazy"
/>
<img
src="/hero.jpg"
alt="Hero"
loading="eager"
fetchpriority="high"
/>
使用宽度描述符(w),而非密度描述符(x)
问题:浏览器无法为视口选择最佳图像
<img
src="/image.jpg"
srcset="/image.jpg 1x, /[email protected] 2x"
alt="Image"
/>
<img
src="/image-800.jpg"
srcset="
/image-400.jpg 400w,
/image-800.jpg 800w,
/image-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Image"
width="800"
height="600"
/>
例外:对于 Logo 等固定尺寸图像,密度描述符是合适的。
始终包含 Alt 文本
问题:无法满足无障碍、SEO 和屏幕阅读器要求
<img src="/product.jpg" />
<img src="/product.jpg" alt="Red leather messenger bag with brass buckles" />
<img src="/decorative-line.svg" alt="" role="presentation" />
使用 object-fit 设置宽高比
问题:容器尺寸与图像尺寸不同时,图像会被拉伸或压扁
<div class="w-full h-64">
<img src="/image.jpg" alt="Image" class="w-full h-full" />
</div>
<div class="w-full h-64">
<img
src="/image.jpg"
alt="Image"
class="w-full h-full object-cover"
/>
</div>
快速参考
Sizes 属性模式
sizes="100vw"
sizes="(max-width: 768px) 100vw, 800px"
sizes="300px"
sizes="(max-width: 768px) 100vw, 50vw"
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 90vw, 1200px"
常见宽高比
| 比例 | CSS | 用例 |
|---|---|---|
| 16:9 | aspect-[16/9] | 视频缩略图、主视觉图像 |
| 4:3 | aspect-[4/3] | 标准照片 |
| 3:2 | aspect-[3/2] | DSLR 照片 |
| 1:1 | aspect-square | 个人资料图片、Instagram 风格图像 |
| 21:9 | aspect-[21/9] | 超宽横幅 |
object-fit 值
| 值 | 效果 | 用例 |
|---|---|---|
cover | 填满容器,裁剪边缘 | 卡片图像、背景 |
contain | 适应容器内部,保留全部内容 | Logo、产品照片 |
fill | 拉伸以填满容器 | 除非必要,否则避免使用 |
scale-down | 取 contain 与原始尺寸中较小者 | 混合内容尺寸 |
格式对比
| 格式 | 质量 | 文件大小 | 浏览器支持 | 用例 |
|---|---|---|---|---|
| JPEG | 良好 | 中等 | 100% | 照片、复杂图像 |
| PNG | 无损 | 大 | 100% | Logo、透明图像 |
| WebP | 出色 | 小 | 97%+ | 现代浏览器、照片 |
| AVIF | 出色 | 最小 | 90%+ | 前沿场景,需提供后备格式 |
推荐策略:使用 <picture> 按 AVIF → WebP → JPEG 的顺序提供后备格式
资源
Token 效率:通过避免在 srcset/sizes 语法上反复试错,节省约 70% 防止的错误:以上记录了 6 种常见响应式图像问题
评论
支持 Markdown