1. 基本概念
srcSet
是 HTML5 引入的 <img>
标签属性,用于定义多个不同分辨率或尺寸的图片资源,帮助浏览器根据设备特性(如屏幕像素比、视口宽度)自动选择最合适的图片进行加载,从而实现响应式图片加载。
2. 浏览器兼容性
现代主流浏览器几乎全部支持 srcSet
,兼容性优秀:
浏览器 | 最低版本 |
---|---|
Chrome | 38+ |
Firefox | 38+ |
Safari | 8+ |
Edge | 12+ |
iOS Safari | 8+ |
Android 浏览器 | 67+ |
全球支持率超过 95% ,可以放心使用。
3. 工作原理
3.1 两种语法形式
📌 1. 基于 DPR(设备像素比)
使用 1x
, 2x
, 3x
等标记不同的图片分辨率,适配不同屏幕清晰度。
ini
<img
src="/images/[email protected]"
srcset="
/images/[email protected] 1x,
/images/[email protected] 2x,
/images/[email protected] 3x
"
alt="Logo"
/>
📌 2. 基于图片宽度(推荐用于响应式)
使用 300w
, 600w
等标记不同尺寸的图片,配合 sizes
让浏览器根据视口宽度决定加载哪张图。
ini
<img
src="/images/banner-small.jpg"
srcset="
/images/banner-small.jpg 300w,
/images/banner-medium.jpg 600w,
/images/banner-large.jpg 1200w
"
sizes="
(max-width: 480px) 300px,
(max-width: 768px) 600px,
1200px
"
alt="Banner"
/>
3.2 浏览器如何选择
- 浏览器根据
devicePixelRatio
或viewport
,自动匹配srcSet
中最合适的资源。 - 若无法解析
srcSet
,则回退使用src
指定的图片。
4. 为什么使用 srcSet
✅ 自动适配不同设备屏幕
- 高清屏自动加载 2x/3x 图片
- 普通屏只加载 1x 图,避免资源浪费
✅ 节省带宽
- 不同分辨率的设备只加载自己所需的图像
- 移动网络下节省用户流量,提升加载速度
✅ 提升性能
- 减少内存占用
- 加快页面首次渲染
- 提高页面 Lighthouse 分数
5. 实际应用示例
5.1 React/Vue 中的使用(DPR)
ini
<Image
src="/images/[email protected]"
srcSet={`
/images/[email protected] 1x,
/images/[email protected] 2x,
/images/[email protected] 3x
`}
/>
5.2 原生 HTML(视口宽度)
ini
<img
src="/images/card-small.jpg"
srcset="
/images/card-small.jpg 300w,
/images/card-medium.jpg 600w,
/images/card-large.jpg 900w
"
sizes="
(max-width: 400px) 300px,
(max-width: 768px) 600px,
900px
"
alt="Card"
/>
5.3 配合 <picture>
实现格式和尺寸兼容
ini
<picture>
<source
srcset="
/images/product.avif 1x,
/images/[email protected] 2x
"
type="image/avif"
/>
<source
srcset="
/images/product.webp 1x,
/images/[email protected] 2x
"
type="image/webp"
/>
<img
src="/images/product.jpg"
srcset="
/images/product.jpg 1x,
/images/[email protected] 2x
"
alt="Product"
/>
</picture>
6. 最佳实践与建议
✅ 图片命名规范
kotlin
avatar.jpg // 1x
[email protected] // 2x
[email protected] // 3x
✅ 图片尺寸建议
- 1x 图应满足最小显示尺寸
- 2x 图为 1x 的 2 倍宽高
- 3x 图为 1x 的 3 倍,适用于高分屏如 iPhone 12+
✅ 图片格式建议
- 使用 WebP / AVIF 代替 JPEG / PNG,可显著减小文件体积
- 推荐使用
<picture>
提供格式 fallback
7. 性能优化技巧
7.1 关键图像预加载
ini
<link
rel="preload"
as="image"
href="/images/[email protected]"
imagesrcset="/images/[email protected] 2x, /images/[email protected] 3x"
/>
7.2 延迟加载
配合 loading="lazy"
属性:
ini
<img
loading="lazy"
src="/images/photo.jpg"
srcset="/images/photo.jpg 1x, /images/[email protected] 2x"
/>
8. 注意事项
- 始终保留
src
作为降级方案 - 图片内容应保持各分辨率视觉一致,避免偏移或裁剪误差
- 使用构建工具(如 vite-imagetools、webpack responsive-loader)自动生成
srcSet
- 测试不同网络/设备下的加载效果
9. 总结
优点 | 说明 |
---|---|
📱 适配设备 | 支持 Retina、高分屏、不同视口宽度 |
⏱ 性能优化 | 提升加载速度、降低内存 |
💸 节省流量 | 减少不必要的资源下载 |
🧩 易集成 | 可与 React、Vue、Next.js、Nuxt 等框架结合使用 |
如果你正在开发电商、内容展示、博客、社交类项目,那么 srcSet
是实现高清图适配和性能优化不可或缺的工具。掌握 srcSet
,让你的网页视觉效果与性能双赢!