1. 定义和概念
伪类(Pseudo-classes):
伪类用于定义元素的特殊状态。它们允许你根据元素的状态、结构位置或其他条件来应用样式,而不需要修改 HTML 结构。伪类总是以冒号(:)开头。 特点:
- 描述元素的特定状态
- 不会创建新的元素
- 可以叠加使用
伪元素(Pseudo-elements):
伪元素用于创建一些不在文档树中的虚拟元素,或者选择元素的特定部分。它们允许你对元素的某些部分应用样式。在 CSS3 中,伪元素使用双冒号(::)表示,以区别于伪类,但为了向后兼容,单冒号也被接受。
特点:
- 创建文档树之外的虚拟元素
- 只能出现在选择器的末尾
- 一个选择器中只能使用一个伪元素
伪类语法:
selector:pseudo-class {
property: value;
}
伪元素语法:
selector::pseudo-element {
property: value;
}
2. 常见的伪类和伪元素
常见的伪类:
- :hover - 鼠标悬停时的状态
- :active - 元素被激活(如按下)时的状态
- :focus - 元素获得焦点时的状态
- :first-child - 第一个子元素
- :last-child - 最后一个子元素
- :nth-child(n) - 第 n 个子元素
常见的伪元素:
- ::before - 在元素内容之前插入内容
- ::after - 在元素内容之后插入内容
- ::first-line - 选择元素的第一行
- ::first-letter - 选择元素的第一个字母
- ::selection - 选择用户选中的部分
3. 实际应用
3.1 伪类的实际应用:
a) 交互效果
button:hover {
background-color: #0056b3;
}
input:focus {
border-color: #007bff;
box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
}
这些样式分别在按钮被悬停和输入框获得焦点时应用特定的样式,提升用户体验。
b) 列表样式
li:first-child {
font-weight: bold;
}
li:nth-child(even) {
background-color:2f2;
}
这些样式可以让列表的第一项加粗,偶数项有灰色背景,增加可读性。
c) 表单验证
input:valid {
border-color: green;
}
input:invalid {
border-color: red;
}
这些样式可以直观地显示表单输入是否有效。
d) 链接样式
a:link { color: blue; }
a:visited { color: purple; }
a:hover { text-decoration: underline; }
a:active { color: red; }
这是一个经典的链接样式设置,分别为未访问、已访问、悬停和激活状态设置不同的样式。
3.2 伪元素的实际应用:
a) 添加装饰内容
.quote::before {
content: "\201C";
font-size: 3em;
color: #ccc;
}
.quote::after {
content: "\201D";
font-size: 3em;
color: #ccc;
}
这个例子在引用文本前后添加了引号,增加了视觉效果。
b) 清除浮动
.clearfix::after {
content: "";
display: table;
clear: both;
}
这是一个经典的清除浮动的技巧,避免父元素高度塌陷。
c) 自定义列表样式
ul.custom-list {
list-style: none;
}
ul.custom-list li::before {
content: "➤";
color: #007bff;
margin-right: 5px;
}
这个例子创建了自定义的列表项标记
3.3 组合使用
伪类和伪元素可以组合使用,创造出更复杂的效果:
button:hover::before {
content: "➤";
margin-right: 5px;
}
li:nth-child(odd)::after {
content: " (odd)";
color: #999;
}
4. 区别总结
| 特征 | 伪类 | 伪元素 |
|---|---|---|
| 定义 | 选择元素的特殊状态 | 创建不存在于文档树中的元素 |
| 语法 | 使用单冒号 : | 使用双冒号 :: (CSS3) |
| 示例 | :hover, :active, :focus | ::before, ::after, ::first-line |
| 可使用数量 | 可以同时使用多个 | 每个选择器只能使用一个 |
| 操作对象 | 已有元素 | 创建新的元素 |
| 表示方式 | 表示元素的状态 | 表示元素的特定部分 |
| CSS版本 | CSS1就已引入 | CSS2引入,CSS3规范化 |
| 常见用途 | 交互效果、表单状态 | 装饰性内容、清除浮动 |
| content属性 | 通常不使用 | 常配合content属性使用 |
| DOM树 | 不创建新的DOM节点 | 创建虚拟的DOM节点 |
注意:虽然CSS3规范要求伪元素使用双冒号,但为了向后兼容,大多数浏览器仍然支持伪元素使用单冒号的写法。
5. 注意事项
a) 性能考虑
虽然伪类和伪元素非常有用,但过度使用可能会影响性能。特别是一些复杂的选择器和大量的 ::before 和 ::after 伪元素可能会增加浏览器的渲染负担。在大型项目中,应当谨慎使用,并考虑性能影响。
b) 浏览器兼容性
大多数现代浏览器都很好地支持伪类和伪元素。但是,一些较新的伪类(如 :is() 或 :where())和伪元素(如 ::backdrop)可能在老旧浏览器中不被支持。在使用时应当检查目标浏览器的兼容性。
c) 最佳实践
- 优先使用类选择器:虽然伪类和伪元素很强大,但在可能的情况下,优先使用类选择器可能会更易维护和性能更好。
- 保持简单:避免过于复杂的选择器,这可能会导致难以维护的代码。
- 文档化:当使用不常见的伪类或伪元素时,添加注释说明其用途。
- 测试:在不同的浏览器和设备上测试你的样式,确保一致的体验。