HTML5 <picture> 标签将帮助您根据屏幕宽度解析正确的图像源
显然浏览器的行为在过去 5 年没有太大变化,许多人仍然会下载隐藏的图像,即使它们上设置了 display: none 属性。
即使有 media queries 解决方法,它也只能在图像在 CSS 中设置为背景时才有用。
虽然我认为只有一个 JS 解决方案(lazy load、picturefill 等),但似乎有一个很好的纯 HTML 解决方案,它是开箱即用的 HTML5。
这就是<picture> 标签。
MDN 是这样描述它的:
HTML <picture> 元素 是一个容器,用于为其中包含的特定<img> 指定多个<source> 元素。浏览器会根据页面的当前布局(图像出现的框的约束)和显示的设备(例如普通或hiDPI设备)选择最合适的来源。
下面是如何使用它:
<picture>
<source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
<img src="mdn-logo-narrow.png" alt="MDN">
</picture>
背后的逻辑
浏览器会加载img标签的来源,只有在没有任何媒体规则适用的情况下。当浏览器不支持<picture> 元素时,它会再次回退到显示img 标签。
通常您会将最小的图像作为<img> 的来源,因此不会为较大的屏幕加载重图像。反之亦然,如果应用了媒体规则,则不会下载<img> 的来源,而是会下载对应<source> 标签的url 内容。
这里唯一的陷阱是,如果浏览器不支持该元素,它只会加载小图像。
另一方面,在 2017 年,我们应该以移动优先的方式进行思考和编码。
在有人过于退出之前,这是对<picture> 的当前浏览器支持:
桌面浏览器
移动浏览器
有关浏览器支持的更多信息,请访问 Can I use。
好在html5please 的句子是将它与后备一起使用。我个人打算听取他们的建议。
您可以在W3C's specification 中找到有关该标签的更多信息。那里有一个免责声明,我觉得很重要:
picture 元素与外观相似的video 和audio 元素有些不同。虽然它们都包含source 元素,但当元素嵌套在picture 元素中时,源元素的src 属性没有意义,并且资源选择算法不同。同样,picture 元素本身不显示任何内容;它只是为其包含的 img 元素提供一个上下文,使其能够从多个 URL 中进行选择。
所以它的意思是,它只是通过为图像提供一些上下文来帮助您提高加载图像时的性能。
您仍然可以使用一些 CSS 魔法来隐藏小型设备上的图像:
<style>
picture { display: none; }
@media (min-width: 600px) {
picture {
display: block;
}
}
</style>
<picture>
<source srcset="the-real-image-source" media="(min-width: 600px)">
<img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>
因此,浏览器将不显示实际图像,并且只会下载1x1 像素图像(如果您多次使用它可以缓存)。但是请注意,如果浏览器不支持<picture> 标签,即使在桌面屏幕上,实际图像也不会显示(所以你肯定需要一个 polyfill 备份) .