Y a-t-il une pseudo-classe en CSS à spécifier
:not(:hover)
Ou est-ce le seul moyen de spécifier un élément non survolé?
J'ai parcouru plusieurs références CSS3, et je ne vois aucune mention d'une pseudo-classe CSS pour spécifier le contraire de: hover.
Oui, utilisez :not(:hover)
.child:not(:hover){
opacity: 0.3;
}
Un autre exemple; Je pense que vous voulez: "quand on est survolé, atténuer tous les autres éléments".
Si mon hypothèse est correcte et si tous vos sélecteurs sont dans le même parent:
.parent:hover .child{
opacity: 0.2; // Dim all other elements
}
.child:hover{
opacity: 1; // Not the hovered one
}
.child{
display:inline-block;
background:#000;
border:1px solid #fff;
width: 50px;
height: 50px;
transition: 0.4s;
}
.parent:hover .child{
opacity: 0.3;
}
.parent .child:hover{
opacity: 1;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
Sinon ... utilisez simplement la logique par défaut:
.child{
opacity: 0.2; // Yey, not hovered!
}
.child:hover{
opacity: 1; // ME! ME! ME!
}
Il n'y a pas une telle pseudo-classe. Il n’est pas nécessaire que vous utilisiez :not(:hover)
. L’intérêt de la pseudo-classe :not()
est d’autoriser les auteurs à écrire des négations sans avoir à spécifier de négations séparées pour chaque pseudo-classe dynamique existante (et future) où un élément ne peut que concorder ou ne pas correspondre au pseudo-classe.
Par exemple, seuls certains éléments peuvent être :enabled
Ou :disabled
- la plupart des éléments ne sont ni car la sémantique ne fait simplement pas ne s'applique pas - mais un élément ne peut être désigné que par le périphérique de pointage (:hover
) ou non (:not(:hover)
). Fournir des négociations qui peuvent déjà être réalisées directement à l’aide de :not()
nuirait grandement à son utilité (bien qu’il puisse toujours être utilisé pour annuler tout autre sélecteur simple - ou sélecteurs complexes entiers route).
L'argument selon lequel une telle pseudo-classe serait beaucoup moins coûteuse en calcul est assez faible. L'implémentation la plus naïve d'une telle pseudo-classe serait une vérification littérale :not(:hover)
, qui ne serait pas meilleure. Toute implémentation plus complexe ou optimisée et vous demandez aux fournisseurs d'implémenter une pseudo-classe aussi rapide que voire plus rapide que :not(:hover)
, ce qui est déjà assez peu courant, compte tenu des autres options que vous pouvez utiliser. ayez comme cascading et :not(:hover)
(à chaque fois que la cascade n'est pas une option) à laquelle vous avez facilement accès. Cela ne justifie simplement pas le temps et les efforts nécessaires pour spécifier, implémenter et tester une alternative à au moins une autre méthode existante qui est fonctionnellement équivalente à 100% (et qui s'applique à au moins 80% des scénarios). Et il y a aussi la question de nommer une telle pseudo-classe - vous n'avez pas proposé de nom pour cela, et je ne peux pas en penser un bon non plus. :not-hover
Est seulement plus court de deux octets et à peine moins de travail à taper. Si quelque chose, c'est potentiellement plus déroutant que :not(:hover)
.
Si vous êtes préoccupé par la spécificité, notez que la pseudo-classe :not()
elle-même n'est pas prise en compte pour la spécificité; seul son argument le plus spécifique est . :not(:hover)
et :hover
sont également spécifiques. Donc, la spécificité n'est pas un problème non plus.
Si vous êtes inquiet au sujet de la prise en charge du navigateur, une telle pseudo-classe, si elle était introduite, aurait probablement été introduite parallèlement à :not()
, ou à un niveau ultérieur de Selectors, car elle n'apparaissait pas dans CSS2 (où :hover
A été introduit pour la première fois il y a plus de 17 ans et a été implémenté dans IE4 une année encore auparavant. Il serait inutile de l'introduire dans un niveau ultérieur, car les auteurs seraient simplement obligés de continuer à utiliser :not(:hover)
jusqu'à ce que les navigateurs commencent à implémenter cette nouvelle pseudo-classe de toute façon, et ils n'auraient aucune raison de changer.
Notez que ce n'est pas la même chose que la question suivante, qui parle d'événements vs états (il s'agit à l'origine de :focus
Plutôt que de :hover
, Mais le même principe s'applique): Fait Les CSS ont un sélecteur: flou (pseudo-classe)?
a {
/*styles*/
}
est un lien normal (non survolé)
a:hover {
/*styles*/
}
est un lien survolé