伪类和伪元素
接下来我们将要介绍的选择器被称为**伪类**和**伪元素**。它们有很多,而且通常用于非常特定的目的。一旦您知道如何使用它们,就可以查看列表,看看是否有适合您尝试完成的任务的内容。同样,每个选择器的相关 MDN 页面有助于解释浏览器支持。
什么是伪类?
伪类是一种选择器,用于选择处于特定状态的元素,例如,它们是其类型的第一个元素,或者鼠标指针悬停在它们上面。它们往往表现得好像您已将一个类应用到文档的某个部分,通常有助于减少标记中的多余类,并提供更灵活、更易于维护的代码。
伪类是以冒号开头的关键字。例如,:hover
是一个伪类。
简单的伪类示例
让我们来看一个简单的例子。如果我们想使文章中的第一个段落更大且加粗,我们可以向该段落添加一个类,然后向该类添加 CSS,如下面的第一个示例所示
但是,这可能难以维护——如果在文档顶部添加了一个新的段落怎么办?我们需要将类移动到新段落。与其添加类,不如使用 :first-child
伪类选择器——这将始终定位文章中的第一个子元素,并且我们不再需要编辑 HTML(这可能并不总是可能的,可能是由于它是由 CMS 生成的)。
所有伪类的行为都与此类似。它们定位文档中处于某种状态的某一部分,表现得好像您已在 HTML 中添加了一个类。在 MDN 上查看一些其他示例
注意:在没有元素选择器位于其前面时编写伪类和伪元素是有效的。在上面的示例中,您可以编写 :first-child
,并且规则将应用于任何作为 <article>
元素的第一个子元素的元素,而不仅仅是段落的第一个子元素——:first-child
等效于 *:first-child
。但是,通常您希望获得比这更多的控制,因此您需要更具体。
用户操作伪类
什么是伪元素?
伪元素的行为类似。但是,它们表现得好像您已将一个全新的 HTML 元素添加到标记中,而不是将一个类应用到现有元素。
伪元素以双冒号::
开头。::before
就是一个伪元素的例子。
注意:一些早期的伪元素使用单冒号语法,因此您有时可能会在代码或示例中看到它。为了向后兼容,现代浏览器支持使用单冒号或双冒号语法的早期伪元素。
例如,如果您想选择段落的首行,您可以将其包裹在一个<span>
元素中并使用元素选择器;但是,如果您包裹的单词数量比父元素的宽度长或短,则此方法会失效。由于我们通常不知道一行上能容纳多少个单词——因为如果屏幕宽度或字体大小发生变化,这个数字也会随之改变——因此无法通过添加 HTML 来可靠地实现这一点。
::first-line
伪元素选择器可以可靠地为您做到这一点——如果单词数量增加或减少,它仍然只会选择第一行。
它的作用就像一个<span>
元素神奇地包裹在第一行格式化文本周围,并在行长发生变化时更新。
您可以看到,这会选择两个段落的第一行。
组合伪类和伪元素
如果您想使第一个段落的第一行变为粗体,可以将:first-child
和::first-line
选择器链接在一起。尝试编辑前面的实时示例,使其使用以下 CSS。我们的意思是,我们想要选择第一个<p>
元素的第一行,该元素位于<article>
元素内。
article p:first-child::first-line {
font-size: 120%;
font-weight: bold;
}
使用 ::before 和 ::after 生成内容
有一些特殊的伪元素,它们与content
属性一起使用,用于使用 CSS 将内容插入到您的文档中。
您可以使用它们插入一段文本,例如下面的实时示例。尝试更改content
属性的文本值,并查看它在输出中的变化。您还可以将::before
伪元素更改为::after
,并查看文本插入到元素的末尾而不是开头。
然而,从 CSS 中插入文本字符串并不是我们在网络上经常做的事情,因为这些文本对于某些屏幕阅读器来说是不可访问的,并且将来可能难以被某些人找到和编辑。
这些伪元素更有效的用途是插入图标,例如下面示例中添加的小箭头,这是一个我们不希望屏幕阅读器读出的视觉指示器。
这些伪元素也经常用于插入空字符串,然后可以像页面上的任何元素一样对其进行样式设置。
在下一个示例中,我们使用::before
伪元素添加了一个空字符串。为了能够使用宽度和高度对其进行样式设置,我们将其设置为display: block
。然后我们使用 CSS 对其进行样式设置,就像任何元素一样。您可以试着修改 CSS,并改变它的外观和行为。
::before
和::after
伪元素以及content
属性的使用在 CSS 中被称为“生成内容”,您会经常看到此技术被用于各种任务。一个很好的例子是网站CSS Arrow Please,它可以帮助您使用 CSS 生成箭头。在创建箭头时查看 CSS,您会看到正在使用的::before
和::after
伪元素。每当您看到这些选择器时,请查看content
属性以了解正在添加到 HTML 元素中的内容。
总结
在本文中,我们介绍了 CSS 伪类和伪元素,它们是特殊类型的选择器。
伪类使您能够在元素处于特定状态时将其作为目标,就像您为该状态向 DOM 添加了一个类一样。伪元素就像您向 DOM 添加了一个全新的元素,并使您能够对其进行样式设置。::before
和::after
伪元素使您能够使用 CSS 将内容插入到文档中。
在下一篇文章中,我们将学习组合器。