链接(hyperlink)是互联网的核心。它允许用户在页面上,从一个网址跳转到另一个网址,从而把所有资源联系在一起。
URL 是链接指向的地址。链接不仅可以指向另一个网页,也可以指向文本、图像、文件等资源。可以这样说,所有互联网上的资源,都可以通过链接访问。
<a>
链接通过<a>标签表示,用户点击后,浏览器会跳转到指定的网址。下面就是一个典型的链接。
<a href="https://wikipedia.org/">维基百科</a>
上面代码就定义了一个超级链接。浏览器显示“维基百科”,文字下面默认会有下划线,表示这是一个链接。用户点击后,浏览器跳转到href属性指定的网址。
href
<a>标签内部不仅可以放置文字,也可以放置其他元素,比如段落、图像、多媒体等等。
<a href="https://www.example.com/"> <img src="https://www.example.com/foo.jpg"> </a>
上面代码中,<a>标签内部就是一个图像。用户点击图像,就会跳转到指定网址。
<a>标签有如下属性。
(1)href
href属性给出链接指向的网址。它的值应该是一个 URL 或者锚点。
上文已经给出了完整 URL 的例子,下面是锚点的例子。
<a href="#demo">示例</a>
上面代码中,href属性的值是#加上锚点名称。点击后,浏览器会自动滚动,停在当前页面里面demo锚点所在的位置。
#
demo
(2)hreflang
hreflang属性给出链接指向的网址所使用的语言,纯粹是提示性的,没有实际功能。
hreflang
<a href="https://www.example.com" hreflang="en" >示例网址</a>
上面代码表明,href属性指向的网址的语言是英语。
该属性的值跟通用属性lang一样,语言代码可以参考《属性》一章的lang属性的介绍。
lang
(3)title
title属性给出链接的说明信息。鼠标悬停在链接上方时,浏览器会将这个属性的值,以提示块的形式显示出来。
title
<a href="https://www.example.com/" title="hello" >示例</a>。
上面代码中,用户鼠标停留在链接上面,会出现文字提示hello。
hello
(4)target
target属性指定如何展示打开的链接。它可以是在指定的窗口打开,也可以在<iframe>里面打开。
target
<iframe>
<p><a href="http://foo.com" target="test">foo</a></p> <p><a href="http://bar.com" target="test">bar</a></p>
上面代码中,两个链接都在名叫test的窗口打开。首先点击链接foo,浏览器发现没有叫做test的窗口,就新建一个窗口,起名为test,在该窗口打开foo.com。然后,用户又点击链接bar,由于已经存在test窗口,浏览器就在该窗口打开bar.com,取代里面已经打开的foo.com。
test
foo
foo.com
bar
bar.com
target属性的值也可以是以下四个关键字之一。
_self
_blank
_parent
_top
<a href="https://www.example.com" target="_blank" >示例链接</a>
上面代码点击后,浏览器会新建一个窗口,在该窗口打开链接,并且新窗口没有名字。
注意,使用target属性的时候,最好跟rel="noreferrer"一起使用,这样可以避免安全风险。
rel="noreferrer"
(5)rel
rel属性说明链接与当前页面的关系。
rel
<a href="help.html" rel="help">帮助</a>
上面代码的rel属性,说明链接是当前页面的帮助文档。
下面是一些常见的rel属性的值。
alternate
author
bookmark
external
help
license
next
nofollow
noreferrer
Referer
noopener
window.opener
prev
search
tag
(6)referrerpolicy
referrerpolicy属性用于精确设定点击链接时,浏览器发送 HTTP 头信息的Referer字段的行为。
referrerpolicy
该属性可以取下面八个值:no-referrer、no-referrer-when-downgrade、origin、origin-when-cross-origin、unsafe-url、same-origin、strict-origin、strict-origin-when-cross-origin。
no-referrer
no-referrer-when-downgrade
origin
origin-when-cross-origin
unsafe-url
same-origin
strict-origin
strict-origin-when-cross-origin
其中,no-referrer表示不发送Referer字段,same-origin表示同源时才发送Referer字段,origin表示只发送源信息(协议+域名+端口)。其他几项的解释,请查阅 HTTP 文档。
(7)ping
ping属性指定一个网址,用户点击的时候,会向该网址发出一个 POST 请求,通常用于跟踪用户的行为。
ping
(8)type
type属性给出链接 URL 的 MIME 类型,比如到底是网页,还是图像或文件。它也是纯粹提示性的属性,没有实际功能。
type
<a href="smile.jpg" type="image/jpeg" >示例图片</a>
上面代码中,type属性提示这是一张图片。
(9)download
download属性表明当前链接用于下载,而不是跳转到另一个 URL。
download
<a href="demo.txt" download>下载</a>
上面代码点击后,会出现下载对话框。
注意,download属性只在链接与网址同源时,才会生效。也就是说,链接应该与网址属于同一个网站。
如果download属性设置了值,那么这个值就是下载的文件名。
<a href="foo.exe" download="bar.exe" >点击下载</a>
上面代码中,下载文件的原始文件名是foo.exe。点击后,下载对话框提示的文件名是bar.exe。
foo.exe
bar.exe
注意,如果链接点击后,服务器的 HTTP 回应的头信息设置了Content-Disposition字段,并且该字段的值与download属性不一致,那么该字段优先,下载时将显示其设置的文件名。
Content-Disposition
download属性还有一个用途,就是有些地址不是真实网址,而是数据网址,比如data:开头的网址。这时,download属性可以为虚拟网址指定下载的文件名。
data:
<a href="data:,Hello%2C%20World!">点击</a>
上面链接点击后,会打开一个虚拟网页,上面显示Hello World!。
Hello World!
<a href="data:,Hello%2C%20World!" download="hello.txt" >点击</a>
上面链接点击后,下载的hello.txt文件内容就是“Hello, World!”。
hello.txt
链接也可以指向一个邮件地址,使用mailto协议。用户点击后,浏览器会打开本机默认的邮件程序,让用户向指定的地址发送邮件。
mailto
<a href="mailto:contact@example.com">联系我们</a>
上面代码中,链接就指向邮件地址。点击后,浏览器会打开一个邮件地址,让你可以向contact@example.com发送邮件。
contact@example.com
除了邮箱,邮件协议还允许指定其他几个邮件要素。
subject
cc
bcc
body
使用方法是将这些邮件要素,以查询字符串的方式,附加在邮箱地址后面。
<a href="mailto:foo@bar.com?cc=test@test.com&subject=The%20subject&body=The%20body" >发送邮件</a>
上面代码中,邮件链接里面不仅包含了邮箱地址,还包含了cc、subject、body等邮件要素。这些要素的值需要经过 URL 转义,比如空格转成%20。
%20
不指定邮箱也是允许的,就像下面这样。这时用户自己在邮件程序里面,填写想要发送的邮箱,通常用于邮件分享网页。
<a href="mailto:">告诉朋友</a>
如果是手机浏览的页面,还可以使用tel协议,创建电话链接。用户点击该链接,会唤起电话,可以进行拨号。
tel
<a href="tel:13312345678">13312345678</a>
上面代码在手机中,点击链接会唤起拨号界面,可以直接拨打指定号码。
<link>
<link>标签主要用于将当前网页与相关的外部资源联系起来,通常放在<head>元素里面。最常见的用途就是加载 CSS 样式表。
<head>
<link rel="stylesheet" type="text/css" href="theme.css">
上面代码为网页加载样式表theme.css。
theme.css
除了默认样式表,网页还可以加载替代样式表,即默认不生效、需要用户手动切换的样式表。
<link href="default.css" rel="stylesheet" title="Default Style"> <link href="fancy.css" rel="alternate stylesheet" title="Fancy"> <link href="basic.css" rel="alternate stylesheet" title="Basic">
上面代码中,default.css是默认样式表,默认就会生效。fancy.css和basic.css是替换样式表(rel="alternate stylesheet"),默认不生效。title属性在这里是必需的,用来在浏览器菜单里面列出这些样式表的名字,供用户选择,以替代默认样式表。
default.css
fancy.css
basic.css
rel="alternate stylesheet"
<link>还可以加载网站的 favicon 图标文件。
<link rel="icon" href="/favicon.ico" type="image/x-icon">
手机访问时,网站通常需要提供不同分辨率的图标文件。
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="favicon114.png"> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="favicon72.png">
上面代码指定 iPhone 设备需要的114像素和72像素的图标。
<link>也用于提供文档的相关链接,比如下面是给出文档的 RSS Feed 地址。
<link rel="alternate" type="application/atom+xml" href="/blog/news/atom">
rel属性表示外部资源与当前文档之间的关系,是<link>标签的必需属性。它可以但不限于取以下值。
dns-prefetch
icon
pingback
preconnect
prefetch
preload
prerender
stylesheet
下面是一些示例。
<!-- 作者信息 --> <link rel="author" href="humans.txt"> <!-- 版权信息 --> <link rel="license" href="copyright.html"> <!-- 另一个语言的版本 --> <link rel="alternate" href="https://es.example.com/" hreflang="es"> <!-- 联系方式 --> <link rel="me" href="https://google.com/profiles/someone" type="text/html"> <link rel="me" href="mailto:name@example.com"> <link rel="me" href="sms:+15035550125"> <!-- 历史资料 --> <link rel="archives" href="http://example.com/archives/"> <!-- 目录 --> <link rel="index" href="http://example.com/article/"> <!-- 导航 --> <link rel="first" href="http://example.com/article/"> <link rel="last" href="http://example.com/article/?page=42"> <link rel="prev" href="http://example.com/article/?page=1"> <link rel="next" href="http://example.com/article/?page=3">
某些情况下,你需要浏览器预加载某些资源,也就是先把资源缓存下来,等到使用的时候,就不用再从网上下载了,立即就能使用。预处理指令可以做到这一点。
预加载主要有下面五种类型。
(1)<link rel="preload">
<link rel="preload">
<link rel="preload">告诉浏览器尽快下载并缓存资源(如脚本或样式表),该指令优先级较高,浏览器肯定会执行。当加载页面几秒钟后需要该资源时,它会很有用。下载后,浏览器不会对资源执行任何操作,脚本未执行,样式表未应用。它只是缓存,当其他东西需要它时,它立即可用。
<link rel="preload" href="image.png" as="image">
rel="preload"除了优先级较高,还有两个优点:一是允许指定预加载资源的类型,二是允许onload事件的回调函数。下面是rel="preload"配合as属性,告诉浏览器预处理资源的类型,以便正确处理。
rel="preload"
onload
as
<link rel="preload" href="style.css" as="style"> <link rel="preload" href="main.js" as="script">
上面代码要求浏览器提前下载并缓存style.css和main.js。
style.css
main.js
as属性指定加载资源的类型,它的值一般有下面几种。
如果不指定as属性,或者它的值是浏览器不认识的,那么浏览器会以较低的优先级下载这个资源。
有时还需要type属性,进一步明确 MIME 类型。
<link rel="preload" href="sintel-short.mp4" as="video" type="video/mp4">
上面代码要求浏览器提前下载视频文件,并且说明这是 MP4 编码。
下面是预下载字体文件的例子。
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
注意,所有预下载的资源,只是下载到浏览器的缓存,并没有执行。如果希望资源预下载后立刻执行,可以参考下面的写法。
<link rel="preload" as="style" href="async_style.css" onload="this.rel='stylesheet'">
上面代码中,onload指定的回调函数会在脚本下载完成后执行,立即插入页面。
(2)<link rel="prefetch">
<link rel="prefetch">
<link rel="prefetch">的使用场合是,如果后续的页面需要某个资源,并且希望预加载该资源,以便加速页面渲染。该指令不是强制性的,优先级较低,浏览器不一定会执行。这意味着,浏览器可以不下载该资源,比如连接速度很慢时。
<link rel="prefetch" href="https://www.example.com/">
(3)<link rel="preconnect">
<link rel="preconnect">
<link rel="preconnect">要求浏览器提前与某个域名建立 TCP 连接。当你知道,很快就会请求该域名时,这会很有帮助。
<link rel="preconnect" href="https://www.example.com/">
(4)<link rel="dns-prefetch">
<link rel="dns-prefetch">
<link rel="dns-prefetch">要求浏览器提前执行某个域名的 DNS 解析。
<link rel="dns-prefetch" href="//example.com/">
(5)<link rel="prerender">
<link rel="prerender">
<link rel="prerender">要求浏览器加载某个网页,并且提前渲染它。用户点击指向该网页的链接时,就会立即呈现该页面。如果确定用户下一步会访问该页面,这会很有帮助。
<link rel="prerender" href="http://example.com/">
media属性给出外部资源生效的媒介条件。
media
<link href="print.css" rel="stylesheet" media="print"> <link href="mobile.css" rel="stylesheet" media="screen and (max-width: 600px)">
上面代码中,打印时加载print.css,移动设备访问时(设备宽度小于600像素)加载mobile.css。
print.css
mobile.css
下面是使用media属性实现条件加载的例子。
<link rel="preload" as="image" href="map.png" media="(max-width: 600px)"> <link rel="preload" as="script" href="map.js" media="(min-width: 601px)">
上面代码中,如果屏幕宽度在600像素以下,则只加载第一个资源,否则就加载第二个资源。
<link>标签的其他属性如下。
crossorigin
rel="prefetch"
sizes
<script>
<script>用于加载脚本代码,目前主要是加载 JavaScript 代码。
<script> console.log('hello world'); </script>
上面代码嵌入网页,会立即执行。
<script>也可以加载外部脚本,src属性给出外部脚本的地址。
src
<script src="javascript.js"></script>
上面代码会加载javascript.js脚本文件,并执行。
javascript.js
type属性给出脚本的类型,默认是 JavaScript 代码,所以可省略。完整的写法其实是下面这样。
<script type="text/javascript" src="javascript.js"></script>
type属性也可以设成module,表示这是一个 ES6 模块,不是传统脚本。
module
<script type="module" src="main.js"></script>
对于那些不支持 ES6 模块的浏览器,可以设置nomodule属性。支持 ES6 模块的浏览器,会不加载指定的脚本。这个属性通常与type="module"配合使用,作为老式浏览器的回退方案。
nomodule
type="module"
<script type="module" src="main.js"></script> <script nomodule src="fallback.js"></script>
<script>还有下面一些其他属性,大部分跟 JavaScript 语言有关,可以参考相关的 JavaScript 教程。
async
defer
integrity
nonce
<noscript>
<noscript>标签用于浏览器不支持或关闭 JavaScript 时,所要显示的内容。用户关闭 JavaScript 可能是为了节省带宽,以延长手机电池寿命,或者为了防止追踪,保护隐私。
<noscript> 您的浏览器不能执行 JavaScript 语言,页面无法正常显示。 </noscript>
上面这段代码,只有浏览器不能执行 JavaScript 代码时才会显示,否则就不会显示。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8