网络建立在链接的基础之上。我们能够点击/轻触链接并在网页之间导航的想法,正是“冲浪网络”成为家喻户晓的词语的原因。
即使没有任何 CSS 样式,HTML 中的链接看起来也与普通文本不同。
它们是蓝色的(如果已访问则为紫色)。它们带下划线。这就是链接最原始的形式。
但是,如果我们想稍微改变一下呢?也许蓝色不适合您网站的设计。也许您不喜欢下划线。无论出于何种原因,CSS 都允许我们像设置任何其他元素的样式一样设置链接的样式。我们只需在样式表中定位 元素即可。
想要使用不同的字体、更改颜色、移除下划线并将其全部大写?当然,为什么不呢?
a {
color: red;
text-decoration: none;
text-transform: uppercase;
}
现在我们开始步入正轨了!但为什么止步于此呢?让我们看看还可以通过哪些其他方式为链接设置样式以完善体验。
设置每个链接状态的样式
链接具有不同的状态,这意味着当我们在网页上与它们交互时,它们会进行调整。在更改链接的默认样式时,值得考虑链接的三个其他状态。
- 链接 (
:link
):这可能是使用频率最低的,但它用于为具有href
的<a>
元素设置样式,而不是占位符链接。 - 已访问 (
:visited
):用户之前在页面上点击过的链接的外观,此时鼠标光标不在其上方。出于安全原因,您可以应用于:visited
的样式受到限制。 - 悬停 (
:hover
):当鼠标光标放在链接上但未点击时 - 活动 (
:active
):当链接正在被点击时。它可能非常快,但这是鼠标按钮已被按下且点击尚未结束时。 - 焦点 (
:focus
):类似于:hover
,但使用键盘上的 Tab 键选择链接时。悬停和焦点状态通常一起设置样式。
请注意,那里的顺序很重要
- 链接
- 已访问
- 悬停
- 活动
- 焦点
如果您不按照此顺序进行操作(例如,假设您的 :visited
样式位于 :hover
样式之后),则链接的行为将与您期望的不符。在我的虚构示例中,:visited
样式将覆盖 :hover
样式,这极不可能是您想要的。焦点是一个辅助功能特性,因此最后设置,因为它最重要。
记住顺序的一种方法是LOVE 和 HATE。即 L(ink)OV(isted)E / H(over)A(Active)TE。
这是我们一直在查看的相同链接。首先,尝试将鼠标悬停在其上而不点击,并注意它会变成带下划线的样式。然后,点击链接,但将鼠标按钮保持按下状态一段时间,以查看活动样式如何将链接的颜色更改为黑色。最后,松开鼠标按钮,链接在技术上被访问之前应变为紫色。
链接似乎是一个简单的概念,但它们确实有很多内容——并且 CSS 为我们提供了强大的自定义体验的能力!
链接作为按钮
虽然对此有一些争论,但我们可以使用 CSS 使文本链接看起来像按钮。
与其他 HTML 元素一样,CSS 可以为链接添加背景颜色和填充,使我们能够创建按钮的外观。这是我们使用这些技术的链接
a {
background-color: red;
color: white;
padding: 1em 1.5em;
text-decoration: none;
text-transform: uppercase;
}
太好了!现在,让我们使用上一节中学到的状态更改功能来使我们的伪按钮更具交互性。我们将使按钮在悬停时变为深灰色,在活动时变为黑色,在访问后变为浅灰色
a {
background-color: red;
color: white;
padding: 1em 1.5em;
text-decoration: none;
text-transform: uppercase;
}
a:hover {
background-color: #555;
}
a:active {
background-color: black;
}
a:visited {
background-color: #ccc;
}
将链接设置为按钮样式并利用状态,我们可以创建一些非常酷的效果。例如,让我们创建一个具有深度的按钮,使其在活动时看起来像被按下,并在点击完成时弹回。
哦,还有光标!
我们已经深入研究了链接的样式,但还有一个组件我们不能忽视:光标。
光标指示鼠标在屏幕上的位置。我们习惯了标准的黑色箭头

我们可以将其在悬停 (:hover
) 状态下更改为手形指针,以便更容易地看出链接表示它是一个交互式元素

cursor:
pointer;
提供交互式提示。a:hover {
cursor: pointer;
}
哇,这好多了!现在,我们拥有一个非常漂亮的链接,它看起来像一个带适当交互式提示的按钮。
进阶
我们在这里涵盖了很多内容,但这仅仅触及了我们如何控制链接样式的表面。如果您已准备好进阶,那么以下是一些您可以从这里开始的资源
- Mailto 链接 – 用于链接电子邮件地址而不是网页的良好参考。
- 电话链接的现状 – 您知道可以链接电话号码吗?嗯,这就是方法。
- 光标 – CSS-Tricks 自定义光标的参考指南。
- 何时使用 Button 元素 – 如果您想知道链接按钮和传统表单按钮之间的区别,那么这是一个很好的概述,并建议在特定上下文中哪个更好。
- 按钮生成器 – 一个免费资源,用于生成链接按钮的 CSS。
为什么要更改
<a>
元素的光标?有时需要明确说明——当然不是建议更改,尽管我确信有一些用例。
如果您没有 href 属性,它将不会自动变成指针。
有时按钮或链接元素可以执行除了被按下之外的其他操作(手/指针手指更改)。所有 CSS 变体都有其用途和原因——https://w3schools.org.cn/cssref/pr_class_cursor.asp – 这是一个有用的工具。
我还没有完全接受这一点。链接本身看起来不错,但现在看起来出奇地像按钮!链接和按钮是两件不同的事物,除非我们讨论的是号召性用语中的类似按钮的链接,否则我认为人们期望他们的链接看起来像链接。
醒目的红色和全部大写文本也使此特定链接更难阅读(红色 = 恐慌/危险)。
我希望本示例中能更注重可访问性 (a11y)。例如,关注清晰的下划线,也许是悬停时的不同背景,清晰的颜色对比度。
我认为这篇文章的目的并不是要争论将链接设置为按钮样式是否是一个好主意——请参阅最后提供的更深入探讨该问题的资源。
在个人项目以及工作中的代码中,我一直都在反复考虑链接样式的问题,我决定从我的样式表中删除所有
a
标记都是链接的假设。我们工作中的应用程序是一个由遗留系统和一些我正在构建的新产品组成的平台,整个系统中充斥着各种
a
标签,有些充当按钮,有些是带有href
属性的合法链接,但一些a href
标签带有JS处理程序,阻止了默认行为(例如:导航到新页面),而是执行了一些额外的操作。我遇到的问题是,从语义上讲,
a
标签不是链接标签,而是一个锚标签。因此,我开始使用:link
伪类专门为锚添加样式,以确保我没有干扰平台其他部分的样式。从这里,我可以使用修饰符类(类似于Bootstrap)限定不同的链接,允许我的
.btn
样式遵循层叠样式并以不同的方式设置.btn:links
的样式,而无需使用过多的限定符或重新组织选择器,或使用!important
。我只是希望看到更多的人使用
:link
伪类使他们的样式更明确,并可能减轻项目中意外产生的副作用。使用
:link
执行此类操作的最大问题是它仅适用于未访问的链接。要覆盖所有链接,您需要:link, :visited
——因此,通常更容易只写a
。(当然,两者并不等价。:link, :visited
等价于a[href], area[href], link[href]
。)“锚”到底是什么意思?我其实不太确定。很久以前,
<a name=x>
用于添加#x
的哈希值以跳转到文档中的正确位置;但很多年以来,为元素添加id
一直是首选方法(例如<h1 id=x>
)。坦率地说,<a>
现在仅用于链接。我遗漏了提及触摸设备的行为。触摸行为现在应该成为基础的一部分了吧?
哦,当然!触摸在顶部有提到,这些基础知识在两种情况下都适用,除了
:active
和:hover
(尽管一些设备在触摸环境中处理这些)。您还有什么其他的基础知识吗?提醒一下,并非每个人都“悬停”在链接上。键盘用户“聚焦”在它们上面,重要的是这些用户能够区分链接何时处于焦点状态。通过将相同的样式规则应用于
:hover
和:focus
状态,可以轻松确保这一点。链接状态还有一个层次结构,许多人都会被它绊倒。我学习了以下助记符来记住定义链接状态样式的顺序:LoVe HAte(:_l_ink, :_v_isited, :_h_over [也包括:focus], :_a_ctive)。
为什么不使用LVHA顺序?
嗨!当然可以,但在本基础系列中,我主要关注具有
href
属性的链接的状态。从高层次来看,可以将锚元素视为“动作”元素——如
<a>
标签所示。所以,是的,它可以看起来像一个按钮——只要它能够促进动作即可。
除了MHLut、John Pisello和xfq之外,我还想强调
:focus
样式对于键盘用户的重要性。请参阅Web内容可访问性指南 (WCAG-2.0):使所有功能都可通过键盘访问。与其使用“LoVe HAte”,每个人都不应该忘记完整的助记符“LoVe (s)He FAked”,其中F代表Focus。
– 可以根据个人喜好添加或省略(s)。 ;-)