ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
mouseout と mouseleave の違い(最重要)
同じように見えて、子要素を含むときの動作が全く違います:
<div id="outer" style="padding:30px;background:#cef">
外側
<div id="inner" style="padding:30px;background:#fcc">
内側
</div>
</div>
<script>
$('#outer').on('mouseout', () => console.log('mouseout'));
$('#outer').on('mouseleave', () => console.log('mouseleave'));
</script>
マウスを「外側 → 内側 → 外側 → 外」と動かすと:
| 動き | mouseout | mouseleave |
|---|---|---|
| 外側 → 内側 | ★発火(外側から出た扱い) | 発火しない |
| 内側 → 外側 | ★発火(内側から出た) | 発火しない |
| 外側 → 完全に外 | 発火 | ★発火(本当に出た) |
結論: 「要素から出たら何かする」用途では mouseleave を使うべき。mouseout は子要素の数だけ無駄に発火します。
hover() で書く(推奨)
// hover(enterFn, leaveFn) は mouseenter + mouseleave
$('.menu').hover(
function() { $(this).addClass('active'); }, // マウス入った
function() { $(this).removeClass('active'); } // マウス出た
);
// 1 関数だけだと両方で呼ばれる
$('.menu').hover(function() {
$(this).toggleClass('active');
});
// 同等の on() 記法
$('.menu')
.on('mouseenter', function() { $(this).addClass('active'); })
.on('mouseleave', function() { $(this).removeClass('active'); });
CSS :hover で済むなら CSS を使う
JS で処理する必要が無い見た目変化はCSS :hover が最速かつ最軽量:
/* ホバー時に背景色変更 */
.menu {
background: #fff;
transition: background 0.2s;
}
.menu:hover {
background: #e3f2fd;
}
/* 子要素を表示 */
.dropdown:hover .menu {
display: block;
}
/* タッチデバイスでは :hover が「タップ後 hover 状態」になる罠 */
@media (hover: hover) {
.btn:hover { background: blue; }
}
イベントオブジェクトと relatedTarget
// どこから来た / どこに行ったか
$('#box').on('mouseout', function(e) {
console.log('to:', e.relatedTarget); // 出た後どこにいるか
});
$('#box').on('mouseover', function(e) {
console.log('from:', e.relatedTarget); // 入る前どこにいたか
});
// 「mouseout だが子要素への移動は無視したい」場合
$('#box').on('mouseout', function(e) {
if (this.contains(e.relatedTarget)) return; // まだ box の中
console.log('本当に出た');
});
// → mouseleave と同じ動作になる
動的に追加された要素にもバインドしたい
// ❌ 後から追加された .item には効かない
$('.item').on('mouseleave', handler);
// ✅ Event Delegation で親に登録
$('#list').on('mouseleave', '.item', handler);
// ただし mouseleave/mouseenter はバブリングしないため
// jQuery が内部で mouseout/mouseover に変換して動作させている
// イベント大量発火するのでパフォーマンス注意
タッチデバイス・Pen 対応: Pointer Events
// Pointer Events はマウス・タッチ・ペンを統合
$('#box')
.on('pointerenter', () => console.log('hover 開始'))
.on('pointerleave', () => console.log('hover 終了'));
// タッチで擬似 hover を作りたい場合
$('#item')
.on('touchstart', function() { $(this).addClass('hover'); })
.on('touchend touchcancel', function() {
$(this).removeClass('hover');
});
// CSS で実現する場合
// @media (hover: hover) { .btn:hover { ... } }
// → ポインタが hover 可能なときだけ :hover 適用
Vanilla JS で書き直す
const box = document.getElementById('box');
box.addEventListener('mouseleave', e => {
console.log('離脱');
});
box.addEventListener('mouseenter', e => {
console.log('進入');
});
// Event Delegation
document.getElementById('list').addEventListener('mouseover', e => {
const item = e.target.closest('.item');
if (!item) return;
// mouseenter 相当の判定
if (item.contains(e.relatedTarget)) return;
console.log('item hover:', item);
});
// pointerleave (推奨: マウス+タッチ+ペン統合)
box.addEventListener('pointerleave', e => { ... });
使い分けまとめ
| 用途 | 推奨 |
|---|---|
| 見た目の変化のみ | CSS :hover |
| 要素を出たときに 1 回処理 | mouseleave |
| 要素+子要素の出入りを全て検知 | mouseout |
| マウス・タッチ・ペン統合 | pointerleave |
| ホバー時の処理セット | hover(in, out) |
FAQ
Q: mouseleave が発火しないことがある
A: マウスがブラウザウィンドウ外に高速移動した場合、ブラウザ側で発火しないことあり。Mouse Leave Listener を window にも追加するなど対策。
Q: hover() は jQuery が非推奨にした?
A: 非推奨ではないが、mouseenter + mouseleave で書く方が明示的。新規コードは Vanilla JS の pointerenter/leave 推奨。
Q: タッチでも hover 効果を出したい
A: touchstart で class 追加、touchend / touchcancel で class 削除。または CSS の :active を使う手も。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- クリックイベント
- マウスオーバーイベント
- マウスアウトイベント(mouseout / mouseleave)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?