如何在 HTML 中创建链接
链接就是带有 href 属性的锚元素 <a>。href 是链接的去处;标签之间的内容是读者点击的部分。
浏览器会把链接显示为蓝色带下划线,并把鼠标指针变成手形。最后一行说明了 href 为什么重要:没有它,<a> 就只是普通文字。它无法获得焦点,无法点击,也不会显示为链接样式。
绝对 URL 与相对 URL
href 的值决定链接去往哪里。主要的写法:
href | 去往 |
|---|---|
https://example.com/page | 绝对 URL:就是这个地址 |
/about | 当前网站根目录下的 about |
about.html | 与当前页面同一文件夹中的 about.html |
../index.html | 上一级文件夹中的 index.html |
#pricing | 本页中 id="pricing" 的元素 |
/help#faq | 本站另一个页面中的 faq 部分 |
mailto:hi@example.com | 在读者的邮件应用中新建一封邮件 |
tel:+15551234567 | 在能打电话的设备上拨打电话 |
链接到其他网站时用绝对 URL,在自己网站内部用以根目录开头的路径(/about):即使包含链接的页面被移到其他文件夹,它们依然有效。
<a href="https://www.wikipedia.org/">Wikipedia</a> <!-- another site -->
<a href="/pricing">Pricing</a> <!-- same site, from the root -->
<a href="www.wikipedia.org">Broken</a> <!-- relative path, not a site! -->
最后一行是最常见的链接 bug。没有 https:// 时,浏览器会把 www.wikipedia.org 当作当前文件夹中的一个文件名。
电子邮件和电话链接有单独的页面:HTML 邮件链接。
链接到页面的某个部分
任何带有 id 的元素都可以作为目标。用 # 加上 id 链接到它,浏览器就会滚动到那里。点击预览中的链接试试:
一些细节:
- id 必须完全一致,包括大小写。
href="#FAQ"找不到id="faq"。 href="#top"和href="#"会滚动到页面顶部,即使没有元素的 id 是top。:target选择器可以为 URL 当前指向的部分设置样式。在真实页面上它会高亮显示;预览滚动时不会改变地址,所以这里看不到高亮。- 要链接到另一个页面的某个部分,把井号加在那个页面的 URL 后面:
<a href="/docs/html/table#caption">。
固定页头下的锚点链接
粘性或固定的页头会遮住你跳转到的那部分内容的顶部。在目标上设置 scroll-margin-top 可以为页头留出空间,scroll-behavior: smooth 则让跳转带有动画:
删掉 scroll-margin-top 那一行,再点击 Two:标题会被藏在深色页头后面。
下载链接
download 属性让浏览器保存文件,而不是打开它。如果给它一个值,这个值就是建议的文件名:
<a href="/files/report-2026.pdf" download>Download the report</a>
<a href="/files/r-8f2a.pdf" download="report.pdf">Download (saved as report.pdf)</a>
download 只对与页面同源(协议、主机和端口都相同)的文件以及 data: 和 blob: URL 有效。对于其他源的文件,哪怕是子域名,浏览器都会忽略它,像普通链接一样跳转到文件。服务器可以用 Content-Disposition: attachment 响应头强制下载任何文件。
有意义的链接文字
使用屏幕阅读器的用户常常逐个链接地浏览页面,只听到链接文字。“点击这里”和“阅读更多”对他们来说毫无信息。
<!-- Vague: -->
To see our prices, <a href="/pricing">click here</a>.
<!-- Clear: -->
See the <a href="/pricing">pricing plans</a>.
title 属性会在鼠标悬停时显示提示,但在触摸屏上不会显示,大多数键盘用户也看不到,所以不要把任何重要的内容放在里面。
让整张卡片成为链接
<a> 可以包裹块级内容:标题、图片和段落可以合成一个链接。可点击的卡片就是这样做的。
display: block 让整个盒子都可以点击,而不只是文字。卡片内容要保持简短,因为屏幕阅读器会把全部内容读作链接的名称。另外,永远不要在里面再放链接或按钮:交互元素不能嵌套在 <a> 中。
a 标签的其他属性
| 属性 | 作用 |
|---|---|
href | 目标地址。没有它,<a> 就不是链接 |
target | 在哪里打开;target="_blank" 会在新标签页中打开,参见在新标签页中打开链接 |
rel | 与目标的关系:noopener、nofollow、sponsored、ugc |
download | 保存文件而不是打开它 |
hreflang | 被链接页面的语言,作为提示 |
referrerpolicy | 作为来源(referrer)发送多少当前 URL 的信息 |
常见错误
- 外部 URL 没有写协议。
href="www.site.com"是相对路径。请写上https://。 - 用
<a href="#">执行 JavaScript 操作。 它会滚动到页面顶部,并在 URL 后加上#。如果点击后并不跳转到任何地方,请使用<button>。 - 链接里嵌套链接,或者链接里放按钮。两者都是无效的 HTML:第二个
<a>会让解析器提前关闭第一个,而点击链接里的按钮时也没有明确的目标。 - 文件名中有空格。
href="my file.html"通常能用,因为浏览器会对空格进行编码,但用my-file.html就完全不必考虑这个问题。 - 用“点击这里”作为链接文字。 请改为描述目标页面。
- id 的大小写不一致。
#Pricing和id="pricing"是不同的。
常见问题
如何在 HTML 中创建链接?
使用锚元素:<a href="https://example.com">Example</a>。href 是目标地址,标签之间的文字是读者点击的内容。
href 是什么意思?
超文本引用(hypertext reference)。它存放链接指向的 URL:完整的地址,同一网站上的路径(如 /about),页面中的某个部分(如 #pricing),或者 mailto: 这样的协议。
如何链接到页面的某个特定部分?
给目标元素设置 id,然后用井号链接到它:<h2 id="faq">FAQ</h2> 和 <a href="#faq">FAQ</a>。从其他页面链接时,把井号加在 URL 后面:<a href="/help#faq">。
为什么我写了 www 的链接会跳到错误的页面?
没有 https:// 时,浏览器会把 www.example.com 当作你自己网站上的相对路径,于是链接会跳到类似 yoursite.com/www.example.com 的地址。外部链接一定要写上协议:href="https://www.example.com"。
a 标签里可以放 div 吗?
可以。在 HTML5 中,<a> 可以包裹块级内容,比如 <div>、标题和段落,整张卡片可点击的链接就是这样做的。但它不能包含另一个链接、按钮或任何其他交互元素。