一尘不染

通用选择器*和伪元素

css

通用选择器是否*会影响伪元素,例如:before:after

让我举一个例子:

执行此操作时:

* { box-sizing: border-box; }

......没有上述声明包括自动/影响伪元素,如:before:after呢?

或者,为了影响诸如:before和的伪元素:after,必须声明这一点?

*, *:before, *:after { box-sizing: border-box; }

这有意义吗?


我一直只* { box-sizing: border-box; }使用伪元素,而从来没有任何问题。但是我看到许多教程在做,*, *:before, *:after但是它们从没有真正解释为什么将它们包含*:before, *:after在声明中。


阅读 284

收藏
2020-05-16

共1个答案

一尘不染

不,通用选择器*不影响伪元素(通过继承间接除外,因为伪元素通常作为实际元素的子元素生成)。

通用选择器与其他命名元素选择器(例如p和)一样div,是一个简单的选择器:

一个 简单的选择器 可以是类型选择器,通用选择器,属性选择器,类选择器,ID选择器或伪类。

一个简单的选择器,以及扩展到任何复杂的选择器,仅针对实际元素。

虽然伪元素(它们是
作为伪类上面提到的相同的东西)可以一起简单选择器在选择符号出现,伪元素被完全从简单的选择器分开,因为它们表示从实际元素单独的DOM的抽象,因此两者都代表不同的事物。您不能使用简单的选择器来匹配伪元素,也不能将样式应用于选择器中带有伪元素的CSS规则中的实际元素。

因此,为了匹配:before:after任何元素的伪元素,是的,一个需要包含*:before, *:after在选择。拥有权限* { box-sizing: border-box; }不会影响它们,因为box-sizing通常不会继承它们,因此,它们将保留default box- sizing: content-box

您可能永远不会对伪元素产生任何问题的一个可能原因是,它们默认情况下以内联方式显示,因为box-sizing对内联元素没有任何影响。

一些注意事项:

  • 与其他所有简单选择器链一样,如果*不是唯一选择器,则可以将其省略,这*, :before, :after等效于*, *:before, *:after。话虽如此,*为了清楚起见,通常将其包括在内-大多数作者*在编写ID和类选择器时都习惯于省略,但不编写伪类和伪元素,因此对于他们来说,这种表示法似乎有些奇怪甚至是错误的(实际上是完全有效的)。

  • 我上面链接到的当前Selectors规范表示带有双冒号的伪元素。这是当前规范中引入的新符号,用于区分伪元素和伪类,但是大多数box-sizing重置使用单冒号表示来容纳IE8,IE8支持box-sizing但不支持双冒号表示法。

  • 虽然*:before, *:after样式应用于各自的伪元素 的任何 元素,其中包括htmlheadbody,伪元素将直到应用实际上不能产生content财产。您不必担心任何性能问题,因为没有任何问题。。

2020-05-16