2009-03-04 41 views
79

Hay ocasiones en que puedo elegir entre usar un elemento CSS: hover o JavaScript onmouseover para controlar la apariencia de los elementos html en una página. Considere el siguiente escenario donde un div envuelve una entradaCSS hover vs. JavaScript mouseover

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

Quiero que la entrada para cambiar el color de fondo cuando el cursor del ratón pasa sobre el div. El enfoque CSS es

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

<div><input></div> 

el enfoque JavaScript es

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

¿Cuáles son las ventajas y desventajas de cada método? ¿El enfoque de CSS funciona bien con la mayoría de los navegadores web? ¿JavaScript es más lento que css?

+3

"¿Es javascript más lento que css?" No lo notarás, pero javascript consumirá más recursos y puede ralentizar las cosas si se ejecutan muchas otras secuencias de comandos al mismo tiempo (piénsalo especialmente para dispositivos de mano, sitios web móviles) y no es para lo que debería usarse. Los CSS, por otro lado, utilizan menos recursos y están destinados exactamente a la presentación. Debería usar javascript solo para mejorar la navegación y la funcionalidad del sitio web, pero debería ser navegable para usuarios sin js habilitados. Sugiero el enfoque CSS: hover. –

+1

Esta es una pregunta antigua, por lo que no es sorprendente que el comentario anterior ya no sea válido y que nunca haya sido así. Una razón es la falta de buenas bibliotecas de JS que proporcionen una repetición repetitiva de alto rendimiento (consulte Famo.us). Otra es que los motores JS en los navegadores modernos, tanto de escritorio como móviles, son bastante rápidos. Hay un punto de referencia que lo mide al 80% del rendimiento del código compilado C nativo. Hay excepciones, por supuesto, pero el impresionante rendimiento de JS en el navegador sigue en pie. Lo que la gente realmente "quiere decir" es que el DOM es lento. JS es bastante rápido, simplemente nunca se dieron cuenta. – pmont

Respuesta

54

El problema con: hover es que IE6 solo lo admite en los enlaces. Yo uso jQuery para este tipo de cosas en estos días:

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

Hace las cosas mucho más fáciles. Eso funcionará en IE6, FF, Chrome y Safari.

+0

hice una prueba rápida ... aparentemente IE7 no es compatible con div: hover? ? – John

+0

Sí, IE7 tiene algo así como un 50% de soporte para CSS2. Parte de la razón por la que muchos diseñadores web no lo soportan. – Alan

+0

pero con todos los rastreadores, rastreadores y hackers que abusan de la caja de arena tanto como pueden es simplemente comprensible. no es que ayude contra el seguimiento, pero es comprensible que las personas intenten hacerlo más difícil. conozco personas que no permiten las cookies. y tienen razones válidas para eso también, solo miren la llama del fuego. aún así he votado a favor su respuesta, porque me encantaría que la gente llegara en 2013, se da cuenta de que son rastreados de todos modos y habilita mi (nuestro? Juguete favorito). – jascha

31

El CSS es mucho más fácil de mantener y legible.

+3

La gente debería actualizar esta es la mejor solución ... Sugeriría agregar una etiqueta que detecte el navegador y decirles que actualicen si usando IE <7 –

5

El enfoque de CSS no requiere Javascript.

3

Usar CSS, hace que la administración del estilo sea mucho más fácil.

6

EDITAR: Esta respuesta ya no es válida. CSS está bien soportado y JavaScript (leer: JScript) ahora es más que necesario para cualquier experiencia en la web, y poca gente desabilita javascript.

La respuesta original, ya que mi opinión en 2009.

De la parte superior de mi cabeza:

Con CSS, es posible que tenga problemas con el apoyo del navegador.

Con JScript, las personas pueden desactivar jscript (eso es lo que hago).

Creo que el método preferido es hacer contenido en HTML, diseño con CSS y cualquier cosa dinámica en JScript. Entonces, en este caso, probablemente quieras adoptar el enfoque de CSS.

+1

¿Por qué desactivaría javascript? ¿Te gusta la experiencia anterior al milenio? – Alex

+2

Porque es un riesgo de seguridad, y demasiados sitios abusan de JavaScript. Utilizo un plugin ingenioso de Firefox llamado "NoScript" que selectivamente te permite habilitar solo los scripts de los sitios que deseas. – Alan

0

Si no es necesario un apoyo del 100% para IE6 con JavaScript desactivado podría utilizar algo así como ie7-js con IE comentarios condicionales. Luego solo usa las reglas css para aplicar efectos de desplazamiento. No sé exactamente cómo funciona pero utiliza javascript para hacer funcionar muchas reglas css que normalmente no funcionan en IE7 y 8.

2

En reguards a using jQuery to do hover, siempre uso el complemento HoverIntent ya que no funciona t desencadenar el evento hasta que pause sobre un elemento durante un breve período de tiempo ... esto deja de disparar un montón de eventos de mouse si accidentalmente pasa el mouse sobre ellos o simplemente al elegir una opción.

10

Una ventaja adicional de hacerlo en javascript es que puede agregar/eliminar el efecto de desplazamiento en diferentes momentos, p. Ej.Pase el ratón sobre las filas de la tabla cambia de color, haga clic en deshabilita el efecto de desplazamiento y comienza la edición en el modo de lugar.

+0

gracias - ¡esto en realidad responde la pregunta que estaba buscando! :-) –

10

¿Por qué no ambos? Use jQuery para efectos animados y CSS como alternativa. Esto le brinda los beneficios de jQuery con graceful degradation.

CSS:

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

jQuery (utiliza jQueryUI para animar color):

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

demo

+1

Con las transiciones de CSS, argumentaría que solo debería usar javascript como una reserva cuando: El deslizamiento se aplica a las etiquetas que no son de anclaje en navegadores IE más antiguos. –

+0

Algunos cambios en jsbin hicieron que la demostración no funcionara. Actualicé la demostración para hacer referencia a la versión actual de jQuery, y todo vuelve a funcionar. – kingjeffrey

5

Hay otra diferencia a tener en cuenta entre los dos. Con CSS, el estado :hover es siempre desactivado cuando el mouse se mueve fuera de un elemento. Sin embargo, con JavaScript, el evento onmouseout no se activa cuando el mouse se mueve desde el elemento hacia el navegador Chrome en lugar de hacia el resto de la página.

Esto ocurre más a menudo de lo que piensas, especialmente cuando estás haciendo una barra de navegación en la parte superior de la página con estados de desplazamiento manual personalizados.

4

En Internet Explorer, debe declararse <! DOCTYPE> para que el selector: hover trabaje en otros elementos distintos del < a> elemento.

5

Una diferencia muy grande es que el estado ": hover" se desactiva automáticamente cuando el mouse se mueve fuera del elemento. Como resultado, todos los estilos que se aplican sobre el vuelo estacionario se invierten automáticamente. Por otro lado, con el enfoque javascript, debería definir los eventos "onmouseover" y "onmouseout". Si solo define "onmouseover", los estilos aplicados "onmouseover" persistirán incluso después de que salga el mouse a menos que haya definido explícitamente "onmouseout".