4方向から出せるドロワーメニュー
本記事では、ボタン操作だけで左・右・上・下の4方向からスライド表示できるドロワーメニューの実装方法をご紹介します。
CSSとJavaScriptを組み合わせ、スライド方向を動的に切り替えられる汎用コンポーネントとして構築。コピペで導入でき、既存サイトへの組み込みも容易です。
コードについて
本記事のコードはAI(ChatGPT)によって生成・調整されています。必ずご自身の環境で動作を確認してからご利用ください。
免責 本コードの利用により生じた不具合・損害について、当サイトは責任を負いません。自己責任でご使用ください。
免責 本コードの利用により生じた不具合・損害について、当サイトは責任を負いません。自己責任でご使用ください。
デモ
下のボタンでドロワーを開閉し、「方向変更」ボタンでスライド方向(左→右→上→下)を切り替えてみてください。
コードをコピーして使おう!
/* ============================================
▼ CSS:#drawer-direction-section スコープ推奨
ボタン操作でスライド方向を切り替え可能な
4方向対応ドロワーメニューのスタイル定義
============================================ */
/* --- コンテナ(全体を包む要素) --- */
#drawer-direction-section{
position:relative; /* パネルやボタンなどの基準位置を固定するための相対配置 */
}
/* --- 「メニューを開く」ボタン --- */
#drawer-direction-section .menu-btn{
background:#0b6bff; /* メインのアクセントカラー(鮮やかな青) */
color:#fff; /* 白文字でコントラストを確保 */
border:none; /* 既定の枠線を削除してシンプルに */
border-radius:8px; /* 角丸でやわらかい印象に */
padding:10px 16px; /* クリックしやすい大きめのパディング */
cursor:pointer; /* ホバー時にポインタを表示 */
}
/* --- 「方向変更」ボタン --- */
#drawer-direction-section .change-btn{
border:1px solid #e5e7eb; /* グレーの枠線で区切りをつける */
background:#fff; /* 白背景でメインボタンとの差別化 */
border-radius:8px; /* 角丸で統一感を保つ */
padding:10px 14px; /* 適度なパディングで押しやすく */
cursor:pointer; /* ホバー時にポインタ表示 */
}
/* --- オーバーレイ(背景の半透明レイヤー) --- */
#drawer-direction-section .overlay{
position:fixed; /* 画面全体を覆う */
inset:0; /* 四方を0にして全領域カバー */
background:rgba(0,0,0,0.5); /* 半透明の黒で背景を暗くする */
opacity:0; /* 初期は非表示 */
pointer-events:none; /* クリックを無効化 */
transition:opacity .25s ease; /* フェードイン・アウトを滑らかに */
}
/* --- オーバーレイが表示状態のとき --- */
#drawer-direction-section .overlay.active{
opacity:1; /* 不透明にして可視化 */
pointer-events:auto; /* 背景クリックを有効化(閉じる処理に使う) */
}
/* --- ドロワーパネル本体 --- */
#drawer-direction-section .panel{
position:fixed; /* 画面に固定配置(スクロールしても位置固定) */
background:#fff; /* 背景は白で内容を明瞭に */
box-shadow:0 0 18px rgba(0,0,0,0.25); /* 軽い影で浮き上がりを演出 */
transition:transform .3s ease; /* スライドの動きを滑らかに */
display:flex; /* ヘッダーとナビを縦並びにする */
flex-direction:column; /* 縦方向レイアウト */
width:min(86vw,340px); /* 横幅を画面幅の86% or 最大340pxに制限 */
height:100dvh; /* 高さをデバイス表示領域の全体に */
}
/* --- 各方向の初期位置(非表示時のオフスクリーン位置) --- */
#drawer-direction-section .panel.from-left{
top:0; left:0; transform:translateX(-100%); /* 左からスライドインする初期位置 */
}
#drawer-direction-section .panel.from-right{
top:0; right:0; transform:translateX(100%); /* 右からスライドインする初期位置 */
}
#drawer-direction-section .panel.from-top{
top:0; left:0;
width:100vw; height:min(80vh,500px); /* 横幅100%、高さは最大500pxに制限 */
transform:translateY(-100%); /* 上からスライドインする初期位置 */
}
#drawer-direction-section .panel.from-bottom{
bottom:0; left:0;
width:100vw; height:min(80vh,500px); /* 横幅100%、高さは最大500pxに制限 */
transform:translateY(100%); /* 下からスライドインする初期位置 */
}
/* --- パネルがアクティブ(表示中)になった時の位置補正 --- */
#drawer-direction-section .panel.active.from-left{
transform:translateX(0); /* 左からスライドイン完了状態 */
}
#drawer-direction-section .panel.active.from-right{
transform:translateX(0); /* 右からスライドイン完了状態 */
}
#drawer-direction-section .panel.active.from-top{
transform:translateY(0); /* 上からスライドイン完了状態 */
}
#drawer-direction-section .panel.active.from-bottom{
transform:translateY(0); /* 下からスライドイン完了状態 */
}
/* --- ヘッダーエリア(タイトル+閉じるボタン) --- */
#drawer-direction-section .panel header{
display:flex; /* 横並び配置 */
justify-content:space-between; /* タイトルとボタンを左右に配置 */
align-items:center; /* 垂直中央寄せ */
padding:14px 16px; /* 適度な内側余白 */
border-bottom:1px solid #e5e7eb; /* 下線で区切りをつける */
}
/* --- 閉じるボタン(×) --- */
#drawer-direction-section .close-btn{
background:none; /* 背景なしでシンプルに */
border:none; /* 枠線削除 */
font-size:18px; /* 大きめのサイズで視認性UP */
cursor:pointer; /* ポインタ表示でクリックを示す */
}
コメント