複数ドロワーメニューを切り替えて表示する方法【HTML/CSS/JavaScript・サンプルコード付き】

ドロワーメニュー

複数ドロワーメニューを切り替えて表示する方法

複数のドロワーメニューをボタンごとに切り替えて表示する方法を紹介します。このサンプルでは、「メニューA」と「メニューB」の2つのボタンを用意し、クリックしたボタンに対応する別々のドロワーメニューを画面左側から表示します。複数のメニューを1つの画面内で使い分けたい場合に利用でき、表示する内容を用途ごとに分けられます。

たとえば、通常のナビゲーションと会員向けメニューを分けたい場合や、管理画面で機能別にメニューを分けたい場合、ECサイトでカテゴリー用メニューとユーザー用メニューを別々に表示したい場合などに利用できます。どちらかのドロワーメニューを開くと半透明の背景が表示され、同時に複数のドロワーメニューが開かないようにJavaScriptで表示状態を切り替えます。

HTMLでは各ドロワーメニューの内容やメニュー項目を変更でき、CSSではドロワーメニューの横幅、余白、色、角丸、影、スライド速度などを調整できます。JavaScriptでは、ボタンのdata-open属性と各ドロワーメニューのidを対応させて表示するメニューを判定します。「閉じる」ボタンまたは各メニュー項目をクリックすると表示中のドロワーメニューが閉じます。半透明の背景をクリックしても閉じない構成です。

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

デモ

複数ドロワーメニュー

メニューA・メニューBをクリックすると、それぞれ別のドロワーメニューを表示します。

ボタンごとに異なるドロワーメニューを切り替えて表示できます。「閉じる」ボタンまたはメニュー項目をクリックすると閉じます。

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

<!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="multiple-drawer-menu_demo">

    <!-- 操作エリアのタイトル -->
    <div class="multiple-drawer-menu_title">
      複数ドロワーメニュー
    </div>

    <!-- 操作方法の説明 -->
    <p class="multiple-drawer-menu_text">
      メニューA・メニューBをクリックすると、それぞれ別のドロワーメニューを表示します。
    </p>

    <!-- ドロワーメニューを開くボタン -->
    <div class="multiple-drawer-menu_buttons">

      <button type="button" data-open="drawerA">
        メニューA
      </button>

      <button type="button" data-open="drawerB">
        メニューB
      </button>

    </div>

  </main>

  <!-- ドロワーメニュー表示中の半透明背景 -->
  <div class="multiple-drawer-menu_overlay"></div>

  <!-- メニューA -->
  <aside id="drawerA" class="multiple-drawer-menu">

    <!-- ドロワーメニューの見出し -->
    <div class="multiple-drawer-menu_header">

      <div class="multiple-drawer-menu_heading">
        メニューA
      </div>

    </div>

    <!-- メニューAのナビゲーション -->
    <nav class="multiple-drawer-menu_nav" aria-label="メニューA">

      <a class="multiple-drawer-menu_link" href="#">
        ホーム
      </a>

      <a class="multiple-drawer-menu_link" href="#">
        サービス
      </a>

      <a class="multiple-drawer-menu_link" href="#">
        会社概要
      </a>

    </nav>

    <!-- メニューAを閉じるボタン -->
    <button class="multiple-drawer-menu_close" type="button">
      閉じる
    </button>

  </aside>

  <!-- メニューB -->
  <aside id="drawerB" class="multiple-drawer-menu">

    <!-- ドロワーメニューの見出し -->
    <div class="multiple-drawer-menu_header">

      <div class="multiple-drawer-menu_heading">
        メニューB
      </div>

    </div>

    <!-- メニューBのナビゲーション -->
    <nav class="multiple-drawer-menu_nav" aria-label="メニューB">

      <a class="multiple-drawer-menu_link" href="#">
        ブログ
      </a>

      <a class="multiple-drawer-menu_link" href="#">
        料金
      </a>

      <a class="multiple-drawer-menu_link" href="#">
        お問い合わせ
      </a>

    </nav>

    <!-- メニューBを閉じるボタン -->
    <button class="multiple-drawer-menu_close" type="button">
      閉じる
    </button>

  </aside>

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

</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLで「メニューA」「メニューB」の2つのボタンと、それぞれに対応する2つのドロワーメニューを配置し、CSSでドロワーメニューの表示位置やデザインを設定します。JavaScriptではクリックされたボタンに対応するドロワーメニューを判定し、表示するメニューを切り替えます。

開くボタンにはdata-open="drawerA"data-open="drawerB"を設定し、対応するドロワーメニューにはid="drawerA"id="drawerB"を設定しています。JavaScriptがこの値を利用して、どのドロワーメニューを開くか判断します。新しいメニューを開く前にすべてのドロワーメニューを閉じるため、複数のメニューが同時に表示されない構成です。

ドロワーメニューを開くと半透明背景も表示されますが、背景部分には閉じる処理を設定していません。「閉じる」ボタンまたはドロワーメニュー内のメニュー項目をクリックすると表示中のメニューが閉じます。外部サービスや外部ライブラリ、APIキーなどは使用していません。

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

各ファイルの役割
index.html
「メニューA」「メニューB」の開くボタン、半透明背景、2つのドロワーメニュー、各メニューの見出し、ナビゲーションリンク、「閉じる」ボタンを配置しています。メニュー名やリンク文字、リンク先を変更する場合はindex.htmlを編集します。開くボタンのdata-openと、対応するドロワーメニューのidを同じ値にすることで、ボタンとドロワーメニューを関連付けています。

style.css
操作エリア、開くボタン、半透明背景、ドロワーメニュー、ナビゲーションリンク、閉じるボタンのデザインを設定しています。ドロワーメニューの横幅、余白、背景色、角丸、影、メニュー項目の間隔、スライド速度などを変更する場合はstyle.cssを編集します。

script.js
開くボタンのdata-openから対応するドロワーメニューのidを取得し、対象の要素へactiveクラスを追加します。別のメニューを開く前にはcloseMultipleDrawerMenu()を実行して、すべてのドロワーメニューからactiveクラスを削除します。「閉じる」ボタンとメニューリンクをクリックした場合も同じ処理を使って閉じます。

設置方法・使い方
sampleフォルダを作成し、その直下へindex.html、style.css、script.jsを配置してください。index.htmlから<link rel="stylesheet" href="style.css">でstyle.cssを読み込み、ページ下部の<script src="script.js"></script>でscript.jsを読み込む構成です。

3つのファイルを配置したら、sample/index.htmlをブラウザで開きます。「メニューA」をクリックするとid="drawerA"のドロワーメニューが表示され、「メニューB」をクリックするとid="drawerB"のドロワーメニューが表示されます。どちらを開いた場合も半透明背景が表示され、同時に表示されるドロワーメニューは1つだけです。

サンプルの各メニューリンクにはhref="#"を設定しており、script.jsのevent.preventDefault();でページ移動を停止しています。実際のサイトでリンクとして使用する場合は、index.htmlのhref="#"を実際のURLやパスへ変更し、script.jsのメニューリンク処理からevent.preventDefault();を削除してください。

カスタマイズできる内容
index.htmlでは、「メニューA」「メニューB」のボタン文字、各ドロワーメニューの見出し、メニュー項目、リンク先、「閉じる」ボタンの文字を変更できます。ドロワーメニューを追加する場合は、開くボタンへ新しいdata-openの値を設定し、同じ値をidに持つドロワーメニューを追加します。たとえばdata-open="drawerC"を使用する場合は、対応するドロワーメニューへid="drawerC"を設定します。

style.cssでは、操作エリアの最大横幅、開くボタンの色、半透明背景の濃さ、ドロワーメニューの横幅、余白、影、メニューリンクの背景色、角丸、開閉速度などを変更できます。複数のドロワーメニューには同じmultiple-drawer-menuクラスを使用しているため、共通デザインをまとめて変更できます。

数値調整
style.css
max-width:700px;
操作エリアの最大横幅です。700pxを大きくすると横に広がり、小さくすると狭くなります。

margin:40px auto;
操作エリアの上下余白です。40pxを変更すると上下の間隔が変わります。autoによって左右中央へ配置しています。

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

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

gap:16px;
「メニューA」と「メニューB」の開くボタン同士の間隔です。16pxを大きくするとボタンの間隔が広がります。

padding:12px 26px;
開くボタンの内側余白です。12pxが上下、26pxが左右の余白です。値を大きくするとボタンが大きくなります。

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

transition:opacity .3s ease, visibility .3s ease;
半透明背景の表示・非表示にかかる時間です。.3sは0.3秒を表し、値を大きくするとゆっくり、小さくすると速く変化します。

width:320px;
各ドロワーメニューの横幅です。320pxを大きくするとメニューが広くなり、小さくすると狭くなります。

max-width:85%;
ドロワーメニューが画面幅に対して占める最大幅です。狭い画面でメニューが画面全体を覆いすぎないようにしています。

height:100vh;
ドロワーメニューの高さです。100vhでブラウザ画面の高さいっぱいに表示します。

padding:32px 24px;
ドロワーメニュー内側の余白です。32pxが上下、24pxが左右の余白です。

transform:translateX(calc(-100% - 40px));
閉じているドロワーメニューを画面左側へ隠す位置です。40pxを変更すると画面外へ移動させる追加距離が変わります。

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

box-shadow:12px 0 30px rgba(15,23,42,.18);
開いているドロワーメニューの右側へ表示する影です。12pxが横方向の位置、30pxがぼかし量、.18が影の透明度です。

font-size:24px;
ドロワーメニューの見出し文字サイズです。24pxを変更すると「メニューA」「メニューB」の文字サイズが変わります。

gap:10px;
ドロワーメニュー内の各リンクの間隔です。10pxを大きくすると項目同士の間隔が広がります。

padding:14px 16px;
各メニューリンクの内側余白です。14pxが上下、16pxが左右の余白です。値を大きくするとメニュー項目が大きくなります。

padding:12px;
「閉じる」ボタンの内側余白です。12pxを大きくするとボタンの高さが増えます。

レスポンシブ対応
このサンプルはstyle.cssでレスポンシブ対応しています。操作エリアにはwidth:100%max-width:700pxを設定し、画面幅が狭くなると利用可能な横幅に合わせて縮小します。開くボタンを並べるmultiple-drawer-menu_buttonsにはflex-wrap:wrapを設定しているため、横幅が不足した場合はボタンが折り返されます。

各ドロワーメニューにはwidth:320pxmax-width:85%を設定しているため、スマートフォンなどの狭い画面でも画面幅の85%を超えないように表示されます。また、画面幅640px以下では@media (max-width:640px)によってbodyの余白をpadding:24px 16px;へ変更し、操作エリアとドロワーメニューの余白をpadding:24px 18px;へ縮小しています。PC・タブレット・スマートフォンの画面幅に合わせて利用できます。

こちらもおすすめ


コメント