Rimuovere il comportamento CSS ": hover" dall'elemento


142

Ho CSS che cambia la formattazione quando passi il mouse sopra un elemento.

HTML:

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

CSS:

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

In alcuni casi non voglio applicare CSS al passaggio del mouse. Un modo sarebbe rimuovere semplicemente la classe CSS dal div usando jQuery, ma ciò spezzerebbe altre cose poiché utilizzo anche quella classe per formattare i suoi elementi figlio.

Questo mi ha portato a porre una domanda: esiste un modo per rimuovere lo stile CSS "hover" da un elemento?

Risposte:


44

Vorrei usare due classi. Mantieni la tua classe di test e aggiungi una seconda classe chiamata testhover che aggiungi solo a quelli che vuoi passare con il mouse - insieme alla classe di test. Questo non è direttamente quello che hai chiesto, ma senza più contesto sembra la soluzione migliore ed è probabilmente il modo più pulito e semplice di farlo.

Esempio:

.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

Un metodo per fare ciò è aggiungere:

pointer-events:none;

all'elemento su cui si desidera disabilitare il passaggio del mouse.

(nota: questo disabilita anche gli eventi javascript anche su quell'elemento, gli eventi click passeranno all'elemento dietro).

Supporto per il browser (97,04% al 22 agosto 2009)

Questo sembra essere molto più pulito

/**
* 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
Buona risposta, non è supportato solo su IE <11, quindi non è più un problema.
Olivier - interfaSys,

2
Questa risposta è molto chiara ed è esattamente quello che stavo cercando. L'ho usato prima, ma è ancora nuovo per me, quindi spesso me ne dimentico.
Nicorellius,

2
Esattamente quello di cui avevo bisogno perfetto: D
Alizoh,

5
Voto per gli eventi puntatore nessuno. Questo è quello che ho cercato.
Garavani,

2
@Bodman puntatore-eventi: nessuno; Rimossa la modifica dello sfondo al passaggio del mouse ma disabilitato anche il collegamento ipertestuale dal mio elemento. Come rimuovere l'effetto hover ma conservare il collegamento ipertestuale?
BioDeveloper il

230

Utilizzare la :notpseudo-classe per escludere le classi alle quali non si desidera applicare l'hover:

VIOLINO

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

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

Questo fa quello che vuoi in una regola CSS!


6
Sicuramente la migliore soluzione! Meno codice e funziona bene in ogni browser.
Ben Besuijen,

Questo ha funzionato per me, ma ho dovuto fare un cambiamento, uno spazio prima del :hover. Questo potrebbe essere perché sto usando SASS, non sono sicuro.
Nurdyguy,

2
Grazie, l'ho usato per disabilitare gli effetti hover sui pulsanti personalizzati per i dispositivi touch nella mia app aggiungendo touchDeviceclasse bodye cambiando le mie regole css in qualcosa del generebody:not(.touchDevice) .button:hover { ... }
Alexander

1
Sì, quella soluzione è molto meglio.
Tsurule Vol,

2

aggiungi una nuova classe .css:

#test.nohover:hover { border: 0 }

e

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

Vince la regola css più "specifica", quindi questo bordo: la versione 0 sovrascriverà quella generica specificata altrove.


Lo farà. E sovrascriverà anche l'aspetto predefinito, che è diverso. Quindi ci sarà sempre un browser in cui il passaggio del mouse sarà visibile.
maaartinus,

1

Ho anche avuto questo problema, la mia soluzione era quella di avere un elemento sopra l'elemento su cui non voglio un effetto hover:

.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
soluzione interessante.
Bodman,

-2

Vuoi mantenere il selettore, quindi aggiungerlo / rimuoverlo non funzionerà. Invece di scrivere un selettore CSS (o due) rigido e veloce, forse puoi semplicemente usare il selettore originale per applicare la nuova regola CSS a quell'elemento in base a un criterio:

$(".test").hover(
  if(some evaluation) {
    $(this).css('border':0);
  }
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.