一,前言
上一篇,主要介绍了 CSS 的选择器,主要涉及以下几点:
- CSS 的三大特征;
- CSS 选择器的优先级;
- CSS 优先级的计算规则;
- CSS 选择器的权重;
- CSS 选择器面试题;
本篇,介绍 CSS 选择器:伪类和伪元素;
二,伪类(伪类选择器)
1,伪类的简介
- 伪类用于定义元素的特殊状态;
- 同一元素,根据不同状态,显示不同样式,样式随状态(用户行为)变化而变化;
- 伪类用冒号表示,如:
:link
、:hover
; - 与普通 CSS 类相比较,伪类选择器只有处于 dom 树无法描述的状态下,才能为元素添加样式;所以被称作伪类;
2,伪类的语法
<!-- 语法 -->
selector:pseudo-class {
property: value;
}
<!-- 示例 -->
a:link {
color: #FF0000;
}
input:focus {
background-color: yellow;
}
备注:
- 伪类名称对大小写不敏感;
3,伪类的应用
- 设置鼠标悬停在元素上时的样式;
- 为已访问和未访问链接设置不同的样式;
- 设置元素获得焦点时的样式;
// 示例:a 标签的四种状态,分别对应 4 种伪类;
/* 未访问的链接 */
a:link {
color: blue;
}
/* 已访问的链接 */
a:visited {
color: red;
}
/* 鼠标悬停链接 */
a:hover {
color: orange;
}
/* 已选择的链接(鼠标点击但不放开时) */
a:active {
color: #0000FF;
}
注意:
- a 标签的 4 个伪类(4种状态)必须按照一定顺序书写,否则将会失效:
a:hover
必须在 CSS 定义中的a:link
和a:visited
之后,才能生效;a:active
必须在 CSS 定义中的a:hover
之后才能生效;- 书写顺序为:
a:link
、a:visited
、a:hover
、a:active
; - 记忆方法:love hate - “爱恨准则”;
4,伪类的意义
- 通过伪类选择器,能够格式化 DOM 树以外的信息;
- 通过伪类选择器,能够获取到常规 CSS 选择器无法获取到的信息;
5,全部伪类选择器
选择器 | 示例 | 备注 |
---|---|---|
:active | a:active | 选择活动状态的链接 |
:checked | input:checked | 选择每个被选中的<input> 元素 |
:disabled | input:disabled | 选择每个被禁用的<input> 元素 |
:enabled | input:enabled | 选择每个已启用的<input> 元素 |
:empty | p:empty | 选择没有子元素的每个<p> 元素 |
:first-child | p:first-child | 选择其父中首个子元素的每个<p> 元 |
:first-of-type | p:first-of-type | 选择其父中指定类型的首个子元素<p> |
:last-child | p:last-child | 选择其父中最后一个子元素的每个<p> 元素 |
:last-of-type | p:last-of-type | 选择作为其父的最后一个<p> 元素的每个<p> 元素 |
:focus | input:focus | 选择获得焦点的<input> 元素 |
:hover | a:hover | 选择处于鼠标悬停状态的链接 |
:in-range | input:in-range | 选择满足指定范围值的<input> 元素 |
:invalid | input:invalid | 选择所有无效值的<input> 元素 |
:lang | p:lang(it) | 选择每个lang 属性值 以 “it” 开头的<p> 元素 |
:link | a:link | 选择所有未被访问的链接 |
:not(*selector*) | :not(p) | 选择每个非<p> 元素的元素 |
:nth-child(*n*) | p:nth-child(2) | 选择作为其父的第二个子元素的每个 <p> 元素 |
:nth-last-child(*n*) | p:nth-last-child(2) | 选择作为父的第二个子元素的每个<p> 元素从最后一个子元素计数 |
:nth-last-of-type(*n*) | p:nth-last-of-type(2) | 选择作为父的第二个<p> 元素的每个<p> 元素从最后一个子元素计数 |
:nth-of-type(*n*) | p:nth-of-type(2) | 选择作为其父的第二个<p> 元素的每个<p> 元素 |
:only-of-type | p:only-of-type | 选择作为其父的唯一<p> 元素的每个 <p> 元素 |
:only-child | p:only-child | 选择作为其父的唯一子元素的<p> 元素 |
:optional | input:optional | 选择不带 “required” 属性的 <input> 元素 |
:out-of-range | input:out-of-range | 选择值在指定范围之外的<input> 元素 |
:read-only | input:read-only | 选择指定了readonly 属性的<input> 元素 |
:read-write | input:read-write | 选择不带readonly 属性的<input> 元素 |
:required | input:required | 选择指定了required 属性的<input> 元素 |
:root | root | 选择元素的根元素 |
:target | #news:target | 选择当前活动的#news 元素(单击包含该锚名称的 URL) |
:valid | input:valid | 选择所有具有有效值的<input> 元素 |
:visited | a:visited | 选择所有已访问的链接 |
三,伪元素(伪元素选择器)
1,伪元素的简介
- CSS 伪元素用于设置元素指定部分的样式;
- 伪元素使用双冒号表示法,如:
::first-line
;
备注:
W3C 为了区分伪类和伪元素,CSS3 的伪元素使用双冒号表示法取代了单冒号表示法;但是,为了能够向后兼容,CSS2 和 CSS1 的伪元素仍可使用单冒号语法;
2,伪元素的语法
<!-- 语法 -->
selector::pseudo-element {
property: value;
}
<!-- 示例 -->
p::first-line {
color: #ff0000;
}
h1::before {
content: '♥';
}
3,伪元素的应用
注意:
::first-line
伪元素只能应用于块级元素::first-letter
伪元素只适用于块级元素
todo:后续需要补充伪元素下可以生效的属性有哪些;
4,伪元素的意义
用于创建不在文档树中的元素,并为其添加样式;
- 可以通过
:before
在元素前增加文本,并为文本添加样式; - 用户虽然可以看到文本内容,但文本实际并不在文档树中;
伪元素可以创建文档语言无法创建的虚拟元素;
- 文档语言无法描述元素内容的第一个字母或第一行,但伪元素可以(
::first-letter
、::first-line
); - 伪元素还可以创建源文档不存在的内容;比如:使用
::before
或::after
;
5,全部伪元素选择器
选择器 | 示例 | 备注 |
---|---|---|
::first-letter | p::first-letter | 选择<p> 元素的首字母; |
::first-line | p::first-line | 选择<p> 元素的首行; |
::before | p::before | 在<p> 元素之前插入内容;必须定义 content 属性; |
::after | p::after | 在<p> 元素之后插入内容;必须定义 content 属性; |
::selection | p::selection | 设置被用户选择时的样式; 只能定义被选择时的 color 和 background-color ; |
四,伪类和伪元素选择器的区别
- 伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档数外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素;
- 伪类本质上是为了弥补常规CSS选择器的不足,以便获取到更多信息;
- 伪元素本质上是创建了一个有内容的虚拟容器;
- CSS3 中伪类和伪元素的语法不同;
- 在 CSS3 中,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示;
- 可以同时使用多个伪类,而只能同时使用一个伪元素;
五,结尾
本篇,介绍了 CSS 选择器伪类和伪元素,主要涉及以下几个点:
- 伪类选择器;
- 伪元素选择器;
- 伪类和伪元素选择器的区别;
下一篇,介绍 CSS 变量 var;
维护记录
- 20211126
- 调整了“伪类(伪类选择器)部分,扩充了内容;
- 调整了“伪元素(伪元素选择器)”部分,扩充了内容;
- 调整了目录结构、结尾部分、文章摘要;