# 图像标签
图片是互联网的重要组成部分,让网页变得丰富多彩。本章介绍如何在网页插入图片。
## ``
`
`标签用于插入图片。它是单独使用的,没有闭合标签。
```html
```
上面代码在网页插入一张图片`foo.jpg`。`src`属性指定图片的网址,上例是相对 URL,表示图片与网页在同一个目录。
``默认是一个行内元素,与前后的文字处在同一行。
```html
Hello
World
```
上面代码中,图片可以像链接那样点击,点击后会产生跳转。
**(1)alt 属性**
`alt`属性用来设定图片的文字说明。图片不显示时(比如下载失败,或用户关闭图片加载),图片的位置上会显示该文本。
```html
```
上面代码中,`alt`是图片的说明。图片下载失败时,浏览器会在图片位置,显示文字“示例图片”。
**(2)width 属性,height 属性**
图片默认以原始大小插入网页,`width`属性和`height`属性可以指定图片显示时的宽度和高度,单位是像素或百分比。
```html
```
上面代码中,`width`属性指定图片显示的宽度为400像素,`height`属性指定显示高度为300像素。
注意,一旦设置了这两个属性,浏览器会在网页中预先留出这个大小的空间,不管图片有没有加载成功。不过,由于图片的显示大小可以用 CSS 设置,所以不建议使用这两个属性。
一种特殊情况是,`width`属性和`height`属性只设置了一个,另一个没有设置。这时,浏览器会根据图片的原始大小,自动设置对应比例的图片宽度或高度。举例来说,图片大小是 800像素 x 800像素,`width`属性设置成200,那么浏览器会自动将`height`设成200。
**(3)srcset,sizes**
详见下文的《响应式图像》部分。
**(4)referrerpolicy**
`
```
`crossorigin`属性如果省略值的部分,则等同于`anonymous`。
```html
```
**(6)loading**
浏览器的默认行为是,只要解析到`
```
由于行内图片的懒加载,可能会导致页面布局重排,所以使用这个属性的时候,最好指定图片的高和宽。
## `
const foo = 'hello';
```
上面代码在桌面端和手机上,插入的都是图像文件`foo.jpg`。
这种处理方法固然简单,但是有三大弊端。
**(1)体积**
一般来说,桌面端显示的是大尺寸的图像,文件体积较大。手机的屏幕较小,只需要小尺寸的图像,可以节省带宽,加速网页渲染。
**(2)像素密度**
桌面显示器一般是单倍像素密度,而手机的显示屏往往是多倍像素密度,即显示时多个像素合成为一个像素,这种屏幕称为 Retina 屏幕。图像文件很可能在桌面端很清晰,放到手机上会有点模糊,因为图像没有那么高的像素密度,浏览器自动把图像的每个像素复制到周围像素,满足像素密度的要求,导致图像的锐利度有所下降。
**(3)视觉风格**
桌面显示器的面积较大,图像可以容纳更多细节。手机的屏幕较小,许多细节是看不清的,需要突出重点。


上面两张图片,下方的手机图片经过裁剪以后,更突出图像重点,明显效果更好。
### `srcset`属性
为了解决上面这些问题,HTML 语言提供了一套完整的解决方案。首先,`
```
上面代码中,`srcset`属性给出了三个图像 URL,适应三种不同的像素密度。
图像 URL 后面的像素密度描述符,格式是像素密度倍数 + 字母`x`。`1x`表示单倍像素密度,可以省略。浏览器根据当前设备的像素密度,选择需要加载的图像。
如果`srcset`属性都不满足条件,那么就加载`src`属性指定的默认图像。
### `sizes`属性
像素密度的适配,只适合显示区域一样大小的图像。如果希望不同尺寸的屏幕,显示不同大小的图像,`srcset`属性就不够用了,必须搭配`sizes`属性。
第一步,`srcset`属性列出所有可用的图像。
```html
```
上面代码中,`srcset`属性列出四张可用的图像,每张图像的 URL 后面是一个空格,再加上宽度描述符。
宽度描述符就是图像原始的宽度,加上字符`w`。上例的四种图片的原始宽度分别为160像素、320像素、640像素和1280像素。
第二步,`sizes`属性列出不同设备的图像显示宽度。
`sizes`属性的值是一个逗号分隔的字符串,除了最后一部分,前面每个部分都是一个放在括号里面的媒体查询表达式,后面是一个空格,再加上图像的显示宽度。
```html
```
上面代码中,`sizes`属性给出了三种屏幕条件,以及对应的图像显示宽度。宽度不超过440像素的设备,图像显示宽度为100%;宽度441像素到900像素的设备,图像显示宽度为33%;宽度900像素以上的设备,图像显示宽度为`254px`。
第三步,浏览器根据当前设备的宽度,从`sizes`属性获得图像的显示宽度,然后从`srcset`属性找出最接近该宽度的图像,进行加载。
假定当前设备的屏幕宽度是`480px`,浏览器从`sizes`属性查询得到,图片的显示宽度是`33vw`(即33%),等于`160px`。`srcset`属性里面,正好有宽度等于`160px`的图片,于是加载`foo-160.jpg`。
如果省略`sizes`属性,那么浏览器将根据实际的图像显示宽度,从`srcset`属性选择最接近的图片。一旦使用`sizes`属性,就必须与`srcset`属性搭配使用,单独使用`sizes`属性是无效的。
## `