下にスライドして閉じられるドロワーメニューの作り方【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="down-slide-close-drawer-menu_wrap">
<div class="down-slide-close-drawer-menu_title">
下にスライドして閉じるドロワーメニュー
</div>
<p class="down-slide-close-drawer-menu_text">
ボタンをクリックすると下からドロワーメニューを表示します。ドロワーメニューを下へスライドすると閉じられます。
</p>
<!-- ドロワーメニューを開くボタン -->
<button class="down-slide-close-drawer-menu_open" type="button" data-slide-open>
メニューを開く
</button>
</div>
<!-- ドロワーメニュー全体 -->
<div class="down-slide-close-drawer-menu_overlay" data-slide-overlay>
<!-- 下から表示して下にスライドして閉じるドロワーメニュー本体 -->
<div class="down-slide-close-drawer-menu_drawer" role="dialog" aria-modal="true" data-slide-drawer>
<!-- スライド操作の目印 -->
<div class="down-slide-close-drawer-menu_handle"></div>
<div class="down-slide-close-drawer-menu_drawer-title">
メニュー
</div>
<p class="down-slide-close-drawer-menu_drawer-text">
下から表示されるドロワーメニューです。下方向へスライドすると閉じます。
</p>
<nav class="down-slide-close-drawer-menu_nav" aria-label="メニュー">
<a href="#">ホーム</a>
<a href="#">サービス</a>
<a href="#">お知らせ</a>
<a href="#">お問い合わせ</a>
</nav>
</div>
</div>
<!-- JavaScript読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0;
font-family:sans-serif;
background:#ffffff;
}
/* デモエリア */
.down-slide-close-drawer-menu_wrap{
max-width:700px;
margin:40px auto;
padding:32px;
border:1px solid #e5e7eb;
border-radius:18px;
background:#f8fafc;
text-align:center;
}
/* タイトル */
.down-slide-close-drawer-menu_title{
font-size:22px;
font-weight:700;
margin-bottom:12px;
}
/* 説明文 */
.down-slide-close-drawer-menu_text{
margin-bottom:24px;
color:#4b5563;
}
/* ドロワーメニューを開くボタン */
.down-slide-close-drawer-menu_open{
padding:12px 24px;
border:none;
border-radius:8px;
background:#0b6bff;
color:#ffffff;
font-weight:700;
cursor:pointer;
}
/* 背景 */
.down-slide-close-drawer-menu_overlay{
display:none;
position:fixed;
inset:0;
z-index:9999;
background:rgba(0,0,0,.5);
align-items:flex-end;
justify-content:center;
}
/* 表示時 */
.down-slide-close-drawer-menu_overlay.is-active{
display:flex;
}
/* ドロワーメニュー本体 */
.down-slide-close-drawer-menu_drawer{
width:100%;
max-width:none;
padding:28px;
border-radius:20px 20px 0 0;
background:#ffffff;
box-sizing:border-box;
box-shadow:0 -10px 30px rgba(0,0,0,.2);
touch-action:none;
transition:transform .2s;
}
/* スライド操作の目印 */
.down-slide-close-drawer-menu_handle{
width:64px;
height:6px;
margin:0 auto 20px;
border-radius:999px;
background:#d1d5db;
}
/* 見出し */
.down-slide-close-drawer-menu_drawer-title{
font-size:22px;
font-weight:700;
margin-bottom:16px;
}
/* 説明文 */
.down-slide-close-drawer-menu_drawer-text{
margin-bottom:20px;
color:#4b5563;
line-height:1.8;
}
/* メニュー */
.down-slide-close-drawer-menu_nav{
display:flex;
flex-direction:column;
gap:12px;
}
/* メニューリンク */
.down-slide-close-drawer-menu_nav a{
display:block;
padding:12px 14px;
border-radius:8px;
background:#f3f4f6;
color:#111827;
text-decoration:none;
font-weight:700;
}
// ドロワーメニューを開くボタンを取得
const slideOpen=document.querySelector("[data-slide-open]");
// ドロワーメニュー背景を取得
const slideOverlay=document.querySelector("[data-slide-overlay]");
// ドロワーメニュー本体を取得
const slideDrawer=document.querySelector("[data-slide-drawer]");
// スライド開始位置を保存
let startY=0;
// スライド移動量を保存
let moveY=0;
// スライド中かどうかを判定
let isSliding=false;
// 開くボタンをクリックしたときの処理
slideOpen.addEventListener("click",function(){
slideOverlay.classList.add("is-active");
slideDrawer.style.transform="translateY(0)";
});
// ドロワーメニューを押したときの処理
slideDrawer.addEventListener("pointerdown",function(event){
isSliding=true;
startY=event.clientY;
});
// ドロワーメニュー上で動かしたときの処理
slideDrawer.addEventListener("pointermove",function(event){
if(!isSliding){
return;
}
// 下方向へ動かした分だけ移動
moveY=Math.max(0,event.clientY-startY);
slideDrawer.style.transform="translateY("+moveY+"px)";
});
// スライド終了時の処理
function finishSlide(){
if(!isSliding){
return;
}
isSliding=false;
// 120px以上下へスライドしたら閉じる
if(moveY>120){
slideOverlay.classList.remove("is-active");
}
// 元の位置へ戻す
slideDrawer.style.transform="translateY(0)";
moveY=0;
}
// 指やマウスを離したときに判定
slideDrawer.addEventListener("pointerup",finishSlide);
// 操作が中断されたときにも判定
slideDrawer.addEventListener("pointercancel",finishSlide);
ファイル構成と設置方法
このサンプルは、HTML・CSS・JavaScriptをそれぞれ別ファイルに分けて使用します。index.html、style.css、script.js を同じフォルダに配置してください。
sample/
├── index.html
├── style.css
└── script.js
index.html をブラウザで開くと、下から表示されるドロワーメニューを確認できます。このサンプルでは、ドロワーメニューを下方向へスライドすると閉じることができ、少しだけ動かした場合は元の位置へ戻ります。
下にスライドして閉じられるドロワーメニューの作り方【HTML/CSS/JavaScript・サンプルコード付き】
コメント