【jQuery】hover()でマウスオーバー時に処理を実行する方法|mouseenter/leave・CSSとの比較まで

【jQuery】hover()でマウスオーバー時に処理を実行する jQuery

jQueryの hover() はマウスが要素に乗ったとき(mouseenter)と離れたとき(mouseleave)の処理を一括定義できるメソッドです。本記事ではhover()の基本から、CSSトランジションとの組み合わせ・パフォーマンス最適化・タッチデバイス対応まで解説します。

この記事でわかること

  • hover()の基本構文(2つの関数を渡す形式)
  • mouseenter/mouseleave/mouseover/mouseoutの違い
  • CSSトランジションとjQueryの組み合わせ
  • 子要素があるときのバグと解決策
  • タッチデバイス対応の注意点
スポンサーリンク

1. hover()の基本構文

hover() には2つの関数を渡します。1つ目がmouseenter(乗った時)、2つ目がmouseleave(離れた時)です。

// 基本構文: hover(onEnter, onLeave)
$('.btn').hover(
  function () {
    // マウスが乗った時
    $(this).addClass('is-hover');
  },
  function () {
    // マウスが離れた時
    $(this).removeClass('is-hover');
  }
);

// 1つの関数だけ渡すと、入った時も離れた時も同じ関数が実行される
$('.btn').hover(function () {
  $(this).toggleClass('is-hover');
});

2. マウスイベントの種類と違い

イベント 発火タイミング 子要素への移動
mouseenter 要素に入った時 子要素移動では再発火しない
mouseleave 要素から離れた時 子要素移動では再発火しない
mouseover 要素に入った時 子要素に移動しても再発火する
mouseout 要素から離れた時 子要素に移動しても再発火する
hover()はmouseenterとmouseleaveを使っている
jQueryの hover() は内部的に mouseenter / mouseleave を使用します。そのため子要素にマウスが移動しても不要な再発火が起きません。mouseover / mouseout を直接使うとこの問題が発生します。

3. クラス追加とCSSトランジションの組み合わせ

jQueryで状態クラスを付け外しし、アニメーションはCSSトランジションに任せる方法が最もパフォーマンス良好です。

.card {
  background: #fff;
  border-radius: 8px;
  padding: 20px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  transform: translateY(0);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card.is-hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 16px rgba(0,0,0,0.15);
}
$('.card').hover(
  function () { $(this).addClass('is-hover'); },
  function () { $(this).removeClass('is-hover'); }
);
CSSトランジションの方がjQuery animate()より速い
CSSトランジションはブラウザのGPUアクセラレーションを活用するため、jQueryの animate() よりなめらかで負荷が低いです。ホバーアニメーションはCSSに書くことを推奨します。

4. ドロップダウンメニューの実装

$(function () {
  // ホバーでドロップダウンを表示
  $('.nav-item').hover(
    function () {
      $(this).find('.dropdown').stop(true, true).slideDown(200);
    },
    function () {
      $(this).find('.dropdown').stop(true, true).slideUp(200);
    }
  );
});
stop(true, true)で素早いホバーのちらつきを防ぐ
マウスを素早く出し入れするとアニメーションがキューに積まれてちらつきます。stop(true, true) を先に呼ぶことで前のアニメーションをキャンセルし、即座に完了状態にしてから新しいアニメーションを開始できます。

5. CSSのhover擬似クラスとの使い分け

単純なスタイル変更はCSSの :hover 擬似クラスで十分です。jQueryのhover()はJavaScriptの処理が必要な場合に使います。

場面 推奨
色・サイズ・透明度の変化 CSS :hover + transition
CSSだけではできないアニメーション jQuery hover() + animate()
hover時にAjaxやDOMを操作 jQuery hover()
画像の切り替え CSS background-image または jQuery attr()

6. タッチデバイスの注意点

スマートフォンなどのタッチデバイスでは hover イベントは存在しません(タッチには mouseover が擬似的に発火しますが挙動が不安定)。ホバー操作が必須なUIはタッチデバイスへの代替対応が必要です。

// タッチデバイスを判定してhoverを設定
if (!('ontouchstart' in window)) {
  // タッチ非対応デバイス(PC)のみhoverを設定
  $('.card').hover(
    function () { $(this).addClass('is-hover'); },
    function () { $(this).removeClass('is-hover'); }
  );
}

まとめ

jQueryの hover() はマウスの出入りを一括処理できる便利なメソッドです。スタイル変化だけならCSSの :hover + transition の方が高速です。jQueryは「ホバー時にAjaxを実行する」「クラス付け外しで複雑なアニメーションを制御する」場合に活用しましょう。タッチデバイス対応は別途考慮が必要です。

関連記事: jQueryのclassの追加と削除を行う方法 / jQueryのblur()でフォーカスが外れた瞬間に処理を実行する方法

よくある質問(FAQ)

Qhover()とmouseover/mouseoutの違いは何ですか?
Ahover() は内部的に mouseenter / mouseleave を使います。これらは子要素に移動しても再発火しません。mouseover / mouseout は子要素に移動するたびに再発火するため、子要素のあるメニュー等ではちらつきが起きます。
Qhover()のアニメーションがちらつく
A素早くマウスを出し入れするとアニメーションがキューに積まれてちらつきます。アニメーション前に .stop(true, true) を呼ぶことで前のアニメーションをキャンセルし、ちらつきを防げます。
Qスマホでhover()は使えますか?
Aタッチデバイスにはhoverという概念がないため、jQueryのhover()は実質機能しません。タッチイベント(touchstart/touchend)で代替するか、CSSの :hover を使ってください(タップで擬似的にhoverが発火することがあります)。
QCSSのhoverと使い分けるポイントは?
A色・透明度・transform等の純粋なスタイル変化はCSSの :hover + transition で十分です。ホバー時にJavaScriptの処理(Ajax、DOM操作、条件分岐)が必要な場合にjQueryの hover() を使います。
Qhover()で関数を1つだけ渡すとどうなりますか?
Aマウスが乗った時も離れた時も同じ関数が実行されます。$(this).toggleClass("is-hover") のように状態をトグルする処理と相性が良いです。