ページを移動しても開閉状態を記憶するドロップダウンメニューの作り方
ページを移動しても開閉状態を記憶するドロップダウンメニューの作り方を紹介します。このサンプルでは、メニューボタンをクリックしてドロップダウンメニューを開閉し、その状態をJavaScriptのlocalStorageへ保存します。ページを再読み込みした場合や、別のページへ移動してから戻った場合でも保存された状態を読み込み、最後に開いていた場合は開いた状態、閉じていた場合は閉じた状態で表示できます。
ドロップダウンメニューを開いたまま別のページへ移動して戻ると、再び開いた状態で表示されます。反対に、閉じた状態でページを移動した場合は閉じた状態が維持されます。利用者が最後に操作した状態を引き継げるため、ナビゲーションメニューやカテゴリー一覧など、ページを移動しながら利用するメニューに活用できます。
HTMLではメニューボタンやドロップダウン内の項目を変更でき、CSSでは横幅、余白、背景色、枠線、角丸などを調整できます。保存した開閉状態には独自の有効期限を設定していないため、localStorageのデータが削除されるまで保持されます。ただし、ブラウザのサイトデータを削除した場合などは保存された状態も失われます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>ページを移動しても開閉状態を記憶するドロップダウンメニュー</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- ドロップダウンメニュー全体 -->
<div class="remember-dropdown-menu_wrap">
<!-- タイトル -->
<div class="remember-dropdown-menu_title">
開閉状態を記憶するドロップダウンメニュー
</div>
<!-- 説明文 -->
<p class="remember-dropdown-menu_text">
メニューを開閉すると、その状態がブラウザへ保存されます。
</p>
<!-- メニュー配置エリア -->
<div class="remember-dropdown-menu_group">
<!-- ドロップダウンメニュー -->
<div class="remember-dropdown-menu_area">
<!-- メニューを開閉するボタン -->
<button
class="remember-dropdown-menu_button"
type="button"
data-remember-dropdown-menu-button
aria-expanded="false">
メニュー
<span class="remember-dropdown-menu_arrow">▼</span>
</button>
<!-- 開閉するメニュー一覧 -->
<ul
class="remember-dropdown-menu_list"
data-remember-dropdown-menu-list>
<li>
<a class="remember-dropdown-menu_link" href="#">
ホーム
</a>
</li>
<li>
<a class="remember-dropdown-menu_link" href="#">
サービス
</a>
</li>
<li>
<a class="remember-dropdown-menu_link" href="#">
お問い合わせ
</a>
</li>
</ul>
</div>
</div>
</div>
<!-- 補足説明 -->
<p class="remember-dropdown-menu_note">
「メニュー」を開閉したあとにページを再読み込みしても、最後の開閉状態が維持されます。
</p>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでドロップダウンメニューのボタンとメニュー項目を作成し、CSSで横幅、余白、背景色、角丸、影などの見た目を整えます。JavaScriptではメニューの開閉処理を行い、現在の開閉状態をブラウザのlocalStorageへ保存します。
メニューボタンをクリックするたびに、開いている場合はopen、閉じている場合はclosedとして状態を保存します。ページを再読み込みした場合や、同じサイト内の別ページへ移動してから戻った場合でも、保存されている状態を読み込み、最後の開閉状態を復元できます。
保存した開閉状態には、このコード側で有効期限を設定していません。localStorageのデータが残っている間は状態を復元できますが、ブラウザのサイトデータやlocalStorageを削除した場合は保存状態も失われます。外部ライブラリは使用せず、HTML・CSS・バニラJavaScriptだけで動作します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロップダウンメニュー全体を構成するファイルです。「開閉状態を記憶するドロップダウンメニュー」のタイトル、説明文、「メニュー」ボタン、ホーム・サービス・お問い合わせの各リンク、補足説明を変更できます。
style.cssはドロップダウンメニューのデザインを設定するファイルです。全体の最大横幅、余白、背景色、枠線、角丸、ボタンの高さ、メニュー一覧の横幅、影、リンクの余白などを変更できます。
script.jsはメニューの開閉と状態保存を行うファイルです。ページ表示時にlocalStorageから保存済みの状態を取得し、openが保存されている場合はメニューへis-openクラスを追加します。ボタンをクリックすると表示状態を切り替え、その結果をlocalStorageへ保存します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを同じ階層で配置します。3つのファイルを保存したあと、sample/index.htmlをブラウザで開いてください。「メニュー」をクリックするとドロップダウンメニューが表示され、もう一度クリックすると閉じます。
メニューを開閉するたびに現在の状態がlocalStorageへ保存されます。メニューを開いた状態でページを再読み込みすると開いた状態が復元され、閉じた状態で再読み込みすると閉じた状態で表示されます。別のページへ移動してから戻った場合も、保存されている最後の状態を読み込んで表示します。
カスタマイズできる内容
index.htmlではタイトル、説明文、「メニュー」のボタン文字、ホーム・サービス・お問い合わせのリンク文字とリンク先、補足説明を変更できます。用途に合わせてカテゴリー一覧やナビゲーションメニューなどへ変更できます。
style.cssでは全体の最大横幅、余白、背景色、枠線、角丸、ボタンの背景色や文字色、メニュー一覧の横幅、表示位置、影、各リンクの余白やホバー時の背景色などを変更できます。
script.jsではremember-dropdown-menu-stateをlocalStorageの保存名として使用しています。この文字列を変更すると、開閉状態を保存するキー名を変更できます。
数値調整
style.css
padding:40px 20px;
ページ全体の余白です。40pxは上下、20pxは左右の余白です。値を大きくすると画面端との間隔が広がります。
max-width:700px;
ドロップダウンメニュー全体の最大横幅です。値を大きくすると全体が横に広がり、小さくするとコンパクトになります。
margin:40px auto;
全体の上下余白です。40pxを大きくすると上下の間隔が広がります。
padding:32px;
全体の内側余白です。値を大きくすると内容と外枠の間隔が広がります。
border-radius:18px;
全体の角丸です。値を大きくすると丸みが強くなります。
max-width:280px;
ドロップダウンメニュー部分の最大横幅です。値を大きくするとボタンとメニュー一覧が横に広がります。
min-height:52px;
メニューボタンの最小高さです。値を大きくするとボタンが高くなります。
padding:14px 18px;
メニューボタンの内側余白です。14pxは上下、18pxは左右の余白です。
border-radius:10px;
メニューボタンとメニュー一覧の角丸です。値を大きくすると丸みが強くなります。
margin-left:12px;
ボタン文字と「▼」の間隔です。値を大きくすると両者の間隔が広がります。
font-size:12px;
「▼」の文字サイズです。値を大きくすると矢印が大きく表示されます。
top:calc(100% + 10px);
メニュー一覧をボタンの下へ配置する間隔です。10pxを大きくするとボタンとメニュー一覧の間隔が広がります。
padding:8px;
メニュー一覧の内側余白です。値を大きくするとリンクと外枠の間隔が広がります。
box-shadow:0 10px 24px rgba(15,23,42,.12);
メニュー一覧の影です。10pxや24pxを変更すると影の位置や広がりが変わります。
padding:12px 14px;
各メニューリンクの内側余白です。12pxは上下、14pxは左右の余白です。値を大きくするとリンクのクリック領域が広がります。
border-radius:8px;
各メニューリンクの角丸です。値を大きくすると丸みが強くなります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxによって、画面幅に合わせて全体が縮小されます。ドロップダウンメニュー部分もwidth:100%とmax-width:280pxで画面幅に応じて調整されます。画面幅640px以下ではページ全体の余白を24px 16px、メニュー全体の内側余白を24px 18pxへ変更しているため、スマートフォン・タブレット・PCで利用できます。
コメント