我对CSS已经有一段时间了,但是图像元素的srcset
和sizes
让我很困惑。
<img alt="Background image flowers"
srcset="img/flowers-480.jpg 480w,
img/flowers-480@2x.jpg 480w 2x,
img/flowers-768.jpg 768w,
img/flowers-768@2x.jpg 768w 2x,
img/flowers-960.jpg 960w,
img/flowers-960@2x.jpg 960w 2x,
img/flowers-1280.jpg 1280w,
img/flowers-1280@2x.jpg 1280w 2x"
sizes="(max-width: 1279px) 100vw,
(min-width: 1280) 1280px"
src="img/flowers-960.jpg">
这个想法是让一个图像100%的视口,直到视口是1280px宽或更宽,然后图像将是固定的大小。然而,为了补偿更高的DPI设备,我认为建议添加DPI描述符(1.5x,2x等),如建议here和here。
我认为上面的代码会做的是:
- 检查大小,查看图像的预期大小(如果给出了相对单位,如%或vw,则计算像素宽度)
- 查找srcset width中最接近该宽度的图像
- 从这些图像中,筛选出DPI描述符最接近设备DPI的图像
但是,当我将其通过验证程序时,我得到以下错误:
错误:元素img上属性srcset的值错误:图像img/flowers-480@2x.jpg
的宽度与图像img/flowers-480.jpg
的宽度相同
所以很明显,我完全没有理解srcset和sizes是如何工作的。我做错了什么?
5条答案
按热度按时间7kqas0il1#
如MDN上针对
<img srcset="...">
所定义:每个字符串由以下内容组成:
图像的URL,可选择空格,后跟一个:
w
”的正整数。宽度描述符除以sizes
属性中给定的源大小,以计算有效像素密度。x
”。你试图同时使用这两个词,这是违法的。
j13ufse22#
对于HPDI设置和图像响应大小的组合,您实际上应该使用带有几个
<source>
和一个备用<img>
元素的<picture>
。详细信息见本文。
am46iovg3#
根据MDN,“在同一个srcset属性中混合宽度描述符和像素密度描述符是不正确的。重复的描述符(例如,同一个srcset中的两个源都用'2x'描述)也是无效的。”
2x
刊登了4次,这是无效的。以下是MDN的一个示例:
示例4:使用
srcset
和sizes
属性使用'w'描述符时,在支持
srcset
的用户代理中忽略src
属性。当(max-width: 600px)
媒体条件匹配时,图像将为200px宽,否则为50vw宽(视口宽度的50%)。6rvt4ljy4#
@vbarinov的答案中链接的“艺术指导用例”(摘自developers.google.com)展示了如何将宽度和像素密度作为加载和显示图像源的标准:
在宽度至少为800像素的视口中,
head.jpg
应显示在单密度显示器上,而head-2x.jpg
应显示在双密度或更高密度的显示器上。低于800像素但宽度至少为450像素的单密度显示的视口应显示
head-small.jpg
,而head-small-2x.jpg
则用于双密度或更高密度。<img>
标记内的备用图像定义有另一个srcset
,它为宽度低于450像素的视口定义了双密度版本(head-fb-2x.jpg
)。不支持源集或图片元素的单密度设备和浏览器将退回到显示
head-fb.jpg
。在更复杂的场景中,我们还可以添加其他图像格式,以利用
webp
压缩,同时为不支持webp
的浏览器提供jpg
版本。下面是一个codepen的复杂例子。
f4t66c6m5#
我认为,到2022年,假设高DPI屏幕并利用
srcset
的断点概念会更容易: