【问题标题】:Can the Universal selector * be replaced by :lang?通用选择器 * 可以替换为 :lang 吗?
【发布时间】:2016-02-29 12:48:59
【问题描述】:

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

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

然后我看到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 属性 - 我认为上述差异并不重要。

所以基本上我的问题是:

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

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

* { box-sizing: border-box; }

与:

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

代码似乎可以工作 (DEMO),而且它似乎也是语义的,但我想知道上述技术是否存在某些原因/缺点。

【问题讨论】:

  • 如果在最后一个 div 中添加lang="ch" 会怎样?
  • 通常文档是用一种语言编写的,但即使我添加了不同语言的部分 - 很有可能我还是想单独设置该部分的样式
  • 我很好奇你为什么要改用lang。对我来说,意图是完全不同的。一个是“所有元素”,另一个是“这种语言的元素”,在您的情况下恰好是同一件事,但在概念上是不同的。如果您的意图是“所有元素”,那么我更喜欢*,因为它的字符更少且更普遍认可。 IMO lang 应该保留给实际显示不同语言的页面,这些页面需要不同的样式。
  • 是的,一般来说你是对的,虽然一个文本可以有多种语言,一次只能看到一种语言。无论如何,我的示例旨在表明 :lang* 不可互换:所有英文元素可能与所有元素不同。
  • @CodingWithSpike 也许会有某种性能提升?虽然我承认我听说以这种方式使用通用选择器不会影响性能

标签: css css-selectors


【解决方案1】:

通用选择器 * 可以替换为 :lang 吗?

不,因为您无法使用:lang() 编写保证匹配所有元素的选择器,除非您假设文档中的所有元素始终使用相同的语言。1

如果您要假设所有元素都使用相同的语言,那么使用 :lang() 伪是毫无意义的,因为该伪类的全部意义在于能够区分文档的某些部分内容语言不同。

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


1Selectors 4 允许编写像:lang('*') 这样的选择器来匹配任何语言的元素(同样,如果您不在乎 元素使用什么语言!),但这假设文档甚至内置了内容语言语义。尚不清楚:lang() 是否可以在缺少此类语义的文档中工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2011-12-05
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多