【问题标题】:Can a CSS pseudo-class be namespaced?CSS 伪类可以命名空间吗?
【发布时间】:2012-06-24 02:31:21
【问题描述】:

在 CSS 中使用命名空间时,您可以使用命名空间类型选择器选择“任何或无命名空间”中的任何 div 元素:

*|div

为伪类命名空间是有效的 CSS 吗?例如:

*|:first-child

它似乎在基于 WebKit 的浏览器中工作,它似乎在 IE9(IE9 以下根本不支持命名空间)和 Firefox 中工作。我不在乎它在哪些浏览器中工作/不工作,我只需要知道它是否是一个有效的构造。

Here's a fiddle.

从我在CSS grammar 中可以看出,它是无效的。但我可能误读了语法。

【问题讨论】:

  • 请不要混淆伪类和伪元素——它们是两个不同的东西。
  • 哦,是的,对不起,我明白其中的区别(请注意,问题确实是“伪类”,我只是把标题弄错了!)
  • 我刚刚看到你的错误报告 :) bugs.webkit.org/show_bug.cgi?id=89748

标签: css namespaces css-selectors pseudo-class


【解决方案1】:

命名空间作为文档语言的一部分,不能直接应用于伪类或伪元素,因为它们是在 CSS 中定义的,而不是在文档语言中定义的(例如 XML)。然而,元素类型和属性是在文档语言中定义的,而不是 CSS,这就是它们可以命名空间的原因。因此,在一系列简单选择器中,通用选择器特指“任何类型”。

通用选择器仅在没有命名空间的情况下用于其他简单选择器和伪元素(这就是为什么像 .foo#target[type="text"]:first-child::before 这样的选择器是有效的,并且通常与 HTML 等语言一起使用,其中 CSS 最常用于样式)。来自spec

如果由* 表示的通用选择器(即没有命名空间前缀)不是sequence of simple selectors 选择器的唯一组成部分,或者紧随其后的是pseudo-element,那么* 可以省略,并且隐含通用选择器的存在。

因此,在您的示例中,选择器无效,因为|: 之间既没有通用选择器也没有类型选择器:

/* These are all invalid */
*|:first-child
ns|::first-letter
|::before

如果指定命名空间,如果不选择特定类型,则必须指定通用选择器:

*|*:first-child
*|*::before

ns 命名空间中选择元素时也是如此:

ns|*:first-child
ns|*::before

或选择不在命名空间的元素时:

|*:first-child
|*::before

【讨论】:

  • 所以 WebKit 搞错了?这就是我的想法,所以感谢您的澄清:)
  • 你能链接到源吗? :-)
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 2016-11-07
  • 2012-02-23
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多