アコーディオン付きドロワーメニューを作る方法【HTML/CSS/JavaScript・サンプルコード付き】

ドロワーメニュー

アコーディオン付きドロワーメニューを作る方法

アコーディオン付きドロワーメニューを作る方法を紹介します。メニューを開くと親メニューが一覧表示され、クリックすると子メニューが展開されるサンプルです。限られたスペースでも多くのメニューを整理して表示できるため、スマートフォン向けのナビゲーションにも適しています。

このサンプルでは、HTML・CSS・JavaScriptだけで実装しています。ドロワーメニューの開閉だけでなく、親メニューごとにアコーディオンを切り替えられるため、サービス一覧やカテゴリー一覧、サポート情報などを階層構造で見やすく表示できます。

メニュー名や子メニューの内容、色やサイズ、余白なども自由に変更できます。シンプルな構成なので、企業サイトやポートフォリオ、ブログなどさまざまなWebサイトへそのまま導入しやすいサンプルコードです。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
サンプルコードのご利用によって発生した損害について、当サイトでは一切の責任を負いかねます。

デモ

アコーディオン付きドロワーメニュー

「メニューを開く」をクリックすると、アコーディオン付きのドロワーメニューを表示します。

「メニューを開く」をクリックすると左側から表示されます。親メニューをクリックすると子メニューが開閉し、閉じるボタン、背景部分、または子メニューをクリックするとドロワーメニューが閉じます。

コードをコピーして使おう!

<!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>

  <!-- ドロワーメニューを開く操作エリア -->
  <main class="accordion-drawer-menu_wrap">

    <!-- 操作エリアのタイトル -->
    <div class="accordion-drawer-menu_title">
      アコーディオン付きドロワーメニュー
    </div>

    <!-- 操作エリアの説明文 -->
    <p class="accordion-drawer-menu_text">
      「メニューを開く」をクリックすると、アコーディオン付きのドロワーメニューを表示します。
    </p>

    <!-- ドロワーメニューを開くボタン -->
    <button
      class="accordion-drawer-menu_open"
      type="button"
      data-accordion-drawer-menu-open>
      メニューを開く
    </button>

  </main>

  <!-- ドロワーメニュー表示中の背景 -->
  <div
    class="accordion-drawer-menu_overlay"
    data-accordion-drawer-menu-overlay>
  </div>

  <!-- ドロワーメニュー本体 -->
  <aside
    class="accordion-drawer-menu_drawer"
    data-accordion-drawer-menu-drawer
    aria-hidden="true">

    <!-- ドロワーメニュー上部 -->
    <div class="accordion-drawer-menu_header">

      <!-- ドロワーメニューのタイトル -->
      <div class="accordion-drawer-menu_heading">
        メニュー
      </div>

      <!-- ドロワーメニューを閉じるボタン -->
      <button
        class="accordion-drawer-menu_close"
        type="button"
        data-accordion-drawer-menu-close
        aria-label="閉じる">
      </button>

    </div>

    <!-- アコーディオンの説明文 -->
    <p class="accordion-drawer-menu_drawer-text">
      親メニューをクリックすると、子メニューが開閉します。
    </p>

    <!-- アコーディオン付きナビゲーション -->
    <nav
      class="accordion-drawer-menu_nav"
      aria-label="メインメニュー">

      <!-- サービスのアコーディオン -->
      <div class="accordion-drawer-menu_group">

        <!-- 親メニュー -->
        <button
          class="accordion-drawer-menu_parent"
          type="button"
          aria-expanded="false">
          サービス
        </button>

        <!-- 子メニュー -->
        <div class="accordion-drawer-menu_child">

          <div class="accordion-drawer-menu_child-inner">

            <a
              class="accordion-drawer-menu_link"
              href="#web-production"
              data-accordion-drawer-menu-link>
              Web制作
            </a>

            <a
              class="accordion-drawer-menu_link"
              href="#system-development"
              data-accordion-drawer-menu-link>
              システム開発
            </a>

            <a
              class="accordion-drawer-menu_link"
              href="#maintenance-support"
              data-accordion-drawer-menu-link>
              保守サポート
            </a>

          </div>

        </div>

      </div>

      <!-- お知らせのアコーディオン -->
      <div class="accordion-drawer-menu_group">

        <!-- 親メニュー -->
        <button
          class="accordion-drawer-menu_parent"
          type="button"
          aria-expanded="false">
          お知らせ
        </button>

        <!-- 子メニュー -->
        <div class="accordion-drawer-menu_child">

          <div class="accordion-drawer-menu_child-inner">

            <a
              class="accordion-drawer-menu_link"
              href="#news"
              data-accordion-drawer-menu-link>
              新着情報
            </a>

            <a
              class="accordion-drawer-menu_link"
              href="#event"
              data-accordion-drawer-menu-link>
              イベント
            </a>

            <a
              class="accordion-drawer-menu_link"
              href="#update-history"
              data-accordion-drawer-menu-link>
              更新履歴
            </a>

          </div>

        </div>

      </div>

    </nav>

  </aside>

  <!-- JavaScriptファイルを読み込み -->
  <script src="script.js"></script>

</body>
</html>

ファイル構成と設置方法

このサンプルは、HTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではドロワーメニュー本体、開閉ボタン、親メニュー、子メニューを配置し、CSSでは画面左側から表示するレイアウトとアコーディオンの開閉アニメーションを設定しています。JavaScriptでは、ドロワーメニューと各アコーディオンの表示状態を切り替えます。

ドロワーメニューを開くと、「サービス」と「お知らせ」の親メニューが表示されます。親メニューをクリックすると、その項目に対応した子メニューが下へ展開され、もう一度クリックすると閉じます。複数の親メニューはそれぞれ個別に開閉できます。

メニュー名やリンク先はindex.html、ドロワーメニューの横幅や色、余白、開閉速度はstyle.cssで変更できます。ドロワーメニューの開閉とアコーディオンの切り替え処理はscript.jsにまとめられています。

sample/
├── index.html
├── style.css
└── script.js

各ファイルの役割
index.html
操作エリア、開くボタン、オーバーレイ、ドロワーメニュー、閉じるボタン、親メニュー、子メニューを配置しています。タイトル、説明文、親メニュー名、子メニュー名、リンク先を変更すると表示内容が変わります。

style.css
操作エリア、ボタン、オーバーレイ、ドロワーメニュー、アコーディオン、子メニューのデザインを設定しています。ドロワーメニューの横幅、背景色、文字色、余白、角丸、影、開閉速度を変更できます。

script.js
ドロワーメニューの開閉と、親メニューをクリックしたときのアコーディオン切り替えを行います。開閉時にはis-activeクラスとis-openクラスを追加・削除し、aria-hiddenとaria-expandedも更新します。

設置方法・使い方
sampleフォルダ内へindex.html、style.css、script.jsを配置します。3ファイルは同じ階層に保存してください。

sample/index.htmlをブラウザで開き、「メニューを開く」をクリックするとドロワーメニューが画面左側から表示されます。「サービス」または「お知らせ」をクリックすると、それぞれの子メニューが開閉します。閉じるボタン、背景部分、または子メニューをクリックするとドロワーメニューが閉じます。

カスタマイズできる内容
index.htmlでは、操作エリアのタイトルと説明文、ドロワーメニューのタイトル、親メニュー名、子メニュー名、リンク先を変更できます。アコーディオン項目を追加する場合は、accordion-drawer-menu_groupのまとまりを追加します。

style.cssでは、開くボタンや親メニューの色、ドロワーメニューの横幅、背景色、文字サイズ、余白、角丸、影を変更できます。子メニューの背景色や間隔、開閉アニメーションの速度も調整できます。

script.jsでは、ドロワーメニューの開閉対象や、親メニューをクリックしたときの切り替え処理を変更できます。

数値調整
style.css
width:380px;
ドロワーメニューの横幅です。値を大きくすると幅が広くなり、小さくすると狭くなります。

style.css
max-width:92%;
画面幅に対するドロワーメニューの最大幅です。小さい画面では画面幅の92%以内に収まります。

style.css
transition:transform .35s ease;
0.35秒でドロワーメニューが開閉します。値を大きくするとゆっくり、小さくすると速く動きます。

style.css
transition:grid-template-rows .3s ease;
0.3秒で子メニューが開閉します。値を大きくするとゆっくり、小さくすると速く展開されます。

style.css
transition:padding .3s ease;
0.3秒で子メニュー内側の余白が切り替わります。子メニューの開閉時間と同じ値にすると自然に動きます。

style.css
background:rgba(15,23,42,.6);
0.6はオーバーレイの暗さです。値を大きくすると背景が暗くなり、小さくすると明るくなります。

レスポンシブ対応
style.cssのwidth:100%、max-width:700px、max-width:92%を使用して、画面幅に合わせて操作エリアとドロワーメニューが縮小されます。

画面幅640px以下ではmedia queryによってbody、操作エリア、ドロワーメニューの余白を小さくしています。スマートフォン・タブレット・PCで利用できます。



コメント