Supprimer le comportement CSS ': hover' de l'élément


142

J'ai du CSS qui change la mise en forme lorsque vous survolez un élément.

HTML:

<div class="test"> blah </div>

CSS:

.test:hover {  border: 1px solid red; }

Dans certains cas, je ne veux pas appliquer CSS en survol. Une façon serait de simplement supprimer la classe CSS du div en utilisant jQuery, mais cela casserait d'autres choses puisque j'utilise également cette classe pour formater ses éléments enfants.

Cela m'a amené à me poser la question: existe-t-il un moyen de supprimer le style css «hover» d'un élément?

Réponses:


44

J'utiliserais deux classes. Conservez votre classe de test et ajoutez une deuxième classe appelée testhover que vous n'ajoutez qu'à celles que vous souhaitez survoler - à côté de la classe de test. Ce n'est pas directement ce que vous avez demandé, mais sans plus de contexte, cela semble être la meilleure solution et peut-être la façon la plus propre et la plus simple de le faire.

Exemple:

.test {  border: 0px; }
.testhover:hover {  border: 1px solid red; }
<div class="test"> blah </div>
<div class="test"> blah </div>
<div class="test testhover"> blah </div>


277

Une méthode pour ce faire est d'ajouter:

pointer-events:none;

à l'élément sur lequel vous souhaitez désactiver le survol.

(Remarque: cela désactive également les événements javascript sur cet élément, les événements de clic tomberont en fait à l'élément derrière).

Prise en charge du navigateur (97,04% au 22 août 2019)

Cela semble être beaucoup plus propre

/**
* This allows you to disable hover events for any elements
*/
.disabled {
  pointer-events: none;  /**<-----------*/
  opacity: 0.2;
}

.button {
  border-radius: 30px;
  padding: 10px 15px;
  border: 2px solid #000;
  color: #FFF;
  background: #2D2D2D;
  text-shadow: 1px 1px 0px #000;
  cursor: pointer;
  display: inline-block;
  margin: 10px;
}

.button-red:hover {
  background: red;
}

.button-green:hover {
  background:green;  
}
<div class="button button-red">Im a red button hover over me</div>

<br/>

<div class="button button-green">Im a green button hover over me</div>

<br/>

<div class="button button-red disabled">Im a disabled red button</div>

<br/>

<div class="button button-green disabled">Im a disabled green button</div>


4
Bonne réponse, il n'est pas pris en charge uniquement sur IE <11, donc ce n'est plus un problème.
Olivier - interfaSys

2
Cette réponse est très propre et exactement ce que je recherchais. Je l'ai déjà utilisé, mais c'est encore nouveau pour moi, alors je l'oublie souvent.
nicorellius

2
Exactement ce dont j'avais besoin parfait: D
Alizoh

5
Aucun vote favorable pour les événements du pointeur. C'est ce que j'ai cherché.
Garavani du

2
Événements de pointeur @Bodman: aucun; Suppression du changement d'arrière-plan au survol, mais également désactivation du lien hypertexte de mon élément. Comment supprimer l'effet de survol mais conserver le lien hypertexte?
BioDeveloper

230

Utilisez la :notpseudo-classe pour exclure les classes auxquelles vous ne souhaitez pas appliquer le survol:

VIOLON

<div class="test"> blah </div>
<div class="test"> blah </div>
<div class="test nohover"> blah </div>

.test:not(.nohover):hover {  
    border: 1px solid red; 
}

Cela fait ce que vous voulez dans une règle css!


6
Certainement la meilleure solution! Moins de code et fonctionne bien dans tous les navigateurs.
Ben Besuijen

Cela a fonctionné pour moi mais j'ai dû faire un changement, un espace avant le :hover. C'est peut-être parce que j'utilise SASS, pas sûr.
nurdyguy

2
Merci, j'ai utilisé ceci pour désactiver les effets de survol sur les boutons personnalisés pour les appareils tactiles dans mon application en ajoutant une touchDeviceclasse bodyet en changeant mes règles css en quelque chose commebody:not(.touchDevice) .button:hover { ... }
Alexander

1
Yepp, cette solution est bien meilleure.
Tsurule Vol

2

ajoutez une nouvelle classe .css:

#test.nohover:hover { border: 0 }

et

<div id="test" class="nohover">blah</div>

La règle css la plus "spécifique" l'emporte, donc cette version border: 0 remplacera la version générique spécifiée ailleurs.


Ce sera. Et il remplacera également l'apparence par défaut, qui est différente. Il y aura donc toujours un navigateur dans lequel le survol sera visible.
maaartinus

1

J'ai aussi eu ce problème, ma solution était d'avoir un élément au-dessus de l'élément sur lequel je ne veux pas d'effet de survol:

.no-hover {
  position: relative;
  opacity: 0.65 !important;
  display: inline-block;
}

.no-hover::before {
  content: '';
  background-color: transparent;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 60;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />

<button class="btn btn-primary">hover</button>
<span class="no-hover">
  <button class="btn btn-primary ">no hover</button>
</span>


1
solution intéressante.
Bodman

-2

Vous voulez garder le sélecteur, donc l'ajouter / le supprimer ne fonctionnera pas. Au lieu d'écrire un sélecteur CSS dur et rapide (ou deux), vous pouvez peut-être simplement utiliser le sélecteur d'origine pour appliquer une nouvelle règle CSS à cet élément en fonction d'un critère:

$(".test").hover(
  if(some evaluation) {
    $(this).css('border':0);
  }
);
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.