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

アコーディオン
無料ツール
アコーディオンを自由に作成

見出し・内容・開閉方法・色・サイズ・アイコンなどを設定して、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などすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されており、「メニューを開く」をクリックすると画面左側からアコーディオン付きドロワーメニューが表示されます。ドロワーメニュー内には「サービス」と「お知らせ」の親メニューがあり、それぞれをクリックすると対応する子メニューを開閉できます。

HTMLではドロワーメニューとアコーディオンの構造を作成し、CSSではドロワーメニューのスライド表示、半透明背景、アコーディオンの開閉アニメーションなどを設定しています。JavaScriptではドロワーメニューの表示・非表示と、各親メニューのアコーディオン開閉を制御します。

ドロワーメニューは「メニューを開く」ボタンで表示でき、右上の×ボタンまたは半透明の背景をクリックすると閉じます。サンプルでは子メニューのリンクをクリックした場合もドロワーメニューが閉じます。子メニューのリンクは動作確認用のためページ移動を停止しており、実際のサイトで使用する場合はリンク先とJavaScriptの処理を用途に合わせて変更してください。

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

各ファイルの役割
index.html
「メニューを開く」ボタン、半透明背景、ドロワーメニュー、×ボタン、アコーディオンの親メニューと子メニューを配置しています。サンプルでは「サービス」と「お知らせ」の2つの親メニューを用意し、それぞれに3つの子メニューを配置しています。

style.css
操作エリア、半透明背景、ドロワーメニュー、×ボタン、親メニュー、子メニューなどのデザインを設定しています。ドロワーメニューは通常時に画面左側へ隠し、is-activeクラスが追加されると画面内へスライドします。アコーディオンはis-openクラスによって子メニューの高さを切り替えています。

script.js
ドロワーメニューとアコーディオンの動作を制御しています。「メニューを開く」のクリックでドロワーメニューを表示し、×ボタンまたは半透明背景のクリックで閉じます。親メニューをクリックすると対応するアコーディオンへis-openクラスを追加・削除し、aria-expandedも開閉状態に合わせて変更します。

設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置してください。3つのファイルは同じ階層へ保存します。準備ができたらsample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込むため、追加のJavaScriptライブラリは必要ありません。

「メニューを開く」をクリックすると、画面左側からドロワーメニューが表示されます。「サービス」または「お知らせ」をクリックすると、その下に子メニューが展開され、もう一度クリックすると閉じます。右上の×ボタンまたはドロワーメニュー外側の半透明背景をクリックすると、ドロワーメニュー全体が閉じます。

サンプルの子メニューにはhref="#web-production"などのリンク先を設定していますが、JavaScriptのevent.preventDefault();によってページ移動を停止しています。実際にリンクとして使用する場合は、各hrefを移動先へ変更し、子メニューのクリック処理からevent.preventDefault();を削除してください。

カスタマイズできる内容
index.htmlではドロワーメニューのタイトル、説明文、親メニュー、子メニュー、リンク先などを変更できます。アコーディオンを追加する場合は、accordion-drawer-menu_groupを1つのまとまりとして追加し、その中へ親メニューと子メニューを配置します。

style.cssではドロワーメニューの横幅や余白、半透明背景の濃さ、スライド速度、アコーディオンの枠線や背景色、親メニューと子メニューの文字サイズ、開閉速度などを変更できます。親メニュー右側の「+」「-」もCSSのcontentで変更できます。

script.jsではドロワーメニューを開く・閉じる処理と、アコーディオンの開閉処理を変更できます。このサンプルでは複数のアコーディオンを同時に開ける構成になっているため、「サービス」を開いた状態で「お知らせ」を開くこともできます。

数値調整
style.css
max-width:700px;
ドロワーメニューを開く操作エリアの最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。

padding:32px;
操作エリアの内側余白です。値を大きくするとタイトルやボタンと枠線との間隔が広がります。

border-radius:18px;
操作エリアの角丸です。値を大きくすると丸みが強くなります。

padding:12px 26px;
「メニューを開く」ボタンの内側余白です。上下の12pxで高さ、左右の26pxで横方向の広さを調整できます。

background:rgba(15,23,42,.6);
ドロワーメニュー表示中の半透明背景です。.6を大きくすると背景が濃くなり、小さくすると薄くなります。

width:380px;
ドロワーメニューの横幅です。値を大きくするとメニューが横に広がり、小さくするとコンパクトになります。

max-width:92%;
ドロワーメニューが画面幅に対して占める最大幅です。狭い画面でドロワーメニューが画面内へ収まるようにしています。

padding:28px 24px;
ドロワーメニューの内側余白です。上下の28pxと左右の24pxを変更すると、メニュー内容と画面端との間隔を調整できます。

transform:translateX(calc(-100% - 40px));
閉じている状態のドロワーメニューを画面左側へ隠す位置です。40pxを大きくすると、さらに左側へ移動します。

transition:transform .35s ease;
ドロワーメニューを開閉する時間です。.35sを大きくするとゆっくり、小さくすると速くスライドします。

width:42px; height:42px;
右上にある×ボタンの横幅と高さです。値を大きくするとボタン全体が大きくなります。

width:20px; height:2px;
×印を作っている2本の線の長さと太さです。20pxで線の長さ、2pxで線の太さを調整できます。

gap:12px;
「サービス」と「お知らせ」など、アコーディオン同士の間隔です。値を大きくすると各アコーディオンの間隔が広がります。

padding:16px 18px;
親メニューの内側余白です。上下の16pxで親メニューの高さ、左右の18pxで文字と端との間隔を調整できます。

transition:grid-template-rows .3s ease;
子メニューを開閉する時間です。.3sを大きくするとゆっくり、小さくすると速く開閉します。

gap:10px;
子メニュー同士の間隔です。値を大きくすると「Web制作」「システム開発」などのリンク同士の間隔が広がります。

padding:12px 14px;
子メニューリンクの内側余白です。上下の12pxでリンクの高さ、左右の14pxで文字と端との間隔を調整できます。

レスポンシブ対応
このサンプルはレスポンシブ対応です。操作エリアにはwidth:100%max-width:700px、ドロワーメニューにはwidth:380pxmax-width:92%を設定しているため、画面幅が狭くなるとドロワーメニューも画面内へ収まるように縮小されます。

画面幅640px以下では、ページ全体の余白を24px 16px、操作エリアをpadding:24px 18px、ドロワーメニューをpadding:24px 18pxへ変更しています。スマートフォン・タブレット・PCの画面幅に合わせてアコーディオン付きドロワーメニューを利用できます。

こちらもおすすめ


コメント