コピペで完結!モーダルウインドウ#09【スクロール位置で自動表示】

html/css/js

スクロール位置でモーダルウインドウ自動表示

ページを下にスクロールし、指定した位置に到達したタイミングで自動的にモーダルを表示するサンプルです。
ユーザーが記事を読み進めたあとに、クーポン・お知らせ・次のアクション案内などを自然に提示したいときに役立ちます。

コードについて 本記事のコードは AI(ChatGPT)による生成をベースに調整したものです。必ずご自身の環境で動作確認のうえご利用ください。
免責 本コードを利用したことによる不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。

デモ

「セクション2の中腹」が画面中央(50vh)に近づいたときにモーダルを表示します。

▼ セクション2:ここに到達するとモーダルが出ます

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

/* =========================================
  モーダルウインドウ #09(スクロール到達で表示)CSS
  - スコープ:#modal09-demo 内に限定
  - 役割   :「セクション2の中腹が画面中央に来たら」モーダルを表示
  - 備考   :背景スクロールを止めるための body クラスも定義
========================================= */

/* ▼デモ全体のラッパー(衝突回避のため必ずスコープを付ける) */
#modal09-demo{
  font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans JP","Yu Gothic UI",sans-serif; /* 可読性の高い汎用フォント */
  color:#0f172a;                        /* ベースの文字色 */
}

/* ▼説明文などの余白調整(任意) */
#modal09-demo .lead{
  color:#64748b;                        /* 補助的な説明色 */
  margin:0 0 12px;                      /* 下余白 */
  line-height:1.8;                      /* 行間 */
}

/* ▼スクロールを発生させるダミー領域(高さを大きめに) */
#modal09-demo .dummy{
  height:900px;                         /* スクロールを確実に起こす高さ */
  background:linear-gradient(#f8fafc,#e2e8f0); /* 薄いグラデーション */
  border-radius:8px;                    /* 角丸でブロックを認識しやすく */
  margin:20px 0;                        /* 上下余白 */
}

/* ▼トリガー表示ブロック(セクション2の見出し位置目印) */
#modal09-demo #trigger{
  padding:18px;                          /* 内側余白 */
  text-align:center;                      /* 文言を中央寄せ */
  background:#f8fafc;                    /* 背景色 */
  border:1px dashed #e5e7eb;             /* 点線で目立たせる */
  color:#0f172a;                          /* 文字色 */
  border-radius:8px;                      /* 角丸 */
}

/* ▼オーバーレイ(モーダルの背景) */
#modal09-demo .overlay{
  position:fixed;                        /* 画面全体に固定 */
  inset:0;                               /* 四辺を0:全画面化 */
  background:rgba(0,0,0,.55);            /* 半透明の黒 */
  display:none;                          /* 初期は非表示 */
  place-items:center;                    /* Gridの中央寄せ */
  z-index:9999;                          /* 最前面に表示 */
}

/* ▼オーバーレイが「有効」になったときに表示する */
#modal09-demo .overlay.active{
  display:grid;                          /* Grid表示に切り替え(中央寄せ) */
}

/* ▼ダイアログ本体(モーダルの中身) */
#modal09-demo .dialog{
  background:#fff;                       /* 背景を白に */
  padding:20px;                          /* 内側余白 */
  border-radius:12px;                     /* 角丸 */
  max-width:420px;                        /* 最大幅の制限 */
  width:90%;                              /* 画面幅に応じて伸縮 */
  box-shadow:0 20px 50px rgba(2,8,23,.25);/* 立体感のある影 */
  transform:translateY(10px);             /* 初期位置を少し下に */
  opacity:0;                              /* 初期は透明 */
  transition:.18s ease-out;               /* アニメーション(出現時の滑らかさ) */
  outline:0;                              /* フォーカスアウトラインはJS側で制御 */
}

/* ▼オーバーレイが有効のときにダイアログをアニメーション表示 */
#modal09-demo .overlay.active .dialog{
  transform:translateY(0);               /* 下から上に戻る */
  opacity:1;                             /* 不透明にする */
}

/* ▼モーダルのタイトル */
#modal09-demo .dialog h3{
  margin:0 0 8px;                        /* 下余白 */
  font-size:18px;                        /* 文字サイズ */
}

/* ▼モーダル内テキスト */
#modal09-demo .dialog p{
  margin:0 0 12px;                       /* 下余白 */
}

/* ▼補足情報(到達判定の差分などを表示) */
#modal09-demo .meta{
  font-size:12px;                        /* 小さめの文字 */
  color:#64748b;                         /* 補助色 */
  background:#f8fafc;                    /* 薄い背景 */
  border:1px solid #e5e7eb;              /* 薄い枠線 */
  border-radius:8px;                      /* 角丸 */
  padding:8px;                            /* 内側余白 */
  word-break:break-word;                  /* 長文対策 */
}

/* ▼閉じるボタン */
#modal09-demo .close-btn{
  appearance:none;                        /* ブラウザ既定をリセット */
  border:1px solid transparent;           /* 枠線(通常は透明) */
  border-radius:10px;                     /* 角丸 */
  background:#0b6bff;                     /* 強調色の青 */
  color:#fff;                             /* 文字色は白 */
  padding:8px 14px;                       /* 内側余白 */
  cursor:pointer;                         /* カーソルを指に */
  margin-top:14px;                        /* 上に余白 */
}

/* ▼背景スクロール停止用(JSで body に付与・削除する) */
body.modal09-lock{
  overflow:hidden;                        /* スクロールバーを隠す */
  touch-action:none;                      /* モバイルでのジェスチャー無効化(任意) */
}

コメント