ページ遷移後も開閉状態を記憶
localStorageを利用し、ユーザーがドロワーメニューを開いた状態のままページを移動しても、次のページで再びメニューを自動的に開くサンプルです。
SPA(単一ページ)でなくても簡単に開閉状態を引き継げます。
コードについて
本記事のコードは AI(ChatGPT)による生成をベースに作成・調整しています。ご利用の環境でテストの上ご使用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
デモ
下の「メニューを開く」ボタンを押してドロワーを開き、そのままページをリロードしてみてください。
localStorageによって、2回目以降の訪問では前回の開閉状態が自動的に復元されます。
初回アクセス時は自動で開かないよう制御されています。
コードをコピーして使おう!
/* ===========================================
▼ CSS:#drawer-memory-section スコープ推奨
localStorageで状態保持するドロワー用スタイル
=========================================== */
/* -----------------------------------------------------
セクション全体のスタイル設定
(ドロワーメニュー機能のコンテナとなる)
----------------------------------------------------- */
#drawer-memory-section{
position:relative; /* 内部の絶対配置要素(overlay/panelなど)の基準とする */
}
/* -----------------------------------------------------
「メニューを開く」ボタンの基本スタイル
----------------------------------------------------- */
#drawer-memory-section .menu-btn{
background:#0b6bff; /* 明るいブルーで視認性を確保 */
color:#fff; /* 背景とのコントラストを強調 */
border:none; /* デフォルトのボーダーを削除 */
border-radius:8px; /* 柔らかい角丸ボタンにする */
padding:10px 16px; /* 押しやすいタップ領域を確保 */
cursor:pointer; /* ホバー時にカーソルをポインタ表示 */
}
/* -----------------------------------------------------
オーバーレイ(背景を半透明で覆うレイヤー)
初期状態では非表示
----------------------------------------------------- */
#drawer-memory-section .overlay{
position:fixed; /* 画面全体を覆う固定配置 */
inset:0; /* top, right, bottom, left をすべて0にして全画面に広げる */
background:rgba(0,0,0,0.5);/* 背景を半透明の黒で覆い、背後の内容を暗くする */
opacity:0; /* 初期は透明で見えない状態 */
pointer-events:none; /* 初期状態ではクリックを通過させる */
transition:opacity .25s ease; /* フェードイン/アウトを滑らかにする */
}
/* -----------------------------------------------------
オーバーレイがアクティブな時の状態(表示中)
----------------------------------------------------- */
#drawer-memory-section .overlay.active{
opacity:1; /* 不透明度を上げて表示する */
pointer-events:auto; /* クリックを受け付ける(背景クリックで閉じるため) */
}
/* -----------------------------------------------------
ドロワーパネル本体
初期状態では右側の画面外に配置し、アクティブ時にスライドイン
----------------------------------------------------- */
#drawer-memory-section .panel{
position:fixed; /* 画面に固定して常に右端に配置 */
top:0; /* 上端から配置開始 */
right:0; /* 右端に固定 */
height:100dvh; /* ビューポート高いっぱい(モバイル対応) */
width:min(86vw,340px); /* 画面幅の86%か340pxの小さい方を採用 */
background:#fff; /* 背景は白で内容を明確に */
box-shadow:-6px 0 18px rgba(0,0,0,0.2); /* 影を付けて奥行きを演出 */
transform:translateX(100%); /* 初期状態では右に押し出して非表示 */
transition:transform .3s ease; /* スライドアニメーションを適用 */
display:flex; /* 縦方向に要素を並べるためflexを利用 */
flex-direction:column; /* ヘッダーとコンテンツを縦に積む */
}
/* -----------------------------------------------------
パネルがアクティブ状態になったとき
transformを0に戻し、画面内にスライドインさせる
----------------------------------------------------- */
#drawer-memory-section .panel.active{
transform:translateX(0); /* 画面内にスライドして表示 */
}
/* -----------------------------------------------------
パネルヘッダー部分
タイトルと「閉じる」ボタンを左右に配置
----------------------------------------------------- */
#drawer-memory-section .panel header{
display:flex; /* 横並び配置 */
justify-content:space-between; /* 左右に要素を分ける */
align-items:center; /* 垂直方向中央揃え */
padding:14px 16px; /* 内側に余白をとり、操作しやすく */
border-bottom:1px solid #e5e7eb; /* 下線でヘッダーを区切る */
}
/* -----------------------------------------------------
閉じるボタン(右上の「×」)
シンプルな見た目でクリック可能に
----------------------------------------------------- */
#drawer-memory-section .close-btn{
background:none; /* 背景を消してアイコン的に見せる */
border:none; /* 不要なボーダーを削除 */
font-size:18px; /* 適度なサイズの「×」を表示 */
cursor:pointer; /* ホバー時にポインタ表示 */
}
コメント