URLハッシュで開けるモーダルウインドウの作り方
URLハッシュで開けるモーダルウインドウの作り方を紹介します。URLの末尾にハッシュ(#modalなど)を付けることで、ページを開いたタイミングで指定したモーダルウインドウを自動表示できるサンプルです。HTML・CSS・JavaScriptだけで実装できるため、特別なライブラリを使わずに導入できます。
サンプルでは通常のボタンからモーダルを開くだけでなく、URLハッシュが指定されている場合にも同じモーダルを表示できます。共有用URLから特定のお知らせやログイン画面、キャンペーン案内などを直接表示したい場合にも利用できます。また、背景クリックや閉じるボタンでモーダルを閉じる基本的な操作にも対応しています。
モーダル内のタイトルや本文、ボタン名は自由に変更できます。お問い合わせ画面、会員サイト、管理画面、ECサイトなどで、特定の画面をURLから直接表示したい場面に活用しやすいサンプルです。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
URLハッシュ対応モーダル
ボタンをクリックするか、URL末尾へ「#modal」を付けてページを開くとモーダルを表示できます。
URLハッシュで表示
URLの末尾へ「#modal」を付けても、このモーダルを表示できます。
「モーダルを開く」をクリックするとURL末尾へ「#modal」が追加されてモーダルが表示されます。また、URLへ直接「#modal」を付けてアクセスした場合も同じモーダルを表示できます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン表示対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>URLハッシュで開けるモーダルウインドウ</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- モーダルを開く操作エリア -->
<div class="modal-url-hash_wrap">
<!-- 操作エリアのタイトル -->
<div class="modal-url-hash_title">
URLハッシュ対応モーダル
</div>
<!-- 操作エリアの説明文 -->
<p class="modal-url-hash_text">
ボタンをクリックするか、URL末尾へ「#modal」を付けてページを開くとモーダルを表示できます。
</p>
<!-- モーダルを開くボタン -->
<button
class="modal-url-hash_button"
type="button"
data-modal-url-hash-open>
モーダルを開く
</button>
</div>
<!-- モーダル背景 -->
<div
class="modal-url-hash_overlay"
data-modal-url-hash-overlay>
<!-- モーダル本体 -->
<div
class="modal-url-hash_modal"
role="dialog"
aria-modal="true"
aria-labelledby="modal-url-hash-title">
<!-- モーダルタイトル -->
<div
class="modal-url-hash_heading"
id="modal-url-hash-title">
URLハッシュで表示
</div>
<!-- モーダルの説明文 -->
<p class="modal-url-hash_message">
URLの末尾へ「#modal」を付けても、このモーダルを表示できます。
</p>
<!-- モーダルを閉じるボタン -->
<button
class="modal-url-hash_close"
type="button"
data-modal-url-hash-close>
閉じる
</button>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ページ外側の余白をなくす */
padding:40px 20px; /* 上下40px・左右20pxの余白 */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の文字色 */
font-family:sans-serif; /* ページ全体のフォント */
box-sizing:border-box; /* paddingと枠線を要素サイズに含める */
}
/* モーダルを開く操作エリア */
.modal-url-hash_wrap{
max-width:700px; /* 操作エリアの最大横幅 */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置 */
padding:32px; /* 操作エリア内側の余白 */
border:1px solid #e5e7eb; /* 操作エリアの枠線 */
border-radius:18px; /* 操作エリアの角丸 */
background:#f8fafc; /* 操作エリアの背景色 */
text-align:center; /* 内容を中央揃え */
box-sizing:border-box; /* paddingと枠線を横幅に含める */
}
/* 操作エリアのタイトル */
.modal-url-hash_title{
margin:0 0 12px; /* 下側12pxの余白 */
color:#111827; /* タイトルの文字色 */
font-size:22px; /* タイトルの文字サイズ */
font-weight:700; /* タイトルを太字にする */
line-height:1.5; /* タイトルの行間 */
}
/* 操作エリアの説明文 */
.modal-url-hash_text{
margin:0 0 24px; /* 下側24pxの余白 */
color:#4b5563; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 説明文の行間 */
}
/* モーダルを開くボタン */
.modal-url-hash_button{
padding:12px 24px; /* ボタン内側の上下・左右余白 */
border:none; /* ボタンの枠線を非表示 */
border-radius:8px; /* ボタンの角丸 */
background:#2563eb; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタン文字を太字にする */
line-height:1.5; /* ボタン文字の行間 */
cursor:pointer; /* マウスカーソルを指型へ変更 */
}
/* モーダル背景 */
.modal-url-hash_overlay{
display:none; /* 初期状態ではモーダルを非表示 */
position:fixed; /* 画面全体へ固定 */
inset:0; /* 上下左右を0にして画面全体へ広げる */
z-index:9999; /* 他の要素より前面へ表示 */
align-items:center; /* モーダル本体を縦中央へ配置 */
justify-content:center; /* モーダル本体を横中央へ配置 */
padding:20px; /* 画面端との余白 */
background:rgba(0,0,0,.55); /* 背景色。.55を大きくすると暗くなる */
box-sizing:border-box; /* paddingを画面幅に含める */
}
/* モーダル表示状態 */
.modal-url-hash_overlay.is-active{
display:flex; /* 表示用クラスが付いた時にモーダルを表示 */
}
/* モーダル本体 */
.modal-url-hash_modal{
width:100%; /* 画面幅に合わせて縮小 */
max-width:420px; /* モーダルの最大横幅 */
padding:30px; /* モーダル内部の余白 */
border-radius:18px; /* モーダル本体の角丸 */
background:#ffffff; /* モーダル本体の背景色 */
text-align:center; /* モーダル内の内容を中央揃え */
box-shadow:0 20px 50px rgba(0,0,0,.25); /* モーダル本体の影 */
box-sizing:border-box; /* paddingを横幅に含める */
}
/* モーダルタイトル */
.modal-url-hash_heading{
margin:0 0 16px; /* 下側16pxの余白 */
color:#111827; /* タイトルの文字色 */
font-size:26px; /* タイトルの文字サイズ */
font-weight:700; /* タイトルを太字にする */
line-height:1.5; /* タイトルの行間 */
}
/* モーダルの説明文 */
.modal-url-hash_message{
margin:0 0 24px; /* 下側24pxの余白 */
color:#4b5563; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 説明文の行間 */
}
/* モーダルを閉じるボタン */
.modal-url-hash_close{
padding:12px 26px; /* ボタン内側の上下・左右余白 */
border:none; /* ボタンの枠線を非表示 */
border-radius:8px; /* ボタンの角丸 */
background:#111827; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタン文字を太字にする */
line-height:1.5; /* ボタン文字の行間 */
cursor:pointer; /* マウスカーソルを指型へ変更 */
}
/* 画面幅640px以下 */
@media (max-width:640px){
/* スマートフォン用の操作エリア */
.modal-url-hash_wrap{
padding:24px 18px; /* 上下24px・左右18pxへ余白を縮小 */
}
/* スマートフォン用のモーダル本体 */
.modal-url-hash_modal{
padding:24px 18px; /* 上下24px・左右18pxの内側余白 */
}
}
// モーダルを開くボタンを取得
const modalUrlHashOpen=document.querySelector(
"[data-modal-url-hash-open]"
);
// モーダルを閉じるボタンを取得
const modalUrlHashClose=document.querySelector(
"[data-modal-url-hash-close]"
);
// モーダル背景を取得
const modalUrlHashOverlay=document.querySelector(
"[data-modal-url-hash-overlay]"
);
// モーダルを開く共通処理
function openModalUrlHash(){
// モーダル背景へ表示用クラスを追加
modalUrlHashOverlay.classList.add("is-active");
}
// モーダルを閉じる共通処理
function closeModalUrlHash(){
// モーダル背景から表示用クラスを削除
modalUrlHashOverlay.classList.remove("is-active");
// URLからハッシュだけを削除
history.replaceState(
null,
document.title,
location.pathname+location.search
);
}
// モーダルを開くボタンをクリックした時
modalUrlHashOpen.addEventListener("click",function(){
// URL末尾へ#modalを追加
location.hash="modal";
});
// モーダルを閉じるボタンをクリックした時
modalUrlHashClose.addEventListener("click",function(){
// モーダルを閉じてURLハッシュを削除
closeModalUrlHash();
});
// モーダル背景をクリックした時
modalUrlHashOverlay.addEventListener("click",function(event){
// モーダル本体ではなく背景部分をクリックした場合だけ閉じる
if(event.target===modalUrlHashOverlay){
// モーダルを閉じてURLハッシュを削除
closeModalUrlHash();
}
});
// URLハッシュが変更された時
window.addEventListener("hashchange",function(){
// URL末尾が#modalの場合
if(location.hash==="#modal"){
// モーダルを表示
openModalUrlHash();
}else{
// それ以外のハッシュではモーダルを非表示
modalUrlHashOverlay.classList.remove("is-active");
}
});
// ページ読み込み時にURL末尾が#modalの場合
if(location.hash==="#modal"){
// モーダルを自動表示
openModalUrlHash();
}
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLにはモーダルウインドウの構造、CSSにはデザイン、JavaScriptにはURLハッシュの監視やモーダルの開閉処理を記述しています。URLの末尾に「#modal」が付いている場合は自動でモーダルを表示し、通常のボタン操作でも同じモーダルを開ける構成です。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.html
モーダルウインドウ本体、説明文、開くボタン、閉じるボタンなどのHTML構造を管理します。タイトルや本文など表示内容を変更できます。
style.css
モーダルウインドウのサイズ、背景、余白、角丸、影、ボタンデザインなど見た目を管理します。
script.js
URLハッシュの追加・監視・削除、モーダルの開閉処理、ページ読み込み時の自動表示処理を管理します。
設置方法・使い方
sampleフォルダへindex.html・style.css・script.jsを配置します。sample/index.htmlをブラウザで開くと動作を確認できます。「モーダルを開く」をクリックするとURLへ「#modal」が追加されてモーダルが表示されます。また、URL末尾へ「#modal」を付けた状態でページを開いても自動的にモーダルが表示されます。
カスタマイズできる内容
index.htmlではモーダルタイトル、説明文、ボタン名を変更できます。style.cssではモーダルサイズ、背景色、ボタン色、余白、角丸、影などを変更できます。script.jsでは使用するハッシュ名や開閉タイミング、URL更新処理を編集できます。
数値調整
style.cssのmax-width:420px;を変更するとモーダルの最大横幅が変わります。padding:30px;を変更するとモーダル内部の余白が変わります。background:rgba(0,0,0,.55);の「.55」を変更すると背景の暗さが変わります。
レスポンシブ対応
style.cssではwidth:100%、max-width、padding、@media(max-width:640px)を使用してレスポンシブ対応しています。スマートフォン・タブレット・PCでも画面幅に合わせてモーダルサイズや余白が自動調整されます。
コメント