2009-03-04 29 views
79

Ci sono momenti in cui ho una scelta tra l'utilizzo di un elemento CSS: hover o JavaScript onmouseover per controllare l'aspetto degli elementi html su una pagina. Si consideri il seguente scenario in cui un div avvolge un ingressoCSS mouseoverover JavaScript mouseover

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

voglio l'input per cambiare 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 ogni approccio? L'approccio CSS funziona bene con la maggior parte dei browser web? JavaScript è più lento del css?

+3

"javascript è più lento del css?" Non lo noterete, ma javascript consumerà più risorse e può rallentare se molti altri script sono in esecuzione contemporaneamente (pensate soprattutto per dispositivi palmari, siti Web mobili), e non è quello per cui dovrebbe essere usato. D'altra parte, i CSS usano meno risorse e sono pensati esattamente per la presentazione. Dovresti usare javascript solo per migliorare la navigazione e la funzionalità del sito, ma dovrebbe essere ancora navigabile per gli utenti senza js abilitato. Suggerisco il CSS: approccio al passaggio del mouse. –

+1

Questa è una vecchia domanda, quindi non sorprende che il commento sopra non sia più valido e potrebbe non essere mai stato. Una ragione è la mancanza di buone librerie JS che forniscono un boilerplate ad alte prestazioni (vedi Famo.us). Un altro è che i motori JS nei browser moderni, sia desktop che mobili, sono piuttosto veloci. C'è un punto di riferimento che lo misura all'80% delle prestazioni del codice compilato C nativo. Ci sono ovviamente dei casi eccezionali, ma l'impressionante prestazione di JS nel browser è ancora valida. Ciò che le persone realmente "intendono" è che il DOM è lento. JS è abbastanza veloce, non l'hanno mai realizzato. – pmont

risposta

54

Il problema con: hover è che IE6 lo supporta solo sui collegamenti. Io 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ù semplici. Funzionerà in IE6, FF, Chrome e Safari.

+0

ho fatto un test rapido ... apparentemente IE7 non supporta div: hover? ? – John

+0

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

+0

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 il licantropo. ho ancora votato la tua risposta, perché mi piacerebbe se la gente arrivasse nel 2013, rendendosi conto che sono comunque monitorati e abilitano il mio (nostro?) Giocattolo preferito. – jascha

31

Quello CSS è molto più gestibile e leggibile.

+3

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 –

5

L'approccio CSS non richiede Javascript.

3

Usa CSS, semplifica la gestione dello stile stesso.

6

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

La risposta originale, come me nel 2009.

Fuori della parte superiore della mia testa:

Con i CSS, si possono avere problemi con il supporto del browser.

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

Credo che il metodo preferito sia fare il contenuto in HTML, Layout con CSS e qualsiasi cosa dinamica in JScript. Quindi, in questo caso, vorresti probabilmente prendere l'approccio CSS.

+1

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

+2

Perché è un rischio per la sicurezza e troppi siti abusano di javascript. Uso un nifty plugin firefox chiamato "NoScript" che consente in modo selettivo di abilitare solo gli script dai siti che si desidera. – Alan

0

Se non è necessario il supporto al 100% per IE6 con JavaScript disabilitato si potrebbe usare qualcosa come ie7-js con IE commenti condizionali. Quindi devi solo usare le regole CSS per applicare effetti al passaggio del mouse. Non so esattamente come funziona, ma usa javascript per fare un sacco di regole css che funzionano normalmente in IE7 e 8.

2

In reguards a using jQuery to do hover, io uso sempre il plugin HoverIntent perché non lo fa Attiva l'evento fino a quando non ti fermi su un elemento per un breve periodo di tempo ... questo smette di sparare a molti eventi del mouse se accidentalmente fai scorrere il mouse su di loro o semplicemente mentre scegli un'opzione.

10

Un ulteriore vantaggio di farlo in javascript è che è possibile aggiungere/rimuovere l'effetto hover in diversi momenti nel tempo, ad es.il passaggio del mouse sulle righe della tabella cambia colore, fai clic su Disabilita l'effetto hover e avvia la modifica in modalità luogo.

+0

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

10

Perché non entrambi? Usa jQuery per effetti animati e CSS come riserva. Questo ti offre i vantaggi di jQuery con graceful degradation.

CSS:

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

jQuery (usa jQueryUI per animare 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 quando: Hover è applicato ai tag non anchor nei browser IE più vecchi. –

+0

Alcune modifiche a jsbin hanno reso la demo non funzionante. Ho aggiornato la demo per fare riferimento alla versione corrente di jQuery e tutto funziona di nuovo. – kingjeffrey

5

C'è un'altra differenza da tenere a mente tra i due. Con i CSS, lo stato :hover è sempre disattivato quando il mouse si sposta da un elemento. Tuttavia, con JavaScript, l'evento onmouseout non viene attivato quando il mouse si sposta dall'elemento sul browser chrome anziché sul resto della pagina.

Questo accade più spesso di quanto si possa pensare, soprattutto quando si sta creando una barra di navigazione nella parte superiore della pagina con stati di passaggio del mouse personalizzati.

4

In Internet Explorer, deve essere dichiarato un <! DOCTYPE> per: il selettore del passaggio del mouse su elementi diversi dall'elemento < a>.

5

Una grande differenza è che lo stato ": hover" viene automaticamente disattivato quando il mouse si sposta fuori dall'elemento. Di conseguenza, tutti gli stili applicati al passaggio del mouse vengono automaticamente invertiti. D'altra parte, con l'approccio javascript, è necessario definire entrambi gli eventi "onmouseover" e "onmouseout". Se si definisce solo "onmouseover", gli stili applicati "onmouseover" verranno mantenuti anche dopo il mouse, a meno che non si sia definito esplicitamente "onmouseout".