下にスライドして閉じられるモーダルウインドウの作り方【HTML/CSS/JavaScript・サンプルコード付き】
html/css/js
下にスライドして閉じられるモーダルウインドウの作り方
HTML、CSS、JavaScriptを使って、下方向へスライドすると閉じられるモーダルウインドウを作る方法を紹介します。スマホアプリ風の操作感を実現したい場合や、ボトムシート、メニュー、詳細画面などを直感的な操作で閉じられるUIを作りたい場合に利用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
下にスライドして閉じるモーダル
ボタンをクリックするとモーダルを表示します。モーダルを下へスライドすると閉じます。
スライド対応モーダル
モーダルを下方向へスライドすると閉じます。少しだけ動かした場合は元の位置へ戻ります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<!-- ページタイトル -->
<title>下にスライドして閉じられるモーダルウインドウ</title>
<!-- CSS読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- デモエリア -->
<div class="slide-close-modal-window_wrap">
<div class="slide-close-modal-window_title">
下にスライドして閉じるモーダル
</div>
<p class="slide-close-modal-window_text">
ボタンをクリックするとモーダルを表示します。モーダルを下へスライドすると閉じられます。
</p>
<!-- モーダルを開くボタン -->
<button class="slide-close-modal-window_open" type="button" data-slide-open>
モーダルを開く
</button>
</div>
<!-- モーダル全体 -->
<div class="slide-close-modal-window_overlay" data-slide-overlay>
<!-- 下にスライドして閉じるモーダル本体 -->
<div class="slide-close-modal-window_modal" role="dialog" aria-modal="true" data-slide-modal>
<!-- スライド操作の目印 -->
<div class="slide-close-modal-window_handle"></div>
<div class="slide-close-modal-window_modal-title">
スライド対応モーダル
</div>
<p class="slide-close-modal-window_modal-text">
このモーダルは下方向へスライドすると閉じます。少しだけ動かした場合は元の位置へ戻ります。
</p>
</div>
</div>
<!-- JavaScript読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0;
font-family:sans-serif;
background:#ffffff;
}
/* デモエリア */
.slide-close-modal-window_wrap{
max-width:700px;
margin:40px auto;
padding:32px;
border:1px solid #e5e7eb;
border-radius:18px;
background:#f8fafc;
text-align:center;
}
/* タイトル */
.slide-close-modal-window_title{
font-size:22px;
font-weight:700;
margin-bottom:12px;
}
/* 説明文 */
.slide-close-modal-window_text{
margin-bottom:24px;
color:#4b5563;
}
/* モーダルを開くボタン */
.slide-close-modal-window_open{
padding:12px 24px;
border:none;
border-radius:8px;
background:#0b6bff;
color:#ffffff;
font-weight:700;
cursor:pointer;
}
/* モーダル背景 */
.slide-close-modal-window_overlay{
display:none;
position:fixed;
inset:0;
z-index:9999;
background:rgba(0,0,0,0.5);
align-items:flex-end;
justify-content:center;
}
/* モーダル表示時 */
.slide-close-modal-window_overlay.is-active{
display:flex;
}
/* モーダル本体 */
.slide-close-modal-window_modal{
width:100%;
max-width:500px;
padding:28px;
border-radius:20px 20px 0 0;
background:#ffffff;
box-shadow:0 -10px 30px rgba(0,0,0,0.2);
touch-action:none;
transition:transform 0.2s;
}
/* スライド操作の目印 */
.slide-close-modal-window_handle{
width:64px;
height:6px;
margin:0 auto 20px;
border-radius:999px;
background:#d1d5db;
}
/* モーダルタイトル */
.slide-close-modal-window_modal-title{
font-size:22px;
font-weight:700;
margin-bottom:12px;
}
/* モーダル本文 */
.slide-close-modal-window_modal-text{
margin:0;
color:#4b5563;
line-height:1.8;
}
// モーダルを開くボタンを取得
const slideOpen=document.querySelector("[data-slide-open]");
// モーダル背景を取得
const slideOverlay=document.querySelector("[data-slide-overlay]");
// モーダル本体を取得
const slideModal=document.querySelector("[data-slide-modal]");
// スライド開始位置を保存
let startY=0;
// スライド移動量を保存
let moveY=0;
// スライド中かどうかを判定
let isSliding=false;
// 開くボタンをクリックしたときの処理
slideOpen.addEventListener("click",function(){
slideOverlay.classList.add("is-active");
slideModal.style.transform="translateY(0)";
});
// モーダルを押したときの処理
slideModal.addEventListener("pointerdown",function(event){
isSliding=true;
startY=event.clientY;
});
// モーダル上で動かしたときの処理
slideModal.addEventListener("pointermove",function(event){
if(!isSliding){
return;
}
moveY=Math.max(0,event.clientY-startY);
slideModal.style.transform="translateY("+moveY+"px)";
});
// スライド終了時の処理
function finishSlide(){
if(!isSliding){
return;
}
isSliding=false;
if(moveY>120){
slideOverlay.classList.remove("is-active");
}
slideModal.style.transform="translateY(0)";
moveY=0;
}
// 指やマウスを離したときに判定
slideModal.addEventListener("pointerup",finishSlide);
// 操作が中断されたときにも判定
slideModal.addEventListener("pointercancel",finishSlide);
ファイル構成と設置方法
このサンプルは、HTML・CSS・JavaScriptをそれぞれ別ファイルに分けて使用します。index.html、style.css、script.js を同じフォルダに配置してください。
sample/
├── index.html
├── style.css
└── script.js
index.html をブラウザで開くと、モーダルウインドウを表示できます。このサンプルでは、モーダルを下方向へスライドすると閉じることができ、少しだけ動かした場合は元の位置へ戻ります。
下にスライドして閉じられるモーダルウインドウの作り方【HTML/CSS/JavaScript・サンプルコード付き】
コメント