アコーディオン付きドロワーメニューを作る方法
アコーディオン付きドロワーメニューを作る方法を紹介します。メニューを開くと親メニューが一覧表示され、クリックすると子メニューが展開されるサンプルです。限られたスペースでも多くのメニューを整理して表示できるため、スマートフォン向けのナビゲーションにも適しています。
このサンプルでは、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:380pxとmax-width:92%を設定しているため、画面幅が狭くなるとドロワーメニューも画面内へ収まるように縮小されます。
画面幅640px以下では、ページ全体の余白を24px 16px、操作エリアをpadding:24px 18px、ドロワーメニューをpadding:24px 18pxへ変更しています。スマートフォン・タブレット・PCの画面幅に合わせてアコーディオン付きドロワーメニューを利用できます。
コメント