CSS伪元素

217 阅读3分钟

选择器的组合

选择器列表是用逗号分隔的复杂选择器序列;复杂选择器则是用空格、大于号、波浪线等符号连接的复合选择器;复合选择器则是连写的简单选择器组合。

根据选择器列表的语法,选择器的连接方式可以理解为像四则运算一样有优先级。

  • 第一优先级

无连接符号

  • 第二优先级

“空格”

“~”

“+”

“>”

“||”

  • 第三优先级

“,”

例如以下选择器:

.c,.a>.b.d {
    /*......*/
}

复合选择器表示简单选择器中“且”的关系,例如,例子中的“ .b.d ”,表示选中的元素必须同时具有 b 和 d 两个 class。

复杂选择器是针对节点关系的选择,它规定了五种连接符号。

  • “空格”:后代,表示选中所有符合条件的后代节点, 例如“ .a .b ”表示选中所有具有 class 为 a 的后代节点中 class 为 b 的节点。

  • “>” :子代,表示选中符合条件的子节点,例如“ .a>.b ”表示:选中所有“具有 class 为 a 的子节点中,class 为 b 的节点”。

  • “~” : 后继,表示选中所有符合条件的后继节点,后继节点即跟当前节点具有同一个父元素,并出现在它之后的节点,例如“ .a~.b ”表示选中所有具有 class 为 a 的后继中,class 为 b 的节点。

  • “+”:直接后继,表示选中符合条件的直接后继节点,直接后继节点即 nextSlibling。例如 “.a+.b ”表示选中所有具有 class 为 a 的下一个 class 为 b 的节点。

  • “||”:列选择器,表示选中对应列中符合条件的单元格。

我们在实际使用时,比较常用的连接方式是“空格”和“>”。

工程实践中一般会采用设置合理的 class 的方式,来避免过于复杂的选择器结构,这样更有利于维护和性能。

伪元素

目前兼容性达到可用的伪元素有以下几种。

  • ::first-line

  • ::first-letter

  • ::before

  • ::after

::first-line 和 ::first-letter 是比较类似的伪元素,其中一个表示元素的第一行,一个表示元素的第一个字母。

接下来我们说说 ::before 和 ::after 伪元素。

这两个伪元素跟前面两个不同的是,它不是把已有的内容套上一个元素,而是真正的无中生有,造出一个元素。

::before 表示在元素内容之前插入一个虚拟的元素,::after 则表示在元素内容之后插入。

这两个伪元素所在的 CSS 规则必须指定 content 属性才会生效,我们看下例子

<p class="special">I'm real element</p>
p.special::before {
    display: block;
    content: "pseudo! ";
}

这里要注意一点,::before 和 ::after 还支持 content 为 counter,如:

<p class="special">I'm real element</p>
p.special::before {
    display: block;
    content: counter(chapno, upper-roman) ". ";
}

这对于实现一些列表样式是非常有用的。

::before 和 ::after 中支持所有的 CSS 属性。实际开发中,这两个伪元素非常有用,有了这两个伪元素,一些修饰性元素,可以使用纯粹的 CSS 代码添加进去,这能够很好地保持 HTML 代码中的语义,既完成了显示效果,又不会让 DOM 中出现很多无语义的空元素。