CSS伪类选择器是CSS中用于选择元素特定状态或位置的特殊关键字,它们让开发者能够根据用户行为、文档结构或元素状态动态地应用样式,而无需修改HTML结构或依赖JavaScript。
1. 伪类选择器基本概念与语法
伪类选择器以冒号(:
)开头,附加在基础选择器之后,用于定义元素在特定状态下的样式。其基本语法格式为:
selector:pseudo-class {
property: value;
}
例如,a:hover { color: red; }
表示当鼠标悬停在链接上时,链接文字变为红色。
2. 主要伪类选择器分类及应用
2.1 动态伪类选择器(用户交互伪类)
动态伪类根据用户交互行为改变元素样式:
:hover
- 鼠标悬停在元素上时的状态
button:hover { background-color: #4CAF50; }
:active
- 元素被激活(如鼠标按下)时的状态
button:active { background-color: green; }
:focus
- 元素获得焦点时的状态(常用于表单元素)
input:focus { border-color: blue; }
- 链接特定状态:
:link
- 未访问的链接:visited
- 已访问的链接
注意:定义链接状态伪类时,必须按照LVHA顺序(:link、:visited、:hover、:active)编写,否则可能失效。
2.2 结构伪类选择器
结构伪类根据元素在文档树中的位置进行选择:
:first-child
- 选择父元素的第一个子元素
ul li:first-child { font-weight: bold; }
:last-child
- 选择父元素的最后一个子元素:nth-child(n)
- 选择父元素的第n个子元素
/* 奇数行 */
tr:nth-child(odd) { background-color: #f2f2f2; }
/* 偶数行 */
li:nth-child(2n) { color: red; }
/* 前3个元素 */
div:nth-child(-n+3) { border-left: 3px solid #2196F3; }
:nth-of-type(n)
- 选择同类型兄弟元素中的第n个(与:nth-child
的区别在于它只计算同类型元素):empty
- 选择没有子元素的元素(包括文本节点)
2.3 UI元素状态伪类选择器
主要用于表单元素的状态反馈:
:checked
- 被选中的单选按钮或复选框
input[type="checkbox"]:checked { accent-color: #ff6b6b; }
:disabled
- 被禁用的表单元素
input:disabled { background: #f5f5f5; }
:enabled
- 可用的表单元素:valid
/:invalid
- 根据输入验证结果应用样式:required
- 标记为必填的输入字段
2.4 其他实用伪类选择器
:not(selector)
- 否定伪类,选择不匹配指定选择器的元素
div:not(.text3) { color: red; } /* 选择所有不包含text3类的div */
:target
- 当元素ID与URL锚点匹配时(如http://example.com/#section
):root
- 选择文档的根元素(通常是<html>
):lang(language)
- 根据语言属性选择元素
3. 伪类选择器使用技巧与注意事项
3.1 组合使用
伪类选择器可以组合使用以实现更精细的控制:
/* 鼠标悬停且获得焦点的按钮 */
button:hover:focus {
text-decoration: underline;
}
/* 已访问链接的悬停状态 */
a:visited:hover {
color: darkblue;
}
/* 偶数行的悬停效果 */
tr:nth-child(even):hover {
background: #f8f9fa;
}
3.2 实际应用场景
- 导航菜单:使用
:hover
提供悬停反馈 - 表单交互:使用
:focus
、:valid
、:invalid
增强用户体验 - 表格样式:使用
:nth-child()
实现斑马纹效果 - 内容过滤:使用
:not()
排除特定元素
3.3 注意事项
- 浏览器兼容性:部分伪类选择器在旧版浏览器中可能存在兼容性问题,需进行测试
- 性能考虑:避免过度复杂的选择器嵌套,尤其是结构伪类
- 移动端适配:
:hover
伪类在触摸屏设备上体验不佳,需提供替代方案 - 可访问性:不要仅依赖颜色变化表示状态,确保
:focus
状态明显可见
4. 伪类与伪元素的区别
需要注意的是,伪类(以单冒号:
开头)与伪元素(以双冒号::
开头,如::before
、::after
)有本质区别:
- 伪类选择元素的特定状态(如:hover、:focus)
- 伪元素创建元素的虚拟部分或插入内容(如::before、::first-line)
CSS伪类选择器是增强网页动态性和交互体验的强大工具,合理使用可以显著提升用户体验并减少对JavaScript的依赖。通过掌握这些选择器的特性和应用场景,开发者可以创建更加灵活和响应式的网页设计。