Universal选择器*可以替换为:lang?

时间:2016-02-28 14:10:28

标签: css css-selectors

通用选择器星号(*)的独特之处在于它匹配任何类型的单个元素。

所以,如果我在div中有不同的元素,并且我想用一个选择器选择它们,我可以向所有内部元素添加一个类(类似.parent .class {})或者我可以使用通用选择器(.parent * {}

然后我看到the spec为:lang伪元素(特别是结尾):

  

注意[lang | = xx]和:lang(xx)之间的区别。在这个HTML中   例如,只有BODY匹配[lang | = fr](因为它有一个LANG   属性)但是BODY和P匹配:lang(fr)(因为两者都有)   用法语)。

<body lang=fr>
  <p>Je suis Français.</p>
</body>

这意味着:lang选择器所定位的元素中的所有元素也是目标。 (哇!)

所以我想说我想为div中的所有元素添加边框 - 而不是选择器div * {}我理论上可以使用:lang

Here's a demo

据我所知,唯一的区别是:lang选择器选择父母以及所有孩子(当然还有技术差异:lang具有更大的特异性)....的然而

如果:lang选择器以语义方式应用,它包含整个文档 - 在html元素上使用lang 属性 - 我不认为上述差异会很重要。< / p>

基本上我的问题是:

假设我的html元素具有属性lang="en"

我可以替换使用通用选择器的代码,例如:

* { box-sizing: border-box; }

使用:

:lang(en) {
  box-sizing: border-box;
}

代码似乎有效(DEMO),它似乎也是语义,但我想知道上述技术是否有某些原因/缺点。

1 个答案:

答案 0 :(得分:2)

  

将Universal选择器*替换为:lang?

不,因为你不能使用保证匹配所有元素的:lang()来编写选择器,除非你假设文档中的所有元素总是使用相同的语言。 1

如果您要假设所有元素都使用相同的语言,那么使用:lang()伪是非常没有意义的,因为伪类的整个要点是能够区分部分其内容语言不同的文件。

另请注意,复合选择器:lang(en)(仅由一个简单选择器组成)等同于*:lang(en)。它本质上是*选择器,具有伪类的附加限定。您不能通过将其替换为*来避免使用:lang()

1 Selectors 4允许编写与:lang('*')类似的选择器,以匹配任何语言中的元素(如果您 don&,这也是毫无意义的#39; t care 元素所使用的语言!),但这假设文档甚至内置了内容语言语义。目前尚不清楚:lang()在缺乏此类语义的文档中是否会起作用。