标签是HTML5中引入的一个强大元素,它为开发者提供了更灵活的图像资源管理方式。该标签主要用于让浏览器根据不同条件(如设备屏幕大小、分辨率或支持的图像格式)选择最适合当前显示环境的图像版本。
标签本身不显示任何内容,它作为
和
元素的容器,使得响应式图像实现变得更加简单高效。
在
标签出现之前,开发者主要依赖CSS媒体查询来实现响应式图像,但这种方法存在几个明显的缺点:
标签解决了这些问题,它让浏览器可以:
标签的基本结构如下:
<picture>
<source srcset="图片路径1" media="媒体查询条件">
<source srcset="图片路径2" media="媒体查询条件">
<source srcset="图片路径3" type="图像MIME类型">
<img src="默认图片路径" alt="图片描述">
picture>
浏览器会按照
元素的顺序评估它们,选择第一个匹配当前显示环境的版本。如果没有
元素匹配,或者浏览器不支持
标签,则会显示
元素。
image/webp
、image/jpeg
等
的浏览器显示的图像根据视口宽度提供不同分辨率的图像:
<picture>
<source srcset="large.jpg" media="(min-width: 1024px)">
<source srcset="medium.jpg" media="(min-width: 640px)">
<img src="small.jpg" alt="响应式图像示例">
picture>
根据浏览器支持提供现代图像格式,同时确保兼容性:
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="格式回退示例">
picture>
针对不同屏幕提供不同裁剪或构图的图像:
<picture>
<source srcset="desktop-crop.jpg" media="(min-width: 800px)">
<source srcset="tablet-crop.jpg" media="(min-width: 480px)">
<img src="mobile-crop.jpg" alt="艺术指导示例">
picture>
虽然现代浏览器都很好地支持
标签,但为了确保在所有环境中都能正常工作,建议:
![]()
作为最终回退选项![]()
元素设置明确的尺寸属性,避免内容跳动
<picture>
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="兼容性示例" width="800" height="600">
picture>
<picture>
<source
srcset="image-large.webp 1x, [email protected] 2x"
media="(min-width: 1024px)"
type="image/webp">
<source
srcset="image-medium.webp 1x, [email protected] 2x"
media="(min-width: 640px)"
type="image/webp">
<source
srcset="image-small.webp 1x, [email protected] 2x"
type="image/webp">
<img
src="image-small.jpg"
srcset="image-large.jpg 1024w, image-medium.jpg 640w, image-small.jpg 320w"
sizes="(min-width: 1024px) 1024px, (min-width: 640px) 640px, 320px"
alt="完整响应式图像示例"
width="100%"
height="auto">
picture>
<picture>
<source
srcset="landscape.jpg"
media="(orientation: landscape)">
<source
srcset="portrait.jpg"
media="(orientation: portrait)">
<img
src="default.jpg"
alt="根据屏幕方向适配的图像">
picture>
使用
标签时,可以采取以下措施进一步优化性能:
loading="lazy"
属性延迟加载视口外的图像<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img
src="image.jpg"
alt="优化示例"
width="800"
height="600"
loading="lazy"
decoding="async">
picture>
答: sizes
属性应该设置在
元素上,而不是
元素上。它告诉浏览器图像在不同视口宽度下的显示尺寸,帮助浏览器选择srcset
中最合适的图像。
答: 不建议这样做,因为浏览器会选择第一个匹配的
元素。如果有多个媒体查询相同的
,只有第一个会被考虑。
答: IE不支持
标签。在IE中,浏览器会回退到
元素。如果需要支持IE,建议使用polyfill或确保
提供合适的回退选项。
答: 可以在同一个
元素上同时使用media
和type
属性:
<source
srcset="image.webp"
media="(min-width: 800px)"
type="image/webp">
标签是现代响应式Web开发中不可或缺的工具,它提供了多种优势: