31 votes

Pourquoi l'élément <p> est-il vert ?

Je regardais este Exemple CSS de la page Mozilla pour le :not() sélecteur.

L'exemple est le suivant :

p:not(.classy) { color: red; }
:not(p) { color: green; }

<p>Irgendein Text.</p>
<p class="classy">Irgendein anderer Text.</p>
<span>Noch mehr Text<span>

Ce que je comprends parfaitement :

  • Je comprends pourquoi la première p est rouge, c'est parce qu'il s'agit d'un élément p et qu'il n'a pas la classe "classy".
  • Je comprends également pourquoi la span est vert, c'est parce qu'il est sélectionné par l'élément :not(p) il ne s'agit pas d'un p élément

Mais pourquoi la deuxième p élément vert ? Il ne serait pas sélectionné par le premier sélecteur, car il s'agit d'un élément p sans la classe classy . Mais il ne serait pas sélectionné par le second, car il s'agit d'une p élément. Pourquoi est-il vert ?

64voto

Quentin Points 325526

Le deuxième p n'est pas :not(.classy) Ainsi, il n'est pas color: red . Cela signifie qu'il a toujours son par défaut couleur, qui est color: inherit .

En body est :not(p) Il en est ainsi color: green .

Le deuxième p hérite donc de la couleur verte de la body élément.

Les outils de développement de votre navigateur vous l'auraient indiqué :

Developer tools showing CSS rules applied to the second paragraph as described above

3 votes

Je dois ajouter que tous ceux qui prétendent que :not() "nécessite" un sélecteur de type ou de classe pour fonctionner ont tort, car comme on l'a vu :not() fonctionne sans qualification - les résultats deviennent simplement contre-intuitifs en raison d'autres facteurs en jeu, tels que l'héritage dans ce cas. Tout ne se résume pas à ce que le sélecteur corresponde à l'élément en question, car le sélecteur peut très bien correspondre à d'autres éléments et appliquer des styles qui affectent la mise en page de l'élément en question.

1 votes

Je jouais avec :not([required]) comme polyfill rapide pour :optional mais je me suis vite rendu compte que ce n'était pas ce que j'avais en tête.

1 votes

Je ne pense pas que la personne qui pose la question en soit encore au stade où elle connaît les "outils de développement" - peut-être pourriez-vous également inclure un résumé de la manière dont ils sont accessibles.

4voto

Suresh Ponnukalai Points 6458

En plus de la réponse de @Quentin, pour votre compréhension, essayez d'ajouter vos éléments sous un parent et appliquez le CSS avec la référence du sélecteur de parent. Vous obtiendrez alors exactement ce que vous attendiez. Regardez l'extrait ci-dessous.

.test p:not(.classy) { color: red; }
.test :not(p) { color: green; }

<div class="test">
  <p>Irgendein Text.</p>
  <p class="classy">Irgendein anderer Text.</p>
  <span>Noch mehr Text</span>
</div>

Dans votre cas, l'élément parent est donc body et hérite de la couleur à partir de là, comme dans la réponse ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X