Cela ne se lit-il pas : "Sélectionner tous les éléments h1
qui ont un ancêtre qui n'est pas un élément div
...?"
C'est le cas. Mais dans un document HTML typique, chaque h1
a au moins deux ancêtres qui ne sont pas des éléments div
— et ces ancêtres ne sont autres que les éléments body
et html
.
C'est là le problème en essayant de filtrer les ancêtres en utilisant :not()
: cela ne fonctionne tout simplement pas de manière fiable, surtout lorsque le :not()
n'est pas qualifié par un autre sélecteur tel qu'un sélecteur de type ou un sélecteur de classe, par exemple .foo:not(div)
. Vous aurez beaucoup plus facile en appliquant simplement des styles à tous les éléments h1
et en les remplaçant par div h1
.
Dans Selectors 4, :not()
a été amélioré pour accepter des sélecteurs complexes complets contenant des combinateurs, y compris le combinateur descendant. Il reste à tester et confirmer si cela sera implémenté dans le profil rapide (et donc en CSS), mais une fois implémenté, vous pourrez l'utiliser pour exclure des éléments avec certains ancêtres. En raison de la manière dont les sélecteurs fonctionnent, la négation doit être effectuée sur l'élément lui-même et non sur l'ancêtre pour fonctionner de manière fiable, et donc la syntaxe sera un peu différente :
h1:not(div h1) { color: #900; }
Toute personne familière avec jQuery soulignera rapidement que ce sélecteur fonctionne dans jQuery aujourd'hui. C'est l'un des nombreuses disparités entre le :not()
de Selector 3 et le :not()
de jQuery, que Selector 4 vise à rectifier.