什么是伪类选择器(Pseudo-Class Selectors)?
在 CSS 中,伪类选择器(Pseudo-Class Selectors) 是一种特殊的选择器,它允许你选择处于特定状态的 HTML 元素,而这些状态通常不能通过简单的元素、类或 ID 选择器来表示。
简单来说,伪类选择器就是给元素增加一种“虚拟的类别”,这种类别是基于元素在文档树中的位置、元素的状态(比如鼠标悬停、被点击、未访问过等),或者元素的内容来定义的。它们不是真正的 HTML 属性或类名。
为什么需要伪类选择器?
想象一下,你想要:
-
当用户把鼠标放到一个链接上时,改变链接的颜色。
-
给列表中的奇数行或偶数行设置不同的背景色,以便于阅读。
-
选择一个表单输入框在用户聚焦时(点击进入输入状态)的样式。
-
选择一个段落中的第一行或第一个字母进行特殊样式设置。
这些“状态”或“位置”无法通过常规的 HTML 标记来实现,这时伪类选择器就派上用场了。
伪类选择器的语法
伪类选择器的语法以一个冒号 (:
) 开头,后面跟着伪类的名称:
selector:pseudo-class {
property: value;
}
常见的伪类选择器示例
伪类选择器有很多种,根据它们的作用可以分为几大类:
1. 链接和用户行为伪类
这些是最常见的伪类,用于根据用户的交互状态来改变元素的样式。
-
:link
: 选择未访问过的链接。CSSa:link { color: blue; }
-
:visited
: 选择已访问过的链接。出于隐私考虑,能设置的样式属性非常有限(主要是颜色)。CSSa:visited { color: purple; }
-
:hover
: 选择当鼠标指针悬停在元素上时。CSSa:hover { color: red; /* 鼠标悬停时变为红色 */ }
-
:active
: 选择当元素被激活时(例如,鼠标点击下去但尚未松开)。CSSa:active { color: green; /* 点击时变为绿色 */ }
-
:focus
: 选择当元素获得焦点时(例如,通过点击、触摸或 Tab 键导航到输入框)。CSSinput:focus { border: 2px solid blue; /* 聚焦时边框变蓝 */ }
2. 结构性伪类
这些伪类根据元素在文档结构中的位置来选择元素。
-
:first-child
: 选择父元素的第一个子元素。CSSli:first-child { font-weight: bold; /* 列表的第一个子项加粗 */ }
-
:last-child
: 选择父元素的最后一个子元素。CSSli:last-child { border-bottom: none; /* 列表的最后一个子项没有下边框 */ }
-
:nth-child(n)
: 选择父元素的第n
个子元素。n
可以是数字、关键字(even
偶数,odd
奇数)或公式(如2n
、2n+1
)。CSSli:nth-child(odd) { /* 选择奇数行的列表项 */ background-color: #f2f2f2; } li:nth-child(2n) { /* 选择偶数行的列表项 */ background-color: #e0e0e0; }
-
:only-child
: 选择是其父元素的唯一子元素的元素。 -
:root
: 选择文档的根元素(通常是<html>
)。
3. 表单相关伪类
-
:checked
: 选择被用户选中(checked)的单选框或复选框。CSSinput[type="checkbox"]:checked + label { font-weight: bold; /* 选中复选框时,旁边的label加粗 */ }
-
:disabled
: 选择被禁用(disabled)的表单元素。 -
:enabled
: 选择可用的(enabled)表单元素。 -
:required
: 选择带有required
属性的表单元素。 -
:valid
: 选择内容合法的表单元素(例如,满足 email 格式)。 -
:invalid
: 选择内容不合法的表单元素。
4. 其他伪类
-
:not(selector)
: 选择不匹配指定选择器的元素。这是一个否定伪类。CSSp:not(.intro) { /* 选择所有不是intro类的段落 */ margin-top: 1em; }
-
:empty
: 选择**不包含任何子元素(包括文本节点)**的元素。 -
:target
: 选择当前活动的片段(通常是 URL 哈希后面的 ID)。 -
:lang(language)
: 选择具有指定语言的元素。