<source> 标签在 <picture> 中的核心用途是为同一张图片提供多套适配资源,通过设备特性(如屏幕尺寸、分辨率、图片格式支持)智能选择最佳图片加载,解决多分辨率适配问题并提升性能。
<source> 标签在 <picture> 中的具体作用- 多资源适配:允许为同一图片提供不同分辨率、格式或裁剪版本的资源,浏览器根据设备条件自动选择。
- 媒体查询控制:通过 media 属性设置条件(如屏幕宽度),实现不同设备下的图片切换。
- 格式优先级:利用 type 属性指定图片格式(如 WebP、AVIF),优先加载高效格式,同时兼容旧浏览器。
- 回退机制:<img> 标签作为最终保障,确保在不支持 <picture> 或所有 <source> 不匹配时显示基础图片。
多分辨率图片处理方案1. <picture> + <source> 组合核心逻辑:通过多个 <source> 标签定义不同条件下的图片资源,浏览器按优先级加载。
关键属性:
media:定义媒体查询条件(如 (min-width: 1200px)),控制图片加载的屏幕尺寸范围。
srcset:指定不同分辨率的图片源,支持两种描述符:
宽度描述符(w):如 srcset="image-300w.jpg 300w, image-600w.jpg 600w",浏览器根据设备像素密度和 sizes 属性选择最佳图片。
像素密度描述符(x):如 srcset="image-1x.jpg 1x, image-2x.jpg 2x",适用于简单密度适配(如 Retina 屏)。
sizes:配合 srcset 的 w 描述符,定义图片在不同视口下的预期显示宽度(如 sizes="(max-width: 600px) 100vw"),辅助浏览器选择资源。
示例代码:
<picture> <source srcset="large-image.avif" type="image/avif" media="(min-width: 1200px)"> <source srcset="medium-image.webp" type="image/webp" media="(min-width: 800px)"> <source srcset="small-image.webp" type="image/webp"> <img src="fallback.jpg" alt="描述图片"></picture>逻辑:浏览器从上到下检查 <source>,匹配第一个符合条件的标签并加载其 srcset 中的图片。
2. <img> + srcset/sizes 组合- 适用场景:图片内容无需“艺术方向”调整,仅需适配不同分辨率。
- 示例代码:<img srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w" sizes="(max-width: 600px) 100vw, 50vw" src="fallback.jpg" alt="描述图片">逻辑:浏览器根据 sizes 计算图片显示宽度,从 srcset 中选择固有宽度最接近的图片。
3. CSS image-set() 函数- 适用场景:处理背景图片的多分辨率适配。
- 示例代码:.hero { background-image: image-set( url("hero-1x.jpg") 1x, url("hero-2x.jpg") 2x );}逻辑:根据设备像素密度选择背景图片,但无法处理艺术方向或格式选择。
4. CDN 动态生成图片5. JavaScript 动态加载- 适用场景:需结合懒加载或复杂设备特性判断的场景。
- 逻辑:通过 JavaScript 检测设备条件(如屏幕尺寸、DPR),动态修改图片 src 或 srcset。缺点:增加客户端计算负担,可能导致加载延迟。
方案选择建议- 简单响应式需求:优先使用 <img> + srcset/sizes,代码简洁且兼容性好。
- 复杂适配需求(如艺术方向、格式优先级):选择 <picture> + <source>,提供最精细的控制。
- 背景图片处理:考虑 CSS image-set() 或 CDN 方案。
- 大型项目:评估 CDN 动态生成或 JavaScript 动态加载的自动化优势。
核心原则:根据项目复杂度、性能要求和团队技术栈,选择兼顾用户体验与开发效率的方案。