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の
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の
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の違いは何ですか?
A
hover() は内部的に 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") のように状態をトグルする処理と相性が良いです。

