CSS Hover vs. JavaScript Mouseover [geschlossen]

84

Es gibt Zeiten, in denen ich die Wahl habe, ein CSS-Element zu verwenden: Hover oder JavaScript OnMouseover, um das Erscheinungsbild von HTML-Elementen auf einer Seite zu steuern. Stellen Sie sich das folgende Szenario vor, in dem ein Div eine Eingabe umschließt

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

Ich möchte, dass die Eingabe die Hintergrundfarbe ändert, wenn der Mauszeiger über dem div bewegt wird. Der CSS-Ansatz ist

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

<div><input></div>

Der JavaScript-Ansatz ist

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

Was sind die Vor- und Nachteile jedes Ansatzes? Funktioniert der CSS-Ansatz mit den meisten Webbrowsern gut? Ist JavaScript langsamer als CSS?

John
quelle
1
Der CSS-Ansatz erfordert kein Javascript.
pd.
Ich würde empfehlen, Whatever zu verwenden:
hover
3
"Ist Javascript langsamer als CSS?" Sie werden es nicht bemerken, aber Javascript verbraucht mehr Ressourcen und kann die Arbeit verlangsamen, wenn viele andere Skripte gleichzeitig ausgeführt werden (insbesondere für Handheld-Geräte, mobile Websites), und es ist nicht das, wofür es verwendet werden sollte. CSSs hingegen verbrauchen weniger Ressourcen und sind genau für die Präsentation gedacht. Sie sollten Javascript nur verwenden, um die Navigation und Funktionalität der Website zu verbessern. Es sollte jedoch weiterhin für Benutzer ohne aktiviertes js navigierbar sein. Ich schlage den CSS: Hover-Ansatz vor.
Jose Faeti
1
Dies ist eine alte Frage, daher ist es nicht verwunderlich, dass der obige Kommentar nicht mehr gültig ist und möglicherweise nie gültig war. Ein Grund ist das Fehlen guter JS-Bibliotheken, die eine Hochleistungs-Boilerplate bieten (siehe Famo.us). Ein weiterer Grund ist, dass die JS-Engines in modernen Browsern, sowohl auf dem Desktop als auch auf dem Handy, recht schnell sind. Es gibt einen Benchmark, der die Leistung von nativem C-kompiliertem Code bei 80% misst. Es gibt natürlich Ausnahmefälle, aber die beeindruckende Leistung von JS im Browser bleibt bestehen. Was die Leute wirklich "meinen" ist, dass das DOM langsam ist. JS ist ziemlich schnell, sie haben es einfach nie bemerkt.
pmont

Antworten:

59

Das Problem mit: hover ist, dass IE6 es nur auf Links unterstützt. Ich benutze jQuery heutzutage für solche Dinge:

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

Erleichtert die Arbeit erheblich. Das funktioniert in IE6, FF, Chrome und Safari.

Cletus
quelle
Ich habe einen kurzen Test gemacht ... anscheinend unterstützt IE7 Div: Hover nicht?
John
Ja, IE7 unterstützt CSS2 zu etwa 50%. Ein Teil des Grundes, warum viele Webdesigner es nicht aushalten können.
Alan
Aber mit all den Trackern, Schnüfflern und Hackern, die den Sandkasten so oft wie möglich missbrauchen, ist das einfach verständlich. nicht, dass es gegen Tracking hilft, aber es ist verständlich, dass die Leute versuchen, es schwieriger zu machen. Ich kenne Leute, die keine Cookies zulassen. und sie haben auch dafür gültige Gründe, schauen Sie sich nur Feuerschafe an. Ich habe Ihre Antwort immer noch positiv bewertet, weil ich es lieben würde, wenn die Leute 2013 ankommen würden, erkennen würden, dass sie sowieso verfolgt werden und mein (unser?) Lieblingsspielzeug aktivieren würden.
Jascha
Ich frage mich, ob Metroui es Benutzern ermöglicht, Javascript zu deaktivieren: p Aber im Ernst, Chromeos, Mozillas Betriebssystem, Metroui verwenden alle Javascript. HTML5, CSS3, WebGL und Javascript werden in einigen Jahren die Sprachen sein, um clientseitige Apps zu erstellen. Sei einfach geduldig, bald wird es Javascript außerhalb des Browsers geben, dann musst du es nicht mehr im Browser deaktivieren :)
Jascha
32

Das CSS ist viel wartbarer und lesbarer.

Ólafur Waage
quelle
18
Es kann gewartet werden, bis Sie IE6 für Nicht-<a> -Elemente unterstützen müssen. Dann ist es ein Schmerz, weil Sie einen JS-Hack verwenden müssen. Aber CSS ist immer noch mein bevorzugter Weg. Lassen Sie die Leute, die einen Browser von 1999 verwenden, eine Erfahrung von 1999 machen.
Tyson
4
Leute sollten aktualisieren, dies ist die beste Lösung ... Ich würde vorschlagen, ein Tag hinzuzufügen, das den Browser erkennt und sie
auffordert,
11

Warum nicht beide? Verwenden Sie jQuery für animierte Effekte und CSS als Fallback. Dies bietet Ihnen die Vorteile von jQuery mit einer angemessenen Verschlechterung .

CSS:

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

jQuery (verwendet jQueryUI zum Animieren der Farbe):

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

Demo

Kingjeffrey
quelle
1
Bei CSS-Übergängen würde ich argumentieren, dass Sie Javascript nur als Fallback verwenden sollten, wenn: Hover in älteren IE-Browsern auf Nicht-Anker-Tags angewendet wird.
Adam Youngers
Einige Änderungen bei jsbin haben dazu geführt, dass die Demo nicht funktioniert hat. Ich habe die Demo aktualisiert, um auf die aktuelle Version von jQuery zu verweisen, und alles funktioniert wieder.
Kingjeffrey
10

Ein zusätzlicher Vorteil von Javascript besteht darin, dass Sie den Hover-Effekt zu verschiedenen Zeitpunkten hinzufügen / entfernen können - z. B. wenn Sie mit der Maus über Tabellenzeilen fahren, ändert sich die Farbe, klicken Sie auf Deaktivieren Sie den Hover-Effekt und starten Sie die Bearbeitung im Place-Modus.

Shaun Mahood
quelle
danke - das hat tatsächlich die Frage beantwortet, nach der ich gesucht habe! :-)
Peter S Magnusson
6

Ein sehr großer Unterschied besteht darin, dass der Status ": hover" automatisch deaktiviert wird, wenn sich die Maus aus dem Element herausbewegt. Infolgedessen werden alle Stile, die beim Hover angewendet werden, automatisch umgekehrt. Andererseits müssten Sie beim Javascript-Ansatz sowohl "onmouseover" - als auch "onmouseout" -Ereignisse definieren. Wenn Sie nur "onmouseover" definieren, bleiben die Stile, die "onmouseover" angewendet werden, auch nach dem Mouseout erhalten, es sei denn, Sie haben explizit "onmouseout" definiert.

Kunal
quelle
6

EDIT: Diese Antwort gilt nicht mehr. CSS wird gut unterstützt und Javascript (sprich: JScript) wird jetzt für jede Web-Erfahrung benötigt, und nur wenige Leute deaktivieren Javascript.

Die ursprüngliche Antwort, wie meine Meinung im Jahr 2009.

Aus dem Kopf:

Bei CSS können Probleme mit der Browserunterstützung auftreten.

Mit JScript können Leute jscript deaktivieren (das ist was ich tue).

Ich glaube, die bevorzugte Methode besteht darin, Inhalte in HTML, Layout mit CSS und alles Dynamische in JScript zu erstellen. In diesem Fall möchten Sie wahrscheinlich den CSS-Ansatz wählen.

Alan
quelle
3
Warum sollten Sie Javascript deaktivieren? Sie mögen die Erfahrung vor dem Jahrtausendwechsel?
Alex
5
Weil es ein Sicherheitsrisiko ist und viel zu viele Websites Javascript missbrauchen. Ich verwende ein raffiniertes Firefox-Plugin namens "NoScript", mit dem Sie selektiv nur die Skripte von gewünschten Websites aktivieren können.
Alan
5

Es gibt noch einen weiteren Unterschied zwischen den beiden. Bei CSS wird der :hoverStatus immer deaktiviert, wenn sich die Maus von einem Element entfernt. Bei JavaScript wird das onmouseoutEreignis jedoch nicht ausgelöst, wenn die Maus vom Element auf Browser-Chrome und nicht auf den Rest der Seite bewegt wird.

Dies geschieht häufiger als Sie vielleicht denken, insbesondere wenn Sie oben auf Ihrer Seite eine Navigationsleiste mit benutzerdefinierten Schwebezuständen erstellen.

thismax
quelle
4

In Internet Explorer muss ein <! DOCTYPE> deklariert sein, damit der: hover-Selektor für andere Elemente als das <a> -Element funktioniert.

Martin Villa
quelle
3

Verwenden Sie CSS, um die Verwaltung des Stils selbst zu vereinfachen.

Hawk Kroeger
quelle
2

Um jQuery für den Hover zu verwenden , verwende ich immer das Plugin HoverIntent, da es das Ereignis erst auslöst, wenn Sie für kurze Zeit über ein Element pausieren. Dadurch werden nicht mehr viele Mouse-Over-Ereignisse ausgelöst, wenn Sie versehentlich ausgeführt werden die Maus darüber oder einfach bei der Auswahl einer Option.

Alex
quelle
0

Wenn Sie keine 100% ige Unterstützung für IE6 mit deaktiviertem Javascript benötigen, können Sie so etwas wie ie7-js mit IE-bedingten Kommentaren verwenden. Dann verwenden Sie einfach CSS-Regeln, um Hover-Effekte anzuwenden. Ich weiß nicht genau, wie es funktioniert, aber es verwendet Javascript, damit viele CSS-Regeln funktionieren, die normalerweise nicht in IE7 und 8 funktionieren.

AnnanFay
quelle