モーダルウィンドウの作り方【jQuery】

この記事の前提条件

対象: jQuery(既存のjQuery環境での実装を想定)
難易度: ★★☆
所要時間: 約10分

画像の拡大表示や確認ダイアログなど、画面全体を覆って表示するモーダルウィンドウ。既存サイトでjQueryを使っている場合の、シンプルな実装方法を紹介します。

HTML・CSS: 背景の暗幕とモーダル本体を用意する

<button class="modal-open-btn">開く</button>

<div class="modal-overlay">
  <div class="modal-box">
    <button class="modal-close-btn">×</button>
    <p>モーダルの中身</p>
  </div>
</div>
.modal-overlay {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.6);
  z-index: 100;
}

.modal-overlay.is-active {
  display: flex;
  align-items: center;
  justify-content: center;
}

.modal-box {
  background: #fff;
  padding: 24px;
  border-radius: 8px;
}

jQuery: 開閉の処理を書く

$('.modal-open-btn').on('click', function() {
  $('.modal-overlay').addClass('is-active');
});

$('.modal-close-btn, .modal-overlay').on('click', function(e) {
  // モーダル本体(.modal-box)のクリックでは閉じないようにする
  if (e.target === this) {
    $('.modal-overlay').removeClass('is-active');
  }
});

e.target === thisの判定がポイントです。これがないと、モーダルの中身をクリックしただけでもイベントが親要素(暗幕)まで伝わり(バブリング)、意図せず閉じてしまいます。「クリックされたのが暗幕自身、または閉じるボタン自身の時だけ」閉じる、という条件にしておきます。

💡 今はHTML標準のdialog要素という選択肢もある

既存サイトの改修ならjQueryでの実装が手早いですが、新しく作るページであれば<dialog>というHTML標準のタグも検討する価値があります。showModal()で開き、close()で閉じるだけで、背景の暗幕表示・キーボードのEscキーでの閉じる操作・フォーカスの管理まで、ブラウザが標準機能として面倒を見てくれます。全モダンブラウザで利用できるようになっているので、jQuery自体が不要なプロジェクトなら、こちらの方が実装量も少なく済みます。

実務での注意点: モーダル表示中は背景のスクロールを止める

モーダルを開いている間も背景ページがスクロールできてしまうと、ユーザーが混乱しやすくなります。モーダルを開く時に$('body').css('overflow', 'hidden');、閉じる時に元に戻す処理を入れておくと、より丁寧な実装になります。

まとめ

  • 暗幕(overlay)とモーダル本体(box)を分けて配置し、is-activeクラスで表示を切り替える
  • e.target === thisで、モーダル本体クリックまで閉じてしまうのを防ぐ
  • 新規プロジェクトなら、HTML標準の<dialog>要素で実装量を減らせる
  • 開いている間は背景のスクロールを止めると、より親切な実装になる