CSS hover vs. JavaScript mouseover [fechado]

84

Há momentos em que posso escolher entre usar um elemento CSS: hover ou JavaScript onmouseover para controlar a aparência dos elementos html em uma página. Considere o seguinte cenário, em que um div envolve uma entrada

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

Eu quero que a entrada mude a cor de fundo quando o cursor do mouse passar sobre o div. A abordagem CSS é

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

<div><input></div>

A abordagem do JavaScript é

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

Quais são as vantagens e desvantagens de cada abordagem? A abordagem CSS funciona bem com a maioria dos navegadores da web? JavaScript é mais lento do que css?

John
fonte
1
A abordagem CSS não requer Javascript.
pd.
Eu recomendaria usar o Whatever: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun
3
"O javascript é mais lento que o css?" Você não notará, mas o javascript consumirá mais recursos e pode tornar as coisas mais lentas se muitos outros scripts estiverem sendo executados ao mesmo tempo (pense especialmente para dispositivos portáteis, sites móveis), e não é para isso que deve ser usado. Os CSSs, por outro lado, usam menos recursos e são feitos exatamente para apresentação. Você deve usar javascript apenas para melhorar a navegação e funcionalidade do site, mas ainda deve ser navegável para usuários sem js habilitado. Eu sugiro a abordagem CSS: hover.
Jose Faeti
1
Esta é uma pergunta antiga, então não é surpreendente que o comentário acima não seja mais válido, e pode nunca ter sido. Um dos motivos é a falta de boas bibliotecas JS que forneçam clichês de alto desempenho (consulte Famo.us). Outra é que os motores JS nos navegadores modernos, tanto para desktop quanto para celular, são bastante rápidos. Há um benchmark medindo em 80% o desempenho do código C compilado nativo. Existem casos de exceção, é claro, mas o desempenho impressionante de JS no navegador ainda permanece. O que as pessoas realmente "querem dizer" é que o DOM é lento. JS é muito rápido, eles simplesmente nunca perceberam.
pmont,

Respostas:

59

O problema com: hover é que o IE6 só o suporta em links. Eu uso jQuery para esse tipo de coisa hoje em dia:

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

Torna as coisas muito mais fáceis. Isso funcionará no IE6, FF, Chrome e Safari.

cletus
fonte
fiz um teste rápido ... aparentemente o IE7 não suporta div: hover ??
John
Sim, o IE7 tem cerca de 50% de suporte para CSS2. Parte do motivo pelo qual muitos web designers não suportam isso.
Alan,
mas com todos aqueles rastreadores, farejadores e hackers que abusam da sandbox tanto quanto podem, é compreensível. não que isso ajude a evitar o rastreamento, mas é compreensível que as pessoas tentem dificultar isso. eu conheço pessoas que não permitem cookies. e eles têm razões válidas para isso também, basta olhar para a firesheep. Ainda votei positivamente na sua resposta, pois adoraria que as pessoas chegassem em 2013, percebessem que são rastreadas de qualquer maneira e ativassem meu (nosso?) brinquedo favorito.
jascha
Eu me pergunto se metroui está permitindo que os usuários desabilitem javascript: p, mas sério, chromeos, mozilla's OS, metroui todos usam javascript html5, css3, webgl e javascript serão as linguagens para criar aplicativos do lado do cliente em alguns anos. seja paciente, em breve haverá javascript fora do navegador, não há mais necessidade de desativá-lo no navegador :)
jascha
32

O CSS é muito mais fácil de manter e legível.

Ólafur Waage
fonte
18
É sustentável até que você tenha que oferecer suporte ao IE6 em elementos não <a>. Então é uma dor porque você tem que usar um hack JS. Mas CSS ainda é meu caminho preferido. Deixe as pessoas que usam um navegador de 1999 terem uma experiência de 1999.
Tyson,
4
As pessoas deveriam atualizar esta é a melhor solução ... Eu sugeriria adicionar uma tag que detecta o navegador e diz a eles para atualizarem se estiverem usando o IE <7
Travis Pessetto
11

Por que não ambos? Use jQuery para efeitos animados e CSS como substituto. Isso oferece os benefícios do jQuery com degradação elegante .

CSS:

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

jQuery (usa jQueryUI para animar cores):

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

demo

Kingjeffrey
fonte
1
Com as transições CSS, eu diria que você só deve usar javascript como fallback quando: O foco é aplicado a tags não âncora em navegadores IE mais antigos.
Adam Youngers
Algumas mudanças no jsbin fizeram a demonstração não funcionar. Eu atualizei a demonstração para fazer referência à versão atual do jQuery e tudo funciona novamente.
kingjeffrey 01 de
10

Um benefício adicional de fazer isso em javascript é que você pode adicionar / remover o efeito de foco em diferentes pontos no tempo - por exemplo, passar o mouse sobre as linhas da tabela muda de cor, clicar em desativa o efeito de foco e inicia a edição no modo local.

Shaun Mahood
fonte
obrigado - isso realmente respondeu à pergunta que eu estava procurando! :-)
Peter S Magnusson
6

Uma diferença muito grande é que o estado ": hover" é desativado automaticamente quando o mouse se move para fora do elemento. Como resultado, todos os estilos aplicados ao passar o mouse são automaticamente revertidos. Por outro lado, com a abordagem javascript, você teria que definir os eventos "onmouseover" e "onmouseout". Se você definir apenas "onmouseover", os estilos que são aplicados "onmouseover" irão persistir mesmo depois que você tirar o mouse, a menos que você tenha definido explicitamente "onmouseout".

Kunal
fonte
6

EDIT: Esta resposta não é mais verdadeira. CSS é bem suportado e Javascript (leia-se: JScript) agora é praticamente necessário para qualquer experiência na web, e poucas pessoas desabilitam o javascript.

A resposta original, conforme minha opinião em 2009.

Em cima da minha cabeça:

Com CSS, você pode ter problemas com o suporte do navegador.

Com JScript, as pessoas podem desabilitar jscript (isso é o que eu faço).

Acredito que o método preferido é fazer conteúdo em HTML, Layout com CSS e qualquer coisa dinâmica em JScript. Portanto, neste caso, você provavelmente desejaria adotar a abordagem CSS.

Alan
fonte
3
Por que você desabilitaria o javascript? Você gosta da experiência pré-milênio?
Alex
5
Porque é um risco de segurança e muitos sites abusam do javascript. Eu uso um plug-in do firefox bacana chamado "NoScript" que permite que você habilite seletivamente apenas os scripts de sites que você deseja.
Alan
5

Há outra diferença a ter em mente entre os dois. Com CSS, o :hoverestado é sempre desativado quando o mouse se move para fora de um elemento. No entanto, com JavaScript, o onmouseoutevento não é disparado quando o mouse se move para fora do elemento para o cromo do navegador, e não para o resto da página.

Isso acontece com mais frequência do que você imagina, especialmente quando você está criando uma barra de navegação na parte superior da página com estados de foco personalizados.

thismax
fonte
4

No Internet Explorer, deve ser declarado um <! DOCTYPE> para que o seletor: hover funcione em outros elementos além do elemento <a>.

Villa Martin
fonte
3

Use CSS para facilitar o gerenciamento do próprio estilo.

Hawk Kroeger
fonte
2

Em relação ao uso do jQuery para pairar , eu sempre uso o plugin HoverIntent, pois ele não dispara o evento até que você pause sobre um elemento por um breve período de tempo ... isso para de disparar muitos eventos do mouse sobre se você executar acidentalmente o mouse sobre eles ou simplesmente ao escolher uma opção.

alex
fonte
0

Se você não precisa de 100% de suporte para IE6 com javascript desabilitado, você pode usar algo como ie7-js com comentários condicionais do IE. Depois, basta usar as regras css para aplicar os efeitos de foco. Não sei exatamente como funciona, mas ele usa javascript para fazer várias regras de css funcionarem que normalmente não funcionam no IE7 e 8.

AnnanFay
fonte