ページを移動しても開閉状態を記憶するドロップダウンメニューの作り方【HTML/CSS/JavaScript・サンプルコード付き】

ドロップダウンメニュー

ページを移動しても開閉状態を記憶するドロップダウンメニューの作り方

ページを移動しても開閉状態を記憶するドロップダウンメニューの作り方を紹介します。このサンプルでは、メニューボタンをクリックしてドロップダウンメニューを開閉し、その状態を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で利用できます。


こちらもおすすめ


コメント