タブ切り替え機能付きドロワーメニューを作る方法【HTML/CSS/JavaScript・サンプルコード付き】

タブ切り替え

タブ切り替え機能付きドロワーメニューを作る方法

タブ切り替え機能付きドロワーメニューを作る方法を紹介します。このサンプルでは、ドロワーメニュー内へタブ切り替え機能を実装し、「メニュー」「SNS」「設定」などのタブをクリックすると表示内容だけを切り替えられます。HTML・CSS・JavaScriptだけで実装でき、ページ遷移せずに複数の情報を整理して表示できます。

通常のドロワーメニューより多くの情報を見やすく整理できるため、企業サイト、管理画面、会員サイト、ECサイトなどでカテゴリごとにメニューを分けたい場合に便利です。ドロワーメニューを閉じることなく必要な情報へ切り替えられるため、操作性も向上します。

タブ名、表示内容、メニュー項目、リンク先URL、配色、横幅、余白、角丸、影、アニメーション速度などを自由に変更できます。画面幅640px以下ではスマートフォン向けレイアウトへ切り替わるため、スマートフォン・タブレット・PCで利用できます。

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

デモ

タブ切り替え機能付きドロワーメニュー

タブを切り替えると、ドロワーメニュー内の表示内容だけが切り替わります。

「メニューを開く」をクリックするとドロワーメニューが表示されます。タブをクリックすると表示内容が切り替わり、「閉じる」ボタンまたは背景部分をクリックするとドロワーメニューを閉じます。

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

<!DOCTYPE html>
<html lang="ja">

<head>

  <!-- 文字コードをUTF-8に設定する -->
  <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="tab-drawer-menu_wrap">

    <!-- 案内エリアのタイトル -->
    <h1 class="tab-drawer-menu_title">
      タブ切り替え機能付きドロワーメニュー
    </h1>

    <!-- ドロワーメニューの説明文 -->
    <p class="tab-drawer-menu_text">
      タブを切り替えると、ドロワーメニュー内の表示内容だけが切り替わります。
    </p>

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

  </main>

  <!-- ドロワーメニュー表示時の背景 -->
  <div
    class="tab-drawer-menu_overlay"
    data-tab-drawer-overlay
    aria-hidden="true">

    <!-- ドロワーメニュー本体 -->
    <aside
      class="tab-drawer-menu_drawer"
      role="dialog"
      aria-modal="true"
      aria-label="タブ切り替え機能付きドロワーメニュー">

      <!-- タブボタンを並べるエリア -->
      <div
        class="basic-tab-switch_tabs"
        role="tablist"
        aria-label="ドロワーメニューの表示切り替え">

        <!-- 初期表示するメニュータブ -->
        <button
          class="basic-tab-switch_tab is-active"
          id="tab-menu"
          type="button"
          role="tab"
          aria-selected="true"
          aria-controls="panel-menu"
          data-tab="menu">
          メニュー
        </button>

        <!-- SNSタブ -->
        <button
          class="basic-tab-switch_tab"
          id="tab-sns"
          type="button"
          role="tab"
          aria-selected="false"
          aria-controls="panel-sns"
          data-tab="sns">
          SNS
        </button>

        <!-- 設定タブ -->
        <button
          class="basic-tab-switch_tab"
          id="tab-setting"
          type="button"
          role="tab"
          aria-selected="false"
          aria-controls="panel-setting"
          data-tab="setting">
          設定
        </button>

      </div>

      <!-- メニュータブに対応する表示内容 -->
      <div
        class="basic-tab-switch_panel is-active"
        id="panel-menu"
        role="tabpanel"
        aria-labelledby="tab-menu"
        data-panel="menu">

        <!--
          href属性の#をホームページのURLへ変更する
          「ホーム」を表示したいメニュー名へ変更できる
        -->
        <a href="#">ホーム</a>

        <!--
          href属性の#をサービスページのURLへ変更する
          「サービス」を表示したいメニュー名へ変更できる
        -->
        <a href="#">サービス</a>

        <!--
          href属性の#をお問い合わせページのURLへ変更する
          「お問い合わせ」を表示したいメニュー名へ変更できる
        -->
        <a href="#">お問い合わせ</a>

      </div>

      <!-- SNSタブに対応する表示内容 -->
      <div
        class="basic-tab-switch_panel"
        id="panel-sns"
        role="tabpanel"
        aria-labelledby="tab-sns"
        data-panel="sns">

        <!--
          href属性の#をXのURLへ変更する
          「X」を表示したいリンク名へ変更できる
        -->
        <a href="#">X</a>

        <!--
          href属性の#をInstagramのURLへ変更する
          「Instagram」を表示したいリンク名へ変更できる
        -->
        <a href="#">Instagram</a>

        <!--
          href属性の#をYouTubeのURLへ変更する
          「YouTube」を表示したいリンク名へ変更できる
        -->
        <a href="#">YouTube</a>

      </div>

      <!-- 設定タブに対応する表示内容 -->
      <div
        class="basic-tab-switch_panel"
        id="panel-setting"
        role="tabpanel"
        aria-labelledby="tab-setting"
        data-panel="setting">

        <!--
          href属性の#をプロフィールページのURLへ変更する
          「プロフィール」を表示したいメニュー名へ変更できる
        -->
        <a href="#">プロフィール</a>

        <!--
          href属性の#を通知設定ページのURLへ変更する
          「通知設定」を表示したいメニュー名へ変更できる
        -->
        <a href="#">通知設定</a>

        <!--
          href属性の#をログアウト先のURLへ変更する
          「ログアウト」を表示したいメニュー名へ変更できる
        -->
        <a href="#">ログアウト</a>

      </div>

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

    </aside>

  </div>

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

</body>

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

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでドロワーメニュー本体と「メニュー」「SNS」「設定」の3つのタブ、各タブに対応するリンクを作成し、CSSでドロワーメニュー・背景オーバーレイ・タブ・ボタンなどのデザインを設定します。JavaScriptではドロワーメニューの開閉と、クリックしたタブに対応する内容の切り替えを行います。

外部ライブラリや外部サービスは使用していません。メニュー内のリンク先はサンプル用としてhref="#"を設定しているため、実際に使用するときはホーム、サービス、お問い合わせ、X、Instagram、YouTube、プロフィール、通知設定、ログアウトなど、それぞれのリンク先URLへ変更してください。

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

各ファイルの役割
index.htmlは、ページの案内エリア、ドロワーメニューを開くボタン、背景オーバーレイ、ドロワーメニュー本体、タブ、各タブの表示内容、閉じるボタンを構成するファイルです。「メニュー」「SNS」「設定」のタブ名や、それぞれに表示するリンク名を変更できます。また、各リンクのhref="#"を実際に移動させたいページのURLへ変更します。

style.cssは、案内エリアや開閉ボタン、背景オーバーレイ、ドロワーメニュー、タブ、リンクなどの見た目を設定するファイルです。ドロワーメニューの横幅、背景色、余白、角丸、影、タブの色などを変更できます。@keyframes tab-drawer-menu-slideでは、ドロワーメニューが画面左側から表示されるアニメーションを設定しています。

script.jsは、ドロワーメニューとタブ切り替えの動作を設定するファイルです。「メニューを開く」をクリックすると背景オーバーレイへis-activeを追加してドロワーメニューを表示します。「閉じる」をクリックするか、ドロワーメニューの外側にある背景部分をクリックすると非表示になります。タブをクリックした場合は、選択中のタブと対応するパネルへis-activeを付け替えて表示内容を切り替えます。

設置方法・使い方
sampleフォルダを作成し、その中へindex.htmlstyle.cssscript.jsを同じ階層で配置します。index.htmlからstyle.cssscript.jsを読み込む構成になっているため、3ファイルを配置したあとsample/index.htmlをブラウザで開くと動作を確認できます。

ページに表示された「メニューを開く」ボタンをクリックすると、画面全体に半透明の背景が表示され、その左側からドロワーメニューが表示されます。初期状態では「メニュー」タブが選択されています。「SNS」または「設定」をクリックすると、ドロワーメニューを閉じることなく内部の表示内容だけが切り替わります。

実際のサイトで使用するときは、index.htmlにある各<a href="#">#を移動先のURLへ変更してください。たとえば「お問い合わせ」には実際のお問い合わせページ、「X」「Instagram」「YouTube」には利用する各ページのURLを設定します。このサンプルではURL取得のための外部サービスやAPIは使用していないため、APIキーやアクセストークンなどの設定は必要ありません。

カスタマイズできる内容
index.htmlでは、案内エリアのタイトルと説明文、「メニューを開く」「閉じる」のボタン文字、3つのタブ名、各タブ内に表示するリンク名とリンク先URLを変更できます。リンクを追加したい場合は、対応する.basic-tab-switch_panel内へ同じ形式の<a>要素を追加します。

style.cssでは、案内エリアやドロワーメニューの横幅、余白、背景色、文字色、枠線、角丸、影などを変更できます。.tab-drawer-menu_openでは開くボタン、.tab-drawer-menu_drawerではドロワーメニュー本体、.basic-tab-switch_tabではタブのデザインを調整できます。選択中のタブは.basic-tab-switch_tab.is-active、メニュー内のリンクは.basic-tab-switch_panel aでデザインを変更できます。

数値調整
style.css

max-width:700px;
ページ上部に表示する案内エリアの最大横幅です。値を大きくすると横に広がり、小さくすると狭くなります。

padding:32px;
案内エリアの内側余白です。値を大きくするとタイトルや説明文と外枠との間隔が広がります。

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

min-height:48px;
「メニューを開く」ボタンやタブ、閉じるボタンなどに設定している最小高さです。値を大きくすると対象となるボタンが高くなります。

background:rgba(0,0,0,.45);
ドロワーメニュー表示時に画面全体へ重ねる背景色です。.45が透明度を表しており、値を1へ近づけるほど背景が濃くなり、0へ近づけるほど透明になります。

width:360px;
PC表示時のドロワーメニューの横幅です。値を大きくするとメニューが横に広がり、小さくすると狭くなります。

max-width:90%;
ドロワーメニューが画面幅に対して広がりすぎないようにする最大横幅です。画面が狭くなった場合に、ドロワーメニューが画面内へ収まるようにします。

padding:24px;
ドロワーメニュー本体の内側余白です。値を大きくするとタブやリンクとドロワーメニュー端との間隔が広がります。

animation:tab-drawer-menu-slide .35s ease forwards;
ドロワーメニューを左側から表示するアニメーション時間です。.35sは0.35秒を表します。値を大きくするとゆっくり表示され、小さくすると速く表示されます。

margin-left:6px;
2つ目以降のタブに設定している左側の間隔です。値を大きくするとタブ同士の間隔が広がり、小さくすると狭くなります。

padding:18px;
各タブパネルの内側余白です。値を大きくするとリンクとパネルの枠との間隔が広がります。

margin:24px 0 0;
閉じるボタンの上側に設定している余白です。24pxを大きくするとタブパネルと閉じるボタンの間隔が広がります。

レスポンシブ対応
このサンプルはstyle.cssでレスポンシブ対応しています。案内エリアにはwidth:100%max-width:700px、ドロワーメニューにはwidth:360pxmax-width:90%を設定し、画面幅に応じて収まるようにしています。

さらに@media screen and (max-width:640px)を使用し、画面幅640px以下ではページの余白を24px 12px、案内エリアの内側余白を24px 18pxへ変更します。「メニューを開く」ボタンはwidth:100%になり、ドロワーメニューもwidth:100%max-width:100%によって画面幅いっぱいに表示されます。タブは左右の余白と文字サイズも小さい画面向けに調整されるため、スマートフォン・タブレット・PCで利用できます。


こちらもおすすめ


コメント