CSS中*和*|*有什么区别?

214

CSS中,*会匹配任何元素。

通常情况下,*|*会被用来代替*来匹配所有元素。这种情况一般用于测试目的。

**|*在CSS中有什么区别?


1
类似问题:CSS 中 *|* 的含义是什么? - Flimm
3个回答

219
根据W3C Selector Spec
通用选择器允许可选的命名空间组件。使用如下:
- ns|*:命名空间ns中的所有元素 - *|*:所有元素 - |*:没有命名空间的所有元素 - *:如果未指定默认命名空间,则与*|*等效。否则,它相当于ns | *,其中ns是默认命名空间。
因此,**|*并不总是相同的。如果提供了默认名称空间,则*仅选择属于该名称空间的元素。

You can visually see the differences using the below two snippets. In the first, a default namespace is defined and so the * selector applies the beige colored background only to the element which is part of that namsepace whereas the *|* applies the border to all elements.

@namespace "http://www.w3.org/2000/svg";

* {
  background: beige;
}
*|* {
  border: 1px solid;
}
<a href="#">This is some link</a>

<svg xmlns="http://www.w3.org/2000/svg">
  <a xlink:href="#">
    <text x="20" y="20">This is some link</text>
  </a>
</svg>

在下面的代码片段中没有定义默认命名空间,因此**|*都适用于所有元素,因此所有元素都具有米色背景和黑色边框。换句话说,在未指定默认命名空间时,它们的工作方式是相同的。

* {
  background: beige;
}
*|* {
  border: 1px solid;
}
<a href="#">This is some link</a>

<svg xmlns="http://www.w3.org/2000/svg">
  <a xlink:href="#">
    <text x="20" y="20">This is some link</text>
  </a>
</svg>


如BoltClock在评论中指出的那样(12),最初命名空间仅适用于基于XML的语言,例如XHTML、SVG等,但根据最新规范,所有HTML元素(即HTML命名空间中的元素)都被命名空间化为http://www.w3.org/1999/xhtml。Firefox遵循这种行为,并且在所有HTML5用户代理中保持一致。您可以在this answer中找到更多信息。

4
命名空间只适用于XHTML还是同样适用于HTML? - Flimm
8
只有基于XML的语言,如XHTML和SVG。但请注意,像Firefox(不确定其他浏览器)一样,即使在text/html中,也会将XHTML命名空间应用于CSS。例如,请参见https://jsfiddle.net/BoltClock/5ta6yvvc/,更多信息请参见此答案:https://dev59.com/HXA65IYBdhLWcg3w1SVC#12979656。 - BoltClock
3
补充说明:Firefox的行为符合规范,并且在所有HTML5用户代理中保持一致。所有HTML元素(即属于HTML命名空间中的元素)都被命名空间化为“http://www.w3.org/1999/xhtml”。 - BoltClock

44

*|*代表“任何命名空间中的所有元素”的选择器。根据W3C的规定,该选择器被分为:

ns | E

其中ns是命名空间,E是元素。默认情况下,没有声明命名空间。因此,除非显式声明了命名空间,否则*|**将选择相同的元素。


-4
在CSS中,*将匹配任何元素|用于匹配选择特定的元素。这两个选择器都是用于我们的测试目的。

3
可以举个例子吗? - Ky -

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接