网站

HTML <a>:锚元素 - MDN

:link - MDN

:visited - MDN

:hover - MDN

:focus - MDN

:active - MDN

引入

链接是网页里最常见的可交互元素之一。

如果不单独设置链接样式,用户有时候不容易分清它现在是未访问、已访问,还是鼠标移上去、键盘选中、正在点击的状态,所以 CSS 需要专门处理这些状态。

正文

定义

CSS 链接样式,主要是指给 <a> 元素的不同状态设置不同的显示效果。
这些状态通常通过伪类来表示,比如 :link:visited:hover:focus:active

可以把它理解成:同一个链接,在不同操作阶段看起来可以不一样。

这样做的目的,是让用户更清楚自己能点哪里、点过没有、当前操作到了哪里。

常见状态

伪类作用
:link选中未访问过的链接
:visited选中已访问过的链接
:hover选中鼠标移上去时的链接
:focus选中获得焦点的链接,常见于键盘 Tab 操作
:active选中鼠标按下去但还没松开时的链接

语法

最常见的写法就是直接给 <a> 元素加状态样式。

a:link {
  color: #2563eb;
}
 
a:visited {
  color: #7c3aed;
}
 
a:hover {
  color: #1d4ed8;
}
 
a:focus {
  outline: 2px solid #2563eb;
}
 
a:active {
  color: #dc2626;
}

这里的 a 是选择器,用于选中页面中的某些元素
:hover:focus 这些伪类,用于选中元素的某种状态

基础例子

先准备一个简单链接:

<a href="https://developer.mozilla.org/">查看 MDN 文档</a>

再给它设置样式:

a {
  color: #2563eb;
  text-decoration: underline;
}
 
a:hover {
  color: #1d4ed8;
}

这个例子的效果是:

  • 平时链接是蓝色
  • 鼠标移到链接上时,颜色会变深
  • 用户更容易意识到“这里可以点击”

示例:区分未访问和已访问链接

a:link {
  color: #2563eb;
}
 
a:visited {
  color: #6d28d9;
}

这个写法适合文章列表、文档导航、资料页。

用户看一眼就能知道哪些链接已经点过了。

示例:鼠标悬停时增强提示

a {
  text-decoration: none;
  color: #2563eb;
}
 
a:hover {
  text-decoration: underline;
}

这个例子是平时不显示下划线,鼠标移上去后再显示下划线。

常用于想让页面更简洁,但又不想完全失去链接提示的时候。

示例:补充键盘焦点样式

a:focus {
  outline: 2px solid #2563eb;
  outline-offset: 2px;
}

这个例子主要是给键盘操作用户看的。

当用户用 Tab 切换到链接时,页面会出现明显的焦点框,更容易知道当前选中了哪个链接。

示例:同时处理 :hover:focus

a:hover,
a:focus {
  color: #1d4ed8;
  text-decoration: underline;
}

这个写法很常见。

因为不是所有用户都用鼠标,有些用户会用键盘操作页面,所以不能只写 :hover,也要考虑 :focus

常见可设置的属性

属性作用
color设置链接文字颜色
text-decoration设置下划线、删除线等文本装饰
background-color设置链接背景色
outline设置获得焦点时的外轮廓
outline-offset设置外轮廓和元素之间的距离
font-weight设置文字粗细
cursor设置鼠标移上去时的指针样式

使用顺序

多个链接伪类一起写时,通常会注意顺序问题。

常见顺序是:

  1. :link
  2. :visited
  3. :hover
  4. :focus
  5. :active

示例:

a:link {
  color: #2563eb;
}
 
a:visited {
  color: #7c3aed;
}
 
a:hover {
  color: #1d4ed8;
}
 
a:focus {
  outline: 2px solid #2563eb;
}
 
a:active {
  color: #dc2626;
}

这样写更清楚,也更不容易把状态样式覆盖乱掉。

特点

  • 链接样式本质上是在处理 <a> 元素的不同状态
  • :hover 用于鼠标移上去时的效果
  • :focus 用于键盘或辅助工具选中时的效果
  • :visited 可以区分链接是否访问过
  • :active 表示用户正在点击这个链接
  • 链接样式会受到层叠、继承、优先级影响
  • 如果去掉链接默认下划线,最好提供其他明显提示
  • 只写 :hover 不够,还要考虑 :focus,这样更符合可访问性

注意事项

  • :visited 能设置的样式有限,浏览器会做一些限制,主要是为了保护用户隐私
  • 不要把普通文字和链接写得一模一样,不然用户不容易看出来哪里能点
  • 去掉 outline 之前要先想好替代方案,不然键盘用户会失去焦点提示
  • a:focusa:hover 经常要一起考虑
  • 如果链接像按钮一样使用,也要注意点击区域不能太小
  • 不建议为了“好看”把所有链接状态都做得差不多,状态变化明显一点更实用

引出

理解了链接的几种状态之后,可以继续学习 CSS 伪类,把这种“按状态选中元素”的思路扩展到更多元素上。

如果继续往下学,也可以结合 CSS 可访问性 一起看,会更容易理解为什么 :focus 不能随便省略。

理解

我觉得链接样式可以理解成“给网页里的跳转入口加状态反馈”。

链接不只是蓝色文字,它其实是一个会变化的交互元素。
用户有没有访问过、鼠标有没有移上去、键盘有没有选中、当前是不是正在点击,这些都可以通过 CSS 表现出来。

所以链接样式的重点不只是美化,而是让用户更容易发现链接、理解状态、顺利操作页面。