Qual è la differenza tra * e * | * nei CSS?


Risposte:


216

Secondo le specifiche del selettore W3C :

Il selettore universale consente un componente dello spazio dei nomi opzionale. È usato come segue:

ns|*
tutti gli elementi nello spazio dei nomi ns

*|*
tutti gli elementi

|*
tutti gli elementi senza uno spazio dei nomi

*
se non è stato specificato alcun namespace predefinito, questo equivale a * | *. Altrimenti è equivalente a ns | * dove ns è lo spazio dei nomi predefinito.

Quindi no *e *|*non sono sempre gli stessi. Se viene fornito uno spazio dei nomi predefinito, *seleziona solo gli elementi che fanno parte di quello spazio dei nomi.


Puoi vedere visivamente le differenze usando i due seguenti frammenti. Nel primo, viene definito uno spazio dei nomi predefinito e quindi il *selettore applica lo sfondo colorato di beige solo all'elemento che fa parte di quel namsepace mentre *|*applica il bordo a tutti gli elementi.

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

Nello snippet di seguito non viene definito uno spazio dei nomi predefinito e quindi entrambi *e si *|*applica a tutti gli elementi e quindi tutti ottengono sia lo sfondo beige che il bordo nero. In altre parole, funzionano allo stesso modo quando non viene specificato uno spazio dei nomi predefinito.

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


Come BoltClock sottolinea nei commenti ( 1 , 2 ), inizialmente gli spazi dei nomi si applicano solo ai linguaggi basati su XML come XHTML, SVG ecc http://www.w3.org/1999/xhtml. Firefox segue questo comportamento ed è coerente con tutti gli user agent HTML5. Puoi trovare maggiori informazioni in questa risposta .


4
Gli spazi dei nomi si applicano solo a XHTML o HTML?
Flimm,

8
@Flimm: solo linguaggi basati su XML, come XHTML e SVG. Tuttavia, alcuni browser, come Firefox (non sono sicuro di altri), applicano lo spazio dei nomi XHTML anche in text / html, ai fini dei CSS. Vedi ad esempio jsfiddle.net/BoltClock/5ta6yvvc e per maggiori informazioni questa risposta .
BoltClock

3
Addendum: il comportamento di Firefox è conforme alle specifiche ed è coerente con tutti i programmi utente HTML5. Tutti gli elementi HTML (ovvero gli elementi nello spazio dei nomi HTML ) sono http://www.w3.org/1999/xhtml
spaziati in

44

*|*rappresenta il selettore di "tutti gli elementi in qualsiasi spazio dei nomi". Secondo il W3C , il selettore è diviso in:

ns | E

Dove ns è lo spazio dei nomi ed E è l'elemento. Per impostazione predefinita, non vengono dichiarati spazi dei nomi. Quindi, a meno che uno spazio dei nomi non sia dichiarato esplicitamente *|*e *selezionerà gli stessi elementi.


-3

In CSS, * corrisponderà a qualsiasi elemento.

| viene utilizzato per abbinare selezionare elementi specifici . Entrambi sono selettori utilizzati per il nostro scopo di test


2
Potete fornire un esempio?
Ben Leggiero,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.