Jaka jest różnica między * a * | * w CSS?


Odpowiedzi:


215

Zgodnie ze specyfikacją W3C Selector :

Uniwersalny selektor umożliwia opcjonalny komponent przestrzeni nazw. Używa się go w następujący sposób:

ns|*
wszystkie elementy w przestrzeni nazw ns

*|*
wszystkie elementy

|*
wszystkie elementy bez przestrzeni nazw

*
jeśli nie określono domyślnej przestrzeni nazw, odpowiada to * | *. W przeciwnym razie jest to równoważne ns | *, gdzie ns jest domyślną przestrzenią nazw.

Więc nie *i *|*nie zawsze są takie same. Jeśli zapewniona jest domyślna przestrzeń nazw, wówczas *wybiera tylko elementy, które są częścią tej przestrzeni nazw.


Różnice możesz wizualnie zobaczyć za pomocą dwóch poniższych fragmentów. W pierwszym zdefiniowana jest domyślna przestrzeń nazw, więc *selektor stosuje beżowe tło tylko do elementu, który jest częścią tego namsepace, podczas gdy *|*stosuje granicę do wszystkich elementów.

@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>

W poniżej urywek nie jest zdefiniowana domyślna przestrzeń nazw i tak obaj *i *|*odnosi się do wszystkich elementów i tak wszyscy się zarówno beżowe tło i czarne obramowanie. Innymi słowy, działają one tak samo, gdy nie określono domyślnej przestrzeni nazw.

* {
  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>


Jak BoltClock wskazuje w komentarzach ( 1 , 2 ), początkowo przestrzenie nazw stosowane były tylko dla języków opartych na XML, takich jak XHTML, SVG itp., Ale zgodnie z najnowszą specyfikacją wszystkie elementy HTML (czyli elementy w przestrzeni nazw HTML) są rozmieszczane w przestrzeni nazw http://www.w3.org/1999/xhtml. Firefox stosuje to zachowanie i jest spójny we wszystkich aplikacjach klienckich HTML5. Więcej informacji można znaleźć w tej odpowiedzi .


4
Czy przestrzenie nazw dotyczą tylko XHTML lub HTML?
Flimm

8
@Flimm: tylko języki oparte na XML, takie jak XHTML i SVG. Pamiętaj jednak, że niektóre przeglądarki, takie jak Firefox (nie jestem pewien co do innych), stosują przestrzeń nazw XHTML nawet w text / html, do celów CSS. Zobacz na przykład jsfiddle.net/BoltClock/5ta6yvvc i dodatkowe informacje na ten temat .
BoltClock

3
Dodatek - zachowanie Firefoksa jest zgodne ze specyfikacją i jest spójne we wszystkich aplikacjach klienckich HTML5. Wszystkie elementy HTML (tj. Elementy w przestrzeni nazw HTML ) są http://www.w3.org/1999/xhtml
rozmieszczone w

44

*|*reprezentuje selektor „wszystkich elementów w dowolnej przestrzeni nazw”. Według W3C selektor jest podzielony na:

ns | E

Gdzie ns to przestrzeń nazw, a E to element. Domyślnie przestrzenie nazw nie są deklarowane. Więc jeśli przestrzeń nazw nie zostanie jawnie zadeklarowana *|*i *wybierze te same elementy.


-3

W CSS * pasuje do dowolnego elementu.

| służy do dopasowania wybranych określonych elementów . Oba są selektorem używanym do naszych celów testowych


2
Czy możesz podać przykład?
Ben Leggiero
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.