スクロール位置でモーダルウインドウ自動表示
ページを下にスクロールし、指定した位置に到達したタイミングで自動的にモーダルを表示するサンプルです。
ユーザーが記事を読み進めたあとに、クーポン・お知らせ・次のアクション案内などを自然に提示したいときに役立ちます。
コードについて
本記事のコードは 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; /* モバイルでのジェスチャー無効化(任意) */
}
コメント