CSSホバーとJavaScriptマウスオーバー[クローズ]


84

CSS element:hoverまたはJavaScript onmouseoverのどちらを使用して、ページ上のhtml要素の外観を制御するかを選択できる場合があります。divが入力をラップする次のシナリオを考えてみましょう

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

マウスカーソルをdivの上に置いたときに、入力の背景色を変更したい。CSSのアプローチは

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

<div><input></div>

JavaScriptのアプローチは

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

各アプローチの長所と短所は何ですか?CSSアプローチはほとんどのWebブラウザでうまく機能しますか?JavaScriptはcssより遅いですか?


1
CSSアプローチはJavascriptを必要としません。
PD。

Whatever:
hover

3
「javascriptはcssより遅いですか?」気付かないかもしれませんが、javascriptはより多くのリソースを消費し、他の多くのスクリプトが同時に実行されていると速度が低下する可能性があり(特にハンドヘルドデバイス、モバイルWebサイトの場合を考えてください)、使用すべきものではありません。一方、CSSは使用するリソースが少なく、プレゼンテーション用です。javascriptは、Webサイトのナビゲーションと機能を強化するためにのみ使用する必要がありますが、jsを有効にしていないユーザーでもナビゲートできる必要があります。CSS:hoverアプローチをお勧めします。
Jose Faeti 2011

1
これは古い質問であるため、上記のコメントが無効になり、無効になった可能性があることは驚くことではありません。1つの理由は、高性能の定型文を提供する優れたJSライブラリがないことです(Famo.usを参照)。もう1つは、デスクトップとモバイルの両方の最新のブラウザーのJSエンジンが非常に高速であることです。ネイティブCコンパイル済みコードの80%のパフォーマンスでそれを測定するベンチマークがあります。もちろん例外的なケースもありますが、ブラウザでのJSの優れたパフォーマンスは依然として維持されています。人々が本当に「意味する」のは、DOMが遅いということです。JSは非常に高速で、気づかなかっただけです。
pmont 2015年

回答:


59

:hoverの問題は、IE6がリンク上でのみサポートすることです。私は最近、この種のことにjQueryを使用しています。

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

物事をはるかに簡単にします。これは、IE6、FF、Chrome、Safariで機能します。


私は簡単なテストをしました...どうやらIE7はdiv:hoverをサポートしていませんか?
ジョン

はい、IE7はCSS2を50%サポートしています。多くのウェブデザイナーがそれに耐えられない理由の一部。
アラン

しかし、サンドボックスをできるだけ乱用するトラッカー、スニファー、ハッカーはすべて、理解できる範囲で使用します。それが追跡に役立つというわけではありませんが、人々がそれを難し​​くしようとすることは理解できます。私はクッキーを許可しない人々を知っています。そして彼らにもその正当な理由があります、ただfiresheepを見てください。2013年に人々が到着し、とにかく追跡され、私の(私たちの?)お気に入りのおもちゃを有効にすることを望んでいるので、私はまだあなたの答えに賛成しました。
jascha 2013年

私はmetrouiがユーザーにjavascript:pを無効にできるようにしているのだろうかと思いますが、真剣に、chromeos、mozillaのos、metrouiはすべてjavascriptを使用しています。html5、css3、webgl、javascriptは、数年以内にクライアントサイドアプリを作成するための言語になります。ただ我慢してください、すぐにブラウザの外にjavascriptがあり、ブラウザでそれを無効にする必要はもうありません:)
jascha 2013年

32

CSSのものははるかに保守可能で読みやすいです。


18
<a>以外の要素でIE6をサポートする必要があるまで、保守可能です。次に、JSハックを使用する必要があるため、それは苦痛です。しかし、CSSは依然として私の好ましい方法です。1999ブラウザを使用している人々に1999年の経験をさせましょう。
タイソン

4
人々はこれを更新する必要がありますこれが最善の解決策です...ブラウザを検出し、IE <7を使用している場合は更新するように指示するタグを追加することをお勧めします
Travis Pessetto 2011

11

なぜ両方ではない?アニメーション効果にはjQueryを使用し、フォールバックとしてCSSを使用します。これにより、jQueryの利点と適切な劣化が得られます。

CSS:

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

jQuery(jQueryUIを使用して色をアニメーション化):

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

デモ


1
CSSトランジションでは、:Hoverが古いIEブラウザーの非アンカータグに適用される場合にのみ、フォールバックとしてjavascriptを使用する必要があると私は主張します。
Adam Youngers 2012年

jsbinでのいくつかの変更により、デモが機能しなくなりました。jQueryの現在のバージョンを参照するようにデモを更新しましたが、すべてが再び機能します。
kingjeffrey 2012

10

javascriptでそれを行うことのもう1つの利点は、さまざまな時点でホバー効果を追加/削除できることです。たとえば、テーブルの行にカーソルを合わせると色が変わり、クリックするとホバー効果が無効になり、インプレースモードで編集が開始されます。


ありがとう-これは実際に私が探していた質問に答えました!:-)
Peter S Magnusson 2010

6

非常に大きな違いは、マウスが要素の外に移動すると、「:hover」状態が自動的に非アクティブ化されることです。その結果、ホバーに適用されたスタイルは自動的に元に戻されます。一方、javascriptアプローチでは、「onmouseover」イベントと「onmouseout」イベントの両方を定義する必要があります。「onmouseover」のみを定義した場合、「onmouseout」を明示的に定義しない限り、「onmouseover」が適用されるスタイルは、マウスアウトした後も保持されます。


6

編集:この答えはもはや当てはまりません。CSSは十分にサポートされており、Javascript(読み取り:JScript)は、Webエクスペリエンスにほぼ必要であり、javascriptを無効にする人はほとんどいません。

2009年の私の意見としての元の答え。

頭のてっぺんから:

CSSでは、ブラウザのサポートに問題がある可能性があります。

JScriptを使用すると、人々はjscriptを無効にすることができます(それが私が行うことです)。

HTMLでのコンテンツ、CSSを使用したレイアウト、およびJScriptで動的なものを実行することをお勧めします。したがって、この場合は、CSSアプローチを採用することをお勧めします。


3
なぜJavaScriptを無効にするのですか?ミレニアム以前の体験が好きですか?
アレックス

5
これはセキュリティリスクであり、あまりにも多くのサイトがjavascriptを悪用しているためです。私は「NoScript」と呼ばれる気の利いたFirefoxプラグインを使用しています。これにより、必要なサイトのスクリプトのみを選択的に有効にできます。
アラン

5

2つの間に覚えておくべき別の違いがあります。CSSを使用すると、マウスが要素から離れると、:hover状態は常に非アクティブ化されます。ただし、JavaScriptを使用すると、onmouseoutマウスが要素から離れてページの残りの部分ではなくブラウザのchromeに移動してもイベントは発生しません。

これは、特にカスタムホバー状態でページの上部にナビゲーションバーを作成している場合に、想像以上に頻繁に発生します。


4

Internet Explorerでは、:hoverセレクターが<a>要素以外の要素で機能するように、<!DOCTYPE>を宣言する必要があります。



2

jQuery使用してホバーを実行すること防ぐために、私は常にプラグインHoverIntentを使用しますこれは、要素を短時間一時停止するまでイベントを発生させないためです...これにより、誤って実行した場合に多くのマウスオーバーイベントが発生しなくなります。それらの上にマウスを置くか、単にオプションを選択している間。


0

javascriptを無効にしてIE6を100%サポートする必要がない場合は、IE条件付きコメント付きのie7-jsのようなものを使用できます。次に、cssルールを使用してホバー効果を適用します。それがどのように機能するかは正確にはわかりませんが、JavaScriptを使用して、IE7および8では通常は機能しない多くのcssルールを機能させます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.