モーダルウインドウ表示中の背景スクロールを禁止する方法【HTML/CSS/JavaScript・サンプルコード付き】

モーダルウインドウ
無料ツール
モーダルウインドウを自由に作成

テキスト・表示ボタン・サイズ・余白・角丸・背景色・文字色・影などを設定して、HTML・CSS・JavaScriptを自動生成できます。

モーダルウインドウ作成ツールを使う
新しいタブで開きます

モーダルウインドウ表示中の背景スクロールを禁止する方法

モーダルウインドウを表示している間だけ、背景ページのスクロールを禁止する方法を紹介します。モーダルを開いた状態でマウスホイールやタッチ操作をすると、モーダルの後ろにあるページまで動いてしまうことがあります。本記事では、HTML・CSS・JavaScriptを使い、モーダルウインドウの表示中だけ背景ページを固定する方法を実装します。

サンプルでは「モーダルを開く」をクリックすると画面中央にモーダルウインドウを表示し、同時にbody要素へ専用のクラスを追加します。このクラスへCSSのoverflow:hiddenを設定することで、モーダルウインドウを表示している間は背景ページをスクロールできなくします。「閉じる」をクリックするとクラスを削除し、再び通常どおりスクロールできる状態へ戻します。

商品詳細や確認画面、お知らせ、会員サイトの案内など、モーダルウインドウを表示している間に背景ページを動かしたくない場面で活用できます。特にスマートフォンでは、モーダルを操作しているつもりでも背景ページまでスクロールしてしまうことがあるため、表示中だけ背景スクロールを禁止することで操作しやすくなります。モーダルを閉じるとスクロールできる状態へ戻るため、通常のページ閲覧にもそのまま移れます。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

「モーダルを開く」をクリックしたあと、マウスホイールやタッチ操作でページをスクロールしてみてください。モーダル表示中は背景ページが動かず、「閉じる」をクリックすると再びスクロールできるようになります。

コードをコピーして使おう!

<!DOCTYPE html>
<html lang="ja">
<head>

  <!-- 文字コード -->
  <meta charset="UTF-8">

  <!-- スマートフォン対応 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- ページタイトル -->
  <title>モーダルウインドウ表示中の背景スクロールを禁止する方法</title>

  <!-- CSSファイル -->
  <link rel="stylesheet" href="style.css">

</head>
<body>

  <!-- デモ表示エリア -->
  <div class="modal-scroll-lock_wrap">

    <!-- タイトル -->
    <div class="modal-scroll-lock_title">
      背景スクロールを禁止
    </div>

    <!-- 説明文 -->
    <p class="modal-scroll-lock_text">
      モーダルウインドウを開いている間は、背景ページをスクロールできなくなります。モーダルを閉じると、再びスクロールできるようになります。
    </p>

    <!-- モーダルを開くボタン -->
    <button class="modal-scroll-lock_open" id="modal-scroll-lock-open" type="button">
      モーダルを開く
    </button>

  </div>

  <!-- モーダルウインドウ -->
  <div class="modal-scroll-lock_modal" id="modal-scroll-lock-modal" role="dialog" aria-modal="true" aria-labelledby="modal-scroll-lock-title">

    <!-- モーダルタイトル -->
    <div class="modal-scroll-lock_modal-title" id="modal-scroll-lock-title">
      モーダルタイトル
    </div>

    <!-- モーダル説明文 -->
    <p class="modal-scroll-lock_modal-text">
      モーダルウインドウの表示中は背景ページのスクロールが禁止されています。
    </p>

    <!-- 閉じるボタン -->
    <button class="modal-scroll-lock_close" id="modal-scroll-lock-close" type="button">
      閉じる
    </button>

  </div>

  <!-- JavaScriptファイル -->
  <script src="script.js"></script>

</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
A

Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。

InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。モーダルウインドウを開くとbody要素へ専用のクラスを追加し、CSSのoverflow:hiddenを適用して背景ページのスクロールを禁止します。モーダルウインドウを閉じるとクラスを削除し、背景ページを再びスクロールできる状態へ戻します。

sample/
├── index.html
├── style.css
└── script.js

各ファイルの役割
index.htmlはデモ表示エリア、モーダルウインドウ、「モーダルを開く」ボタン、「閉じる」ボタンを構成するファイルです。index.htmlからstyle.cssとscript.jsを読み込みます。

style.cssはデモ表示エリアとモーダルウインドウのデザインに加えて、背景スクロールを禁止する処理を設定するファイルです。body.modal-scroll-lock_lockedへoverflow:hiddenを指定することで、モーダル表示中だけ背景ページをスクロールできなくします。

script.jsはモーダルウインドウの開閉と背景スクロールの切り替えを行うファイルです。モーダルを開くとis-activeとmodal-scroll-lock_lockedを追加し、閉じると両方のクラスを削除します。

設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置し、sample/index.htmlをブラウザで開いてください。「モーダルを開く」をクリックすると画面中央にモーダルウインドウが表示され、その間は背景ページをスクロールできなくなります。「閉じる」をクリックするとモーダルウインドウが非表示になり、背景ページを再びスクロールできるようになります。

カスタマイズできる内容
index.htmlではモーダルウインドウのタイトルや説明文、ボタンの文字を変更できます。style.cssではモーダルウインドウの最大横幅、内側余白、角丸、背景色、影などを変更できます。背景スクロールを禁止する処理はbody.modal-scroll-lock_lockedのoverflow:hiddenで行っているため、このクラスをモーダル表示中だけbody要素へ追加することが重要です。

数値調整
min-height:150vh;
サンプルページを縦に長くし、背景スクロールの禁止を確認しやすくするための高さです。値を大きくするとページがさらに縦に長くなり、小さくすると短くなります。

max-width:700px;
デモ表示エリアの最大横幅です。値を大きくすると表示エリアが横に広がり、小さくするとコンパクトになります。

padding:32px;
デモ表示エリアの内側余白です。値を大きくすると内容と枠線の間隔が広がり、小さくすると狭くなります。

width:calc(100% - 40px);
モーダルウインドウの横幅です。40pxを大きくすると画面左右の余白が広がり、小さくするとモーダルが画面端へ近づきます。

max-width:420px;
モーダルウインドウの最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。

padding:28px;
モーダルウインドウの内側余白です。値を大きくすると内容と外周の間隔が広がり、小さくすると狭くなります。

border-radius:18px;
モーダルウインドウの角丸です。値を大きくすると丸みが強くなり、小さくすると角に近づきます。

レスポンシブ対応
このサンプルはレスポンシブ対応です。モーダルウインドウにはwidth:calc(100% - 40px)とmax-width:420pxを設定し、画面幅に合わせて縮小できるようにしています。640px以下ではデモ表示エリアをpadding:24px 18px、モーダルウインドウをpadding:24px 18pxへ変更し、スマートフォンでも左右に余白を確保して表示します。


こちらもおすすめ


コメント