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


Answers:


215

根据W3C选择器规范

通用选择器允许一个可选的名称空间组件。它的用法如下:

ns|*
ns名称空间中的所有元素

*|*
所有要素

|*
所有没有命名空间的元素

*
如果未指定默认名称空间,则等效于* | *。否则,它等效于ns | *,其中ns是默认名称空间。

因此,不**|*并不总是相同的。如果提供了默认名称空间,则*仅选择属于该名称空间的元素。


您可以使用以下两个代码片段直观地看到差异。首先,定义一个默认的名称空间,因此*选择器仅将米色背景应用于该命名空间的一部分,而*|*将边框应用于所有元素。

@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用户代理中均保持一致。您可以在此答案中找到更多信息。


4
命名空间仅适用于XHTML还是HTML?
Flimm

8
@Flimm:仅基于XML的语言,例如XHTML和SVG。但请注意,出于CSS的目的,某些浏览器(例如Firefox)(不确定其他浏览器)甚至在text / html中也应用XHTML名称空间。参见例如jsfiddle.net/BoltClock/5ta6yvvc,有关此答案的更多信息,请参见。
BoltClock

3
附录-Firefox的行为符合规范,并且在所有HTML5用户代理中均保持一致。所有HTML元素(即HTML命名空间中的元素)的命名空间均为http://www.w3.org/1999/xhtml
BoltClock


-3

在CSS中,*将匹配任何元素。

| 用于匹配选择的特定元素。两者都是用于我们测试目的的选择器


2
你能举个例子吗?
Ben Leggiero
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.