Cette question semble être à l'opposé de Can I target a :before or :after pseudo-element with a sibling combinator?
Dans votre cas, vous ne pouvez pas appliquer les pseudo-classes à pseudo-éléments. Cela signifie également que vous ne pouvez pas choisir d'appliquer des styles uniquement lorsqu'un pseudo-élément est sur :hover
mais pas son élément générateur. Au lieu de cela, vous ne pouvez sélectionner un pseudo-élément qu'en fonction des états de pseudo-classe de son élément générateur, et uniquement lorsque cet élément générateur est l'objet du sélecteur.
De même, comme mentionné, les pseudo-éléments ne font pas partie du DOM.Par conséquent, de la même façon dont vous ne pouvez pas atteindre pseudo-éléments par rapport aux vrais enfants dans le même élément de production comme indiqué dans ma réponse à la question ci-dessus (explication dans le lien ci-dessus):
a[href^="http"] img ~ :after
Vous ne pouvez pas sélectionner des éléments réels relativement aux pseudo-éléments dans le même élément de production:
.foo:after > div
donc, pour résumer, la raison pour laquelle le sélecteur suivant ne fonctionnera pas:
.foo:after:hover > div
est double:
pseudo-éléments ne peuvent pas avoir des états pseudo-classe, ce qui rend :after:hover
invalide.
Le sujet du sélecteur ici n'est pas .foo
, mais div
, donc :after
ne peut pas appliquer à .foo
. Par conséquent, tenter de sélectionner un élément réel comme sujet d'un sélecteur après avoir appliqué un pseudo-élément à un autre sélecteur n'a pas de sens.
Si vous devez vraiment pas afficher votre div
sur .foo:hover
, mais sur un autre élément enfant, votre seule façon de contourner cela sans l'aide de JavaScript est de faire un autre élément réel sous .foo
qui vient avant le div
(non après):
<div class="foo">
<div></div>
<div>Stuff</div>
</div>
En effet, there is no previous sibling selector; le sélecteur de frères et soeurs à côté, que vous pouvez utiliser à la place de :after >
est seulement pour sélectionner le frère suivant:
.foo > div:first-child + div { display: none; }
.foo > div:first-child { /* rules */ }
.foo > div:first-child:hover + div { display: block; }
Merci pour cette réponse très complète et correcte. Je suis arrivé à cette conclusion de manière indépendante hier, mais vous avez rempli beaucoup de blancs pour expliquer pourquoi c'est le cas. Merci :) – Jason
C'est mon plaisir :) – BoltClock