通用选择器星号(*)的独特之处在于它匹配任何类型的单个元素。
所以,如果我在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
据我所知,唯一的区别是:lang
选择器选择父母以及所有孩子(当然还有技术差异:lang具有更大的特异性)....的然而
如果:lang选择器以语义方式应用,它包含整个文档 - 在html元素上使用lang 属性 - 我不认为上述差异会很重要。< / p>
基本上我的问题是:
假设我的html元素具有属性lang="en"
:
我可以替换使用通用选择器的代码,例如:
* { box-sizing: border-box; }
使用:
:lang(en) {
box-sizing: border-box;
}
代码似乎有效(DEMO),它似乎也是语义,但我想知道上述技术是否有某些原因/缺点。
答案 0 :(得分:2)
将Universal选择器*替换为:lang?
不,因为你不能使用保证匹配所有元素的:lang()
来编写选择器,除非你假设文档中的所有元素总是使用相同的语言。 1
如果您要假设所有元素都使用相同的语言,那么使用:lang()
伪是非常没有意义的,因为伪类的整个要点是能够区分部分其内容语言不同的文件。
另请注意,复合选择器:lang(en)
(仅由一个简单选择器组成)等同于*:lang(en)
。它本质上是*
选择器,具有伪类的附加限定。您不能通过将其替换为*
来避免使用:lang()
。
1 Selectors 4允许编写与:lang('*')
类似的选择器,以匹配任何语言中的元素(如果您 don&,这也是毫无意义的#39; t care 元素所使用的语言!),但这假设文档甚至内置了内容语言语义。目前尚不清楚:lang()
在缺乏此类语义的文档中是否会起作用。