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?

développeur
la source

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>

biscuiterie
la source
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>

Bodman
la source
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!

Danield
la source
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.

Marc B
la source
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>

Tige Florin
la source
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);
  }
);
Buley
la source