Passaggio del mouse CSS e passaggio del mouse JavaScript [chiuso]


84

Ci sono momenti in cui posso scegliere tra l'utilizzo di un elemento CSS: hover o JavaScript onmouseover per controllare l'aspetto degli elementi html su una pagina. Considera il seguente scenario in cui un div racchiude un input

<div>
<input id="input">
</div>

Voglio che l'input cambi il colore di sfondo quando il cursore del mouse passa sopra il div. L'approccio CSS è

<style>
  input {background-color:White;}
  div:hover input {background-color:Blue;}
</style>

<div><input></div>

L'approccio JavaScript è

<div onmouseover="document.getElementById('input').style.backgroundColor='Blue';">
  <input id="input">
</div>

Quali sono i vantaggi e gli svantaggi di ciascun approccio? L'approccio CSS funziona bene con la maggior parte dei browser web? JavaScript è più lento di css?


1
L'approccio CSS non richiede Javascript.
pd.

Suggerirei di utilizzare Qualunque cosa: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun

3
"JavaScript è più lento di css?" Non lo noterai, ma javascript consumerà più risorse e può rallentare le cose se molti altri script sono in esecuzione contemporaneamente (pensa in particolare per i dispositivi palmari, i siti Web mobili) e non è quello per cui dovrebbe essere usato. I CSS d'altra parte utilizzano meno risorse e sono pensati esattamente per la presentazione. È necessario utilizzare javascript solo per migliorare la navigazione e le funzionalità del sito Web, ma dovrebbe essere comunque navigabile per gli utenti senza js abilitato. Suggerisco l'approccio CSS: hover.
Jose Faeti

1
Questa è una vecchia domanda, quindi non sorprende che il commento sopra non sia più valido e potrebbe non esserlo mai stato. Uno dei motivi è la mancanza di buone librerie JS che forniscano boilerplate ad alte prestazioni (vedere Famo.us). Un altro è che i motori JS nei browser moderni, sia desktop che mobili, sono piuttosto veloci. C'è un benchmark che misura all'80% le prestazioni del codice compilato in C nativo. Ci sono ovviamente casi eccezionali, ma le prestazioni impressionanti di JS nel browser sono ancora valide. Ciò che le persone realmente "intendono" è che il DOM è lento. JS è abbastanza veloce, non se ne sono mai resi conto.
pmont

Risposte:


59

Il problema con: hover è che IE6 lo supporta solo sui collegamenti. Uso jQuery per questo genere di cose in questi giorni:

$("div input").hover(function() {
  $(this).addClass("blue");
}, function() {
  $(this).removeClass("blue");
});

Rende le cose molto più facili. Funzionerà in IE6, FF, Chrome e Safari.


ho fatto un rapido test ... a quanto pare IE7 non supporta div: hover ??
John

Sì, IE7 ha qualcosa come il 50% di supporto per CSS2. Parte del motivo per cui molti web designer non lo sopportano.
Alan

ma con tutti quei tracker, sniffer e hacker che abusano della sandbox il più possibile è comprensibile. non che aiuti contro il tracciamento, ma è comprensibile che le persone cerchino di renderlo più difficile. Conosco persone che non consentono i cookie. e hanno valide ragioni anche per questo, basta guardare le pecore del fuoco. Ho ancora votato positivamente la tua risposta, perché mi piacerebbe che le persone arrivassero nel 2013, si rendessero conto che vengono comunque rintracciate e abilitano il mio (nostro?) giocattolo preferito.
jascha

mi chiedo se metroui sta consentendo agli utenti di disabilitare javascript: p ma seriamente, chromeos, il sistema operativo di mozilla, metroui usano tutti javascript. html5, css3, webgl e javascript saranno i linguaggi per creare app lato client in pochi anni. sii paziente, presto ci sarà javascript fuori dal browser, non è più necessario disabilitarlo nel browser quindi :)
jascha

32

Quello CSS è molto più manutenibile e leggibile.


18
È gestibile fino a quando non si deve supportare IE6 su elementi non <a>. Allora è una seccatura perché devi usare un JS-hack. Ma i CSS sono ancora il mio modo preferito di procedere. Consenti alle persone che utilizzano un browser del 1999 di avere un'esperienza del 1999.
Tyson

4
Le persone dovrebbero aggiornare questa è la soluzione migliore ... Suggerirei di aggiungere un tag che rileva il browser e dice loro di aggiornare se si utilizza IE <7
Travis Pessetto

11

Perché non entrambi? Usa jQuery per effetti animati e CSS come riserva. Questo ti dà i vantaggi di jQuery con un grazioso degrado .

CSS:

a {color: blue;}
a:hover {color: red;}

jQuery (usa jQueryUI per animare il colore):

$('a').hover( 
  function() {
    $(this)
      .css('color','blue')
      .animate({'color': 'red'}, 400);
  },
  function() {
    $(this)
      .animate({'color': 'blue'}, 400);
  }
);

demo


1
Con le transizioni CSS direi che dovresti usare javascript come fallback solo quando: Hover viene applicato a tag non di ancoraggio nei browser IE meno recenti.
Adam Youngers

Alcune modifiche a jsbin hanno impedito alla demo di funzionare. Ho aggiornato la demo per fare riferimento alla versione corrente di jQuery e tutto funziona di nuovo.
kingjeffrey

10

Un ulteriore vantaggio di farlo in javascript è che puoi aggiungere / rimuovere l'effetto al passaggio del mouse in diversi momenti nel tempo, ad esempio il passaggio del mouse sulle righe della tabella cambia colore, il clic disattiva l'effetto al passaggio del mouse e avvia la modifica in modalità posizione.


grazie - questo in realtà ha risposto alla domanda che stavo cercando! :-)
Peter S Magnusson

6

Una grande differenza è che lo stato ": hover" viene automaticamente disattivato quando il mouse esce dall'elemento. Di conseguenza, tutti gli stili applicati al passaggio del mouse vengono automaticamente invertiti. D'altra parte, con l'approccio javascript, dovresti definire sia gli eventi "onmouseover" che "onmouseout". Se definisci solo "onmouseover", gli stili che vengono applicati "onmouseover" persisteranno anche dopo che esci dal mouse a meno che tu non abbia definito esplicitamente "onmouseout".


6

EDIT: questa risposta non è più vera. CSS è ben supportato e Javascript (leggi: JScript) è ora praticamente richiesto per qualsiasi esperienza web e poche persone disabilitano javascript.

La risposta originale, come la mia opinione nel 2009.

Fuori dalla mia testa:

Con CSS, potresti avere problemi con il supporto del browser.

Con JScript, le persone possono disabilitare jscript (questo è quello che faccio).

Credo che il metodo preferito sia quello di creare contenuti in HTML, layout con CSS e qualsiasi cosa dinamica in JScript. Quindi, in questo caso, probabilmente vorrai adottare l'approccio CSS.


4
Perché dovresti disabilitare javascript? Ti piace l'esperienza pre-millennio?
Alex

5
Perché è un rischio per la sicurezza e troppi siti abusano di javascript. Io uso un elegante plugin per Firefox chiamato "NoScript" che ti consente di abilitare selettivamente solo gli script dei siti che desideri.
Alan,

5

C'è un'altra differenza da tenere a mente tra i due. Con i CSS, lo :hoverstato è sempre disattivato quando il mouse si sposta da un elemento. Tuttavia, con JavaScript, l' onmouseoutevento non viene generato quando il mouse si sposta dall'elemento sul chrome del browser piuttosto che sul resto della pagina.

Ciò accade più spesso di quanto potresti pensare, specialmente quando crei una barra di navigazione nella parte superiore della pagina con stati al passaggio del mouse personalizzati.


4

In Internet Explorer, deve essere dichiarato un <! DOCTYPE> affinché il selettore: hover funzioni su elementi diversi dall'elemento <a>.




0

Se non hai bisogno del supporto al 100% per IE6 con javascript disabilitato, potresti usare qualcosa come ie7-js con commenti condizionali di IE. Quindi usi le regole CSS per applicare gli effetti al passaggio del mouse. Non so esattamente come funziona, ma utilizza javascript per far funzionare molte regole CSS che normalmente non funzionano in IE7 e 8.

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.