(四):srcset宽度描述符
最后更新于:2022-04-01 03:42:54
> 译文出处:http://www.w3cplus.com/responsive/responsive-images-101-part-4-srcset-width-descriptors.html
> 英文原文:http://blog.cloudfour.com/responsive-images-101-part-4-srcset-width-descriptors/
在[响应式图片101系列教程](http://www.w3cplus.com/blog/tags/509.html)中的[第三篇中](http://www.w3cplus.com/responsive/responsive-images-101-part-3-srcset-display-density.html),我们学习了显示密度描述,并且总结出它们适合用于固定宽度图片,但是对于自适应图片有所不足。
伸缩使图片就需要用到`srcset`的宽度描述符。
## 宽度描述符
宽度描述符的语法与屏幕密度描述符类似。`srcset`属性值是逗号分隔的图片源和描述列表。
![srcset宽度描述符](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-01_560cebdc753b9.png "srcset宽度描述符")
区别在于不是用`1x`,`2x`或其他值来表示密度,我们列出了图片源的宽度例如`320w`,`480w`等。
~~~
<img src="cat.jpg" alt="cat"
srcset="cat-160.jpg 160w, cat-320.jpg 320w, cat-640.jpg 640w, cat-1280.jpg 1280w">
~~~
图片源的宽度会让人很困惑。宽度描述符会根据分辨率来寻找图片源文件。
换句话说如果在一个图片编辑器中打开一张图片,它的分辨率是多少呢?获取图片的宽度放置在`srcset`属性中。
## 浏览器选择最佳图片资源
当使用宽度描述符,你给浏览器提供了一系列图片以及它们的真实宽度,因此浏览器可以选择最佳图片源。浏览器是怎么做的呢?
你的第一反应一定是浏览器检查页面上元素的尺寸并与图片列表尺寸对比。这有点道理,但实际上并不是这样。
我们来看,当浏览器开始下载图片时,通常它并不知道页面中图片的尺寸。
## 浏览器预加载和合理资源下载
如果查看浏览器渲染页面的时间线,你会发现一些引人注目的事情。
![图片宽度描述符](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-01_560cebdcafb98.jpg "图片宽度描述符")
就在浏览器下载HTML后不久,它继续请求CSS和JavaScript。但是在CSS和JavaScript完成下载前,浏览器开始下载图片。
因为CSS和JavaScript都没下载完成,浏览器下载图片时并不知道页面布局。由于不知道布局,它就不知道图片元素的尺寸。
顺带一提,预加载行为正是为什么[我们不能用CSS或JavaScript解决内联响应式图片的原因](http://www.brucelawson.co.uk/2015/why-we-cant-do-real-responsive-images-with-css-or-javascript/)。在浏览器开始下载时它们还不可用。
浏览器唯一知道的是视窗尺寸。一旦我们过渡到了显示密度选择符,一切都与视窗尺寸紧紧相关。
## 为什么影响呢?
视窗是真实图片尺寸的抽象替代品。用[Walmart’s Grocery](http://delivery.walmart.com/)页面上的图片作为例子:
![图片宽度描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-01_560cebdd2aae1.jpg "图片宽度描述")
在小视窗下,图片几乎和视窗宽度尺寸相同。
然而在大屏幕中,情况不同:
![图片宽度描述符](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-01_560cebde4a1bc.jpg "图片宽度描述符")
在第二个例子里,视窗宽度为`1540px`,但是图片宽度只有`254px`。知道视窗尺寸不足以给浏览器提供选择合适图片源的信息。
## 尺寸属性来解决!
我们如何让浏览器知道页面中的图片尺寸,从而让浏览器可以在`srcset`列表中下载正确的图片呢?如何使用图片尺寸属性,欢迎阅读本系列教程的第五部分——**图片尺寸**!