|
| 1 | +# <a> |
| 2 | + |
| 3 | +## 简介 |
| 4 | + |
| 5 | +链接(hyperlink)是互联网的核心。它允许用户在页面上,从一个网址跳转到另一个网址,从而把所有资源联系在一起。 |
| 6 | + |
| 7 | +`<a>`标签就代表一个可以跳转的链接。它不仅可以跳转到其他页面,也可以跳转到文本、图像、文件等资源,甚至当前页面的某个位置。可以这样说,所有互联网上的资源,都可以通过`<a>`访问。 |
| 8 | + |
| 9 | +下面就是一个典型的链接。 |
| 10 | + |
| 11 | +```html |
| 12 | +<a href="https://wikipedia.org/">维基百科</a> |
| 13 | +``` |
| 14 | + |
| 15 | +上面代码就定义了一个超级链接。浏览器显示“维基百科”,文字下面默认会有下划线,表示这是一个链接。用户点击后,浏览器跳转到`href`属性指定的网址。 |
| 16 | + |
| 17 | +`<a>`标签内部不仅可以放置文字,也可以放置其他元素,比如段落、图像、多媒体等等。 |
| 18 | + |
| 19 | +```html |
| 20 | +<a href="https://www.example.com/"> |
| 21 | + <img src="https://www.example.com/foo.jpg"> |
| 22 | +</a> |
| 23 | +``` |
| 24 | + |
| 25 | +上面代码中,`<a>`标签内部就是一个图像。用户点击图像,就会跳转到指定网址。 |
| 26 | + |
| 27 | +## 属性 |
| 28 | + |
| 29 | +`<a>`标签有如下属性。 |
| 30 | + |
| 31 | +### href |
| 32 | + |
| 33 | +`href`属性给出链接指向的网址。它的值应该是一个 URL 或者锚点。 |
| 34 | + |
| 35 | +上文已经给出了完整 URL 的例子,下面是锚点的例子。 |
| 36 | + |
| 37 | +```html |
| 38 | +<a href="#demo">示例</a> |
| 39 | +``` |
| 40 | + |
| 41 | +上面代码中,`href`属性的值是`#`加上锚点名称。点击后,浏览器会自动滚动,停在当前页面里面`demo`锚点所在的位置。 |
| 42 | + |
| 43 | +### hreflang |
| 44 | + |
| 45 | +`hreflang`属性给出链接指向的网址所使用的语言,纯粹是提示性的,没有实际功能,主要供搜索引擎使用。 |
| 46 | + |
| 47 | +```html |
| 48 | +<a |
| 49 | + href="https://www.example.com" |
| 50 | + hreflang="en" |
| 51 | +>示例网址</a> |
| 52 | +``` |
| 53 | + |
| 54 | +上面代码表明,`href`属性指向的网址的语言是英语。 |
| 55 | + |
| 56 | +如果某个资源有多种语言的不同版本,可以将`hreflang`设为`x-default`,表示哪一个链接是默认版本。 |
| 57 | + |
| 58 | +```html |
| 59 | +<a href="https://example.com" hreflang="x-default">English</a> |
| 60 | +<a href="https://example.com/de" hreflang="de">German</a> |
| 61 | +``` |
| 62 | + |
| 63 | +上面示例中,`hreflang`设为`x-defalut`表示该链接为默认版本。 |
| 64 | + |
| 65 | +`hreflang`属性所用的语言代码,跟通用的`lang`属性一样,可以参考《属性》一章的`lang`属性的介绍。 |
| 66 | + |
| 67 | +### title |
| 68 | + |
| 69 | +`title`属性给出链接的说明信息。鼠标悬停在链接上方时,浏览器会将这个属性的值,以提示块的形式显示出来。 |
| 70 | + |
| 71 | +```html |
| 72 | +<a |
| 73 | + href="https://www.example.com/" |
| 74 | + title="hello" |
| 75 | +>示例</a>。 |
| 76 | +``` |
| 77 | + |
| 78 | +上面代码中,用户鼠标停留在链接上面,会出现文字提示`hello`。 |
| 79 | + |
| 80 | +### target |
| 81 | + |
| 82 | +`target`属性指定如何展示打开的链接。它可以是在指定的窗口打开,也可以在`<iframe>`里面打开。 |
| 83 | + |
| 84 | +```html |
| 85 | +<p><a href="http://foo.com" target="test">foo</a></p> |
| 86 | +<p><a href="http://bar.com" target="test">bar</a></p> |
| 87 | +``` |
| 88 | + |
| 89 | +上面代码中,两个链接都在名叫`test`的窗口打开。首先点击链接`foo`,浏览器发现没有叫做`test`的窗口,就新建一个窗口,起名为`test`,在该窗口打开`foo.com`。然后,用户又点击链接`bar`,由于已经存在`test`窗口,浏览器就在该窗口打开`bar.com`,取代里面已经打开的`foo.com`。 |
| 90 | + |
| 91 | +`target`属性的值也可以是以下四个关键字之一。 |
| 92 | + |
| 93 | +- `_self`:当前窗口打开,这是默认值。 |
| 94 | +- `_blank`:新窗口打开。 |
| 95 | +- `_parent`:上层窗口打开,这通常用于从父窗口打开的子窗口,或者`<iframe>`里面的链接。如果当前窗口没有上层窗口,这个值等同于`_self`。 |
| 96 | +- `_top`:顶层窗口打开。如果当前窗口就是顶层窗口,这个值等同于`_self`。 |
| 97 | + |
| 98 | +```html |
| 99 | +<a |
| 100 | + href="https://www.example.com" |
| 101 | + target="_blank" |
| 102 | +>示例链接</a> |
| 103 | +``` |
| 104 | + |
| 105 | +上面代码点击后,浏览器会新建一个窗口,在该窗口打开链接,并且新窗口没有名字。 |
| 106 | + |
| 107 | +注意,使用`target`属性的时候,最好跟`rel="noreferrer"`一起使用,这样可以避免安全风险。 |
| 108 | + |
| 109 | +### rel |
| 110 | + |
| 111 | +`rel`属性说明链接与当前页面的关系。 |
| 112 | + |
| 113 | +```html |
| 114 | +<a href="help.html" rel="help">帮助</a> |
| 115 | +``` |
| 116 | + |
| 117 | +上面代码的`rel`属性,说明链接是当前页面的帮助文档。 |
| 118 | + |
| 119 | +下面是一些常见的`rel`属性的值。 |
| 120 | + |
| 121 | +- `alternate`:当前文档的另一种形式,比如翻译。 |
| 122 | +- `author`:作者链接。 |
| 123 | +- `bookmark`:用作书签的永久地址。 |
| 124 | +- `external`:当前文档的外部参考文档。 |
| 125 | +- `help`:帮助链接。 |
| 126 | +- `license`:许可证链接。 |
| 127 | +- `next`:系列文档的下一篇。 |
| 128 | +- `nofollow`:告诉搜索引擎忽略该链接,主要用于用户提交的内容,防止有人企图通过添加链接,提高该链接的搜索排名。 |
| 129 | +- `noreferrer`:告诉浏览器打开链接时,不要将当前网址作为 HTTP 头信息的`Referer`字段发送出去,这样可以隐藏点击的来源。 |
| 130 | +- `noopener`:告诉浏览器打开链接时,不让链接窗口通过 JavaScript 的`window.opener`属性引用原始窗口,这样就提高了安全性。 |
| 131 | +- `prev`:系列文档的上一篇。 |
| 132 | +- `search`:文档的搜索链接。 |
| 133 | +- `tag`:文档的标签链接。 |
| 134 | + |
| 135 | +### referrerpolicy |
| 136 | + |
| 137 | +`referrerpolicy`属性用于精确设定点击链接时,浏览器发送 HTTP 头信息的`Referer`字段的行为。 |
| 138 | + |
| 139 | +该属性可以取下面八个值:`no-referrer`、`no-referrer-when-downgrade`、`origin`、`origin-when-cross-origin`、`unsafe-url`、`same-origin`、`strict-origin`、`strict-origin-when-cross-origin`。 |
| 140 | + |
| 141 | +其中,`no-referrer`表示不发送`Referer`字段,`same-origin`表示同源时才发送`Referer`字段,`origin`表示只发送源信息(协议+域名+端口)。其他几项的解释,请查阅 HTTP 文档。 |
| 142 | + |
| 143 | +### ping |
| 144 | + |
| 145 | +`ping`属性指定一个网址,用户点击的时候,会向该网址发出一个 POST 请求,通常用于跟踪用户的行为。 |
| 146 | + |
| 147 | +```html |
| 148 | +<a href="http://localhost:3000/other" ping="http://localhost:3000/log"> |
| 149 | + Go to Other Page |
| 150 | +</a> |
| 151 | +``` |
| 152 | + |
| 153 | +上面示例中,用户点击链接时,除了发生跳转,还会向`http://localhost:3000/log`发送一个 POST 请求。服务端收到这个请求以后,就会知道用户点击了这个链接。 |
| 154 | + |
| 155 | +这个请求的 HTTP 标头,包含了`ping-from`属性(点击行为发生的页面)和`ping-to`属性(`href`属性所指向的页面)。 |
| 156 | + |
| 157 | +```http |
| 158 | +headers: { |
| 159 | + 'ping-from': 'http://localhost:3000/', |
| 160 | + 'ping-to': 'http://localhost:3000/other' |
| 161 | + 'content-type': 'text/ping' |
| 162 | + // ...other headers |
| 163 | +}, |
| 164 | +``` |
| 165 | + |
| 166 | +注意,`ping`属性只对链接有效,对其他的交互行为无效,比如按钮点击或表单提交。另外,Firefox 浏览器不支持该属性。并且,也无法让它发送任何的自定义数据。 |
| 167 | + |
| 168 | +### type |
| 169 | + |
| 170 | +`type`属性给出链接 URL 的 MIME 类型,比如到底是网页,还是图像或文件。它也是纯粹提示性的属性,没有实际功能。 |
| 171 | + |
| 172 | +```html |
| 173 | +<a |
| 174 | + href="smile.jpg" |
| 175 | + type="image/jpeg" |
| 176 | +>示例图片</a> |
| 177 | +``` |
| 178 | + |
| 179 | +上面代码中,`type`属性提示这是一张图片。 |
| 180 | + |
| 181 | +### download |
| 182 | + |
| 183 | +`download`属性表明当前链接用于下载,而不是跳转到另一个 URL。 |
| 184 | + |
| 185 | +```html |
| 186 | +<a href="demo.txt" download>下载</a> |
| 187 | +``` |
| 188 | + |
| 189 | +上面代码点击后,会出现下载对话框。 |
| 190 | + |
| 191 | +注意,`download`属性只在链接与网址同源时,才会生效。也就是说,链接应该与网址属于同一个网站。 |
| 192 | + |
| 193 | +如果`download`属性设置了值,那么这个值就是下载的文件名。 |
| 194 | + |
| 195 | +```html |
| 196 | +<a |
| 197 | + href="foo.exe" |
| 198 | + download="bar.exe" |
| 199 | +>点击下载</a> |
| 200 | +``` |
| 201 | + |
| 202 | +上面代码中,下载文件的原始文件名是`foo.exe`。点击后,下载对话框提示的文件名是`bar.exe`。 |
| 203 | + |
| 204 | +注意,如果链接点击后,服务器的 HTTP 回应的头信息设置了`Content-Disposition`字段,并且该字段的值与`download`属性不一致,那么该字段优先,下载时将显示其设置的文件名。 |
| 205 | + |
| 206 | +`download`属性还有一个用途,就是有些地址不是真实网址,而是数据网址,比如`data:`开头的网址。这时,`download`属性可以为虚拟网址指定下载的文件名。 |
| 207 | + |
| 208 | +```html |
| 209 | +<a href="data:,Hello%2C%20World!">点击</a> |
| 210 | +``` |
| 211 | + |
| 212 | +上面链接点击后,会打开一个虚拟网页,上面显示`Hello World!`。 |
| 213 | + |
| 214 | + |
| 215 | +```html |
| 216 | +<a |
| 217 | + href="data:,Hello%2C%20World!" |
| 218 | + download="hello.txt" |
| 219 | +>点击</a> |
| 220 | +``` |
| 221 | + |
| 222 | +上面链接点击后,下载的`hello.txt`文件内容就是“Hello, World!”。 |
| 223 | + |
| 224 | +## 邮件链接 |
| 225 | + |
| 226 | +链接也可以指向一个邮件地址,使用`mailto`协议。用户点击后,浏览器会打开本机默认的邮件程序,让用户向指定的地址发送邮件。 |
| 227 | + |
| 228 | +```html |
| 229 | +<a href="mailto:contact@example.com">联系我们</a> |
| 230 | +``` |
| 231 | + |
| 232 | +上面代码中,链接就指向邮件地址。点击后,浏览器会打开一个邮件地址,让你可以向`contact@example.com`发送邮件。 |
| 233 | + |
| 234 | +除了邮箱,邮件协议还允许指定其他几个邮件要素。 |
| 235 | + |
| 236 | +- `subject`:主题 |
| 237 | +- `cc`:抄送 |
| 238 | +- `bcc`:密送 |
| 239 | +- `body`:邮件内容 |
| 240 | + |
| 241 | +使用方法是将这些邮件要素,以查询字符串的方式,附加在邮箱地址后面。 |
| 242 | + |
| 243 | +```html |
| 244 | +<a |
| 245 | + href="mailto:foo@bar.com?cc=test@test.com&subject=The%20subject&body=The%20body" |
| 246 | +>发送邮件</a> |
| 247 | +``` |
| 248 | + |
| 249 | +上面代码中,邮件链接里面不仅包含了邮箱地址,还包含了`cc`、`subject`、`body`等邮件要素。这些要素的值需要经过 URL 转义,比如空格转成`%20`。 |
| 250 | + |
| 251 | +不指定邮箱也是允许的,就像下面这样。这时用户自己在邮件程序里面,填写想要发送的邮箱,通常用于邮件分享网页。 |
| 252 | + |
| 253 | +```html |
| 254 | +<a href="mailto:">告诉朋友</a> |
| 255 | +``` |
| 256 | + |
| 257 | +## 电话链接 |
| 258 | + |
| 259 | +如果是手机浏览的页面,还可以使用`tel`协议,创建电话链接。用户点击该链接,会唤起电话,可以进行拨号。 |
| 260 | + |
| 261 | +```html |
| 262 | +<a href="tel:13312345678">13312345678</a> |
| 263 | +``` |
| 264 | + |
| 265 | +上面代码在手机中,点击链接会唤起拨号界面,可以直接拨打指定号码。 |
| 266 | + |
0 commit comments