Quelle est la différence entre * et * | * en CSS?


Réponses:


216

Selon les spécifications du sélecteur W3C :

Le sélecteur universel permet un composant d'espace de noms facultatif. Il est utilisé comme suit:

ns|*
tous les éléments de l'espace de noms ns

*|*
tous les éléments

|*
tous les éléments sans espace de noms

*
si aucun espace de noms par défaut n'a été spécifié, cela équivaut à * | *. Sinon, il équivaut à ns | * où ns est l'espace de noms par défaut.

Donc, non *et *|*ne sont pas toujours les mêmes. Si un espace de noms par défaut est fourni, il *sélectionne uniquement les éléments qui font partie de cet espace de noms.


Vous pouvez voir visuellement les différences à l'aide des deux extraits ci-dessous. Dans le premier, un espace de noms par défaut est défini et le *sélecteur applique donc l'arrière-plan de couleur beige uniquement à l'élément qui fait partie de cet espace de noms tandis que l' *|*applique la bordure à tous les éléments.

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

Dans l'extrait ci - dessous aucun espace de noms par défaut est définie et donc à la fois *et *|*applique à tous les éléments et ainsi tous les obtenir à la fois le fond beige et la bordure noire. En d'autres termes, ils fonctionnent de la même manière quand aucun espace de noms par défaut n'est spécifié.

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


Comme BoltClock souligne dans les commentaires ( 1 , 2 ), initialement namespaces appliquée uniquement aux langues à base de XML tels que XHTML, SVG , etc , mais selon les dernières spécifications, tous les éléments HTML (qui est, des éléments dans l'espace de noms HTML) sont espaces de noms à http://www.w3.org/1999/xhtml. Firefox suit ce comportement et il est cohérent dans tous les agents utilisateurs HTML5. Vous pouvez trouver plus d'informations dans cette réponse .


4
Les espaces de noms s'appliquent-ils uniquement au XHTML ou au HTML?
Flimm

8
@Flimm: Uniquement les langages basés sur XML, tels que XHTML et SVG. Mais notez que certains navigateurs, comme Firefox (pas sûr des autres), appliquent l'espace de noms XHTML même en texte / html, à des fins de CSS. Voir par exemple jsfiddle.net/BoltClock/5ta6yvvc , et pour plus d'informations cette réponse .
BoltClock

3
Addendum - Le comportement de Firefox est conforme aux spécifications et est cohérent entre tous les agents utilisateurs HTML5. Tous les éléments HTML (c'est-à-dire les éléments de l' espace de noms HTML ) sont http://www.w3.org/1999/xhtml
dotés d'

44

*|*représente le sélecteur de "tous les éléments dans n'importe quel espace de noms". Selon le W3C , le sélecteur est divisé en:

ns | E

Où ns est l' espace de noms et E est l'élément. Par défaut, aucun espace de noms n'est déclaré. Donc, sauf si un espace de noms est déclaré explicitement, *|*et *sélectionnera les mêmes éléments.


-3

En CSS, * correspondra à n'importe quel élément.

| est utilisé pour faire correspondre certains éléments spécifiques . Les deux sont des sélecteurs utilisés pour notre test


2
Pouvez vous donner un exemple?
Ben Leggiero
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.