ハンバーガーボタンからドロワーメニューを開く方法
ハンバーガーボタンからドロワーメニューを開く方法を紹介します。このサンプルでは、SVGで作成した3本線のハンバーガーアイコンをボタン内に配置し、クリックすると画面左側からドロワーメニューがスライドして表示されます。メニューを常に画面へ表示せず、必要なときだけ開けるため、表示領域を有効に使いたいWebサイトやスマートフォン向けページに利用できます。
ヘッダーのナビゲーション、会員サイトのメニュー、管理画面のナビゲーションなど、複数のリンクをまとめて表示したい場面に適しています。ドロワーメニューを開くとページ側に半透明の背景が表示され、メニュー内の「閉じる」ボタンをクリックすると元の状態へ戻ります。半透明の背景をクリックしても閉じないため、閉じる操作はメニュー内のボタンに統一した構成です。
HTMLではSVGのハンバーガーアイコン、メニューの見出し、リンク、閉じるボタンを変更できます。CSSではハンバーガーボタンやSVGアイコンのサイズ、ドロワーメニューの横幅、余白、背景色、角丸、影、スライド速度などを調整できます。JavaScriptではis-activeクラスの追加と削除によってメニューと半透明背景の表示を切り替えます。画面幅640px以下では余白を小さくするため、スマートフォン・タブレット・PCで利用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
SVGで表示した3本線のハンバーガーボタンをクリックしてください。画面左側からドロワーメニューが表示されます。「閉じる」ボタンをクリックするとメニューが閉じます。半透明の背景をクリックしてもメニューは閉じません。
Q
他のアイコンを使いたい場合はどうするの?
コードをコピーして使おう!
<!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>
<!-- ハンバーガーボタンと説明をまとめるエリア -->
<div class="hamburger-drawer-menu_wrap">
<!-- タイトル -->
<div class="hamburger-drawer-menu_title">
ハンバーガーボタン
</div>
<!-- 説明文 -->
<p class="hamburger-drawer-menu_text">
3本線のボタンをクリックすると、左側からメニューが表示されます。
</p>
<!-- ドロワーメニューを開くボタン -->
<button class="hamburger-drawer-menu_open" type="button" aria-label="メニューを開く" data-hamburger-drawer-open="">
<!-- SVGで作成した3本線のハンバーガーアイコン -->
<svg
class="hamburger-drawer-menu_icon"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M4 6h16 M4 12h16 M4 18h16"
fill="none"
stroke="#ffffff"
stroke-width="2"
stroke-linecap="round"
></path>
</svg>
</button>
</div>
<!-- ドロワーメニュー表示時の半透明背景 -->
<div class="hamburger-drawer-menu_overlay" data-hamburger-drawer-overlay=""></div>
<!-- 左側から表示するドロワーメニュー -->
<div class="hamburger-drawer-menu_drawer" data-hamburger-drawer="" role="dialog" aria-modal="true" aria-labelledby="hamburger-drawer-menu-heading">
<!-- ドロワーメニューの見出し -->
<div class="hamburger-drawer-menu_heading" id="hamburger-drawer-menu-heading">
メニュー
</div>
<!-- ナビゲーションメニュー -->
<nav class="hamburger-drawer-menu_nav" aria-label="メインメニュー">
<a class="hamburger-drawer-menu_link" href="#">
ホーム
</a>
<a class="hamburger-drawer-menu_link" href="#">
サービス
</a>
<a class="hamburger-drawer-menu_link" href="#">
お問い合わせ
</a>
</nav>
<!-- ドロワーメニューを閉じるボタン -->
<button class="hamburger-drawer-menu_close" type="button" data-hamburger-drawer-close="">
閉じる
</button>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の外側余白を削除 */
padding:40px 20px; /* 上下40px・左右20px。値を大きくすると画面端との間隔が広がる */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の基本文字色 */
font-family:sans-serif; /* ページ全体で使用するフォント */
}
/* ハンバーガーボタンと説明をまとめるエリア */
.hamburger-drawer-menu_wrap{
width:100%; /* 画面幅に合わせて横幅を縮小 */
max-width:700px; /* 最大横幅。値を大きくすると全体が横に広がる */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置 */
padding:32px; /* 内側余白。値を大きくすると内容と枠線の間隔が広がる */
border:1px solid #e5e7eb; /* 枠線。1pxを大きくすると線が太くなる */
border-radius:18px; /* 角丸。値を大きくすると丸みが強くなる */
background:#f8fafc; /* 背景色 */
text-align:center; /* 内容を中央揃えにする */
box-sizing:border-box; /* paddingとborderを横幅へ含める */
}
/* タイトル */
.hamburger-drawer-menu_title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
color:#111827; /* 文字色 */
font-size:22px; /* 文字サイズ。値を大きくするとタイトルが大きくなる */
font-weight:700; /* 文字を太字にする */
}
/* 説明文 */
.hamburger-drawer-menu_text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくするとボタンとの間隔が広がる */
color:#4b5563; /* 文字色 */
line-height:1.8; /* 行間。値を大きくすると行間が広がる */
}
/* ドロワーメニューを開くボタン */
.hamburger-drawer-menu_open{
display:inline-flex; /* SVGアイコンを中央配置する */
width:48px; /* ボタンの横幅。値を大きくするとボタンが横に大きくなる */
height:48px; /* ボタンの高さ。値を大きくするとボタンが縦に大きくなる */
padding:0; /* ボタン内側の余白を削除 */
border:none; /* 枠線を非表示にする */
border-radius:8px; /* 角丸。値を大きくすると丸みが強くなる */
background:#2563eb; /* ボタンの背景色 */
align-items:center; /* SVGアイコンを上下中央に配置する */
justify-content:center; /* SVGアイコンを左右中央に配置する */
cursor:pointer; /* カーソルをポインターにする */
}
/* 開くボタンにマウスを重ねた状態 */
.hamburger-drawer-menu_open:hover{
background:#1d4ed8; /* ホバー時の背景色 */
}
/* ハンバーガーSVGアイコン */
.hamburger-drawer-menu_icon{
display:block; /* SVGをブロック要素として表示する */
width:24px; /* SVGアイコンの横幅。値を大きくするとアイコンが大きくなる */
height:24px; /* SVGアイコンの高さ。値を大きくするとアイコンが大きくなる */
}
/* ドロワーメニュー表示時の半透明背景 */
.hamburger-drawer-menu_overlay{
position:fixed; /* 画面全体に固定する */
inset:0; /* 上下左右を0にして画面全体へ広げる */
z-index:9998; /* 重なり順。値を大きくすると前面へ配置される */
background:rgba(15,23,42,.35); /* 半透明背景の色と透明度 */
opacity:0; /* 初期状態では透明にする */
visibility:hidden; /* 初期状態では非表示にする */
pointer-events:none; /* 非表示時の操作を無効にする */
transition:
opacity .3s ease,
visibility .3s ease;
/*
.3秒で表示状態を切り替える。
値を大きくすると遅くなり、小さくすると速くなる。
*/
}
/* 半透明背景を表示した状態 */
.hamburger-drawer-menu_overlay.is-active{
opacity:1; /* 背景を表示する */
visibility:visible; /* 表示状態にする */
pointer-events:auto; /* 表示中の操作を有効にする */
}
/* ドロワーメニュー */
.hamburger-drawer-menu_drawer{
position:fixed; /* 画面へ固定する */
top:0; /* 画面上端に配置する */
left:0; /* 画面左端に配置する */
z-index:9999; /* 半透明背景より前面に配置する */
width:320px; /* 横幅。値を大きくするとドロワーメニューが広くなる */
max-width:85%; /* 画面に対する最大横幅。値を大きくすると占める割合が増える */
height:100vh; /* 画面の高さ全体を使用する */
padding:32px 24px; /* 上下32px・左右24px。値を大きくすると内側余白が広がる */
overflow-y:auto; /* 内容が高さを超えた場合に縦スクロールを有効にする */
background:#ffffff; /* メニューの背景色 */
font-family:sans-serif; /* メニュー内で使用するフォント */
box-sizing:border-box; /* paddingを横幅と高さへ含める */
transform:translateX(calc(-100% - 40px)); /* 初期位置。40pxを大きくするとさらに左側へ隠れる */
visibility:hidden; /* 初期状態では非表示にする */
pointer-events:none; /* 非表示時の操作を無効にする */
transition:
transform .3s ease,
visibility .3s ease;
/*
.3秒でドロワーメニューを切り替える。
値を大きくするとゆっくり、小さくすると速く動く。
*/
}
/* ドロワーメニューを表示した状態 */
.hamburger-drawer-menu_drawer.is-active{
transform:translateX(0); /* 画面左端の表示位置へ移動する */
visibility:visible; /* 表示状態にする */
pointer-events:auto; /* メニュー内の操作を有効にする */
box-shadow:12px 0 30px rgba(15,23,42,.18); /* 12pxは横方向、30pxはぼかし。値を大きくすると影が広がる */
}
/* ドロワーメニューの見出し */
.hamburger-drawer-menu_heading{
margin:0 0 28px; /* 下側28pxの余白。値を大きくするとナビゲーションとの間隔が広がる */
color:#111827; /* 文字色 */
font-size:24px; /* 文字サイズ。値を大きくすると見出しが大きくなる */
font-weight:700; /* 文字を太字にする */
}
/* ナビゲーション */
.hamburger-drawer-menu_nav{
display:flex; /* メニュー項目をFlexboxで配置する */
margin:0 0 28px; /* 下側28pxの余白。値を大きくすると閉じるボタンとの間隔が広がる */
flex-direction:column; /* メニュー項目を縦方向へ並べる */
gap:10px; /* 項目間の間隔。値を大きくすると間隔が広がる */
}
/* 通常時・訪問済みのメニューリンク */
.hamburger-drawer-menu_link:link,
.hamburger-drawer-menu_link:visited{
display:block; /* リンク全体をクリックできるようにする */
padding:14px 16px; /* 上下14px・左右16px。値を大きくするとリンク内の余白が広がる */
border-radius:8px; /* 角丸。値を大きくすると丸みが強くなる */
background:#f1f5f9; /* 背景色 */
color:#111827; /* 文字色 */
font-weight:700; /* 文字を太字にする */
text-decoration:none; /* 下線を非表示にする */
}
/* 操作時のメニューリンク */
.hamburger-drawer-menu_link:hover,
.hamburger-drawer-menu_link:focus,
.hamburger-drawer-menu_link:active{
background:#e2e8f0; /* 操作時の背景色 */
color:#111827; /* 操作時の文字色 */
text-decoration:none; /* 操作時も下線を非表示にする */
}
/* 閉じるボタン */
.hamburger-drawer-menu_close{
width:100%; /* 横幅いっぱいに広げる */
padding:12px; /* 内側余白。値を大きくするとボタンが高くなる */
border:none; /* 枠線を非表示にする */
border-radius:8px; /* 角丸。値を大きくすると丸みが強くなる */
background:#2563eb; /* 背景色 */
color:#ffffff; /* 文字色 */
font-size:16px; /* 文字サイズ。値を大きくすると文字が大きくなる */
font-weight:700; /* 文字を太字にする */
cursor:pointer; /* カーソルをポインターにする */
}
/* 閉じるボタンにマウスを重ねた状態 */
.hamburger-drawer-menu_close:hover{
background:#1d4ed8; /* ホバー時の背景色 */
}
/* 画面幅640px以下 */
@media (max-width:640px){
/* ハンバーガーボタンエリア */
.hamburger-drawer-menu_wrap{
padding:24px 18px; /* 上下24px・左右18px。値を小さくすると狭い画面で内容領域が広くなる */
}
/* ドロワーメニュー */
.hamburger-drawer-menu_drawer{
padding:24px 18px; /* 上下24px・左右18px。値を小さくすると狭い画面で内容領域が広くなる */
}
}
// ドロワーメニューを開くボタンを取得
const hamburgerDrawerOpen=document.querySelector(
"[data-hamburger-drawer-open]"
);
// ドロワーメニューを閉じるボタンを取得
const hamburgerDrawerClose=document.querySelector(
"[data-hamburger-drawer-close]"
);
// ドロワーメニュー本体を取得
const hamburgerDrawer=document.querySelector(
"[data-hamburger-drawer]"
);
// 半透明背景を取得
const hamburgerDrawerOverlay=document.querySelector(
"[data-hamburger-drawer-overlay]"
);
// ドロワーメニューを開く処理
function openHamburgerDrawer(){
// ドロワーメニューを表示する
hamburgerDrawer.classList.add("is-active");
// 半透明背景を表示する
hamburgerDrawerOverlay.classList.add("is-active");
}
// ドロワーメニューを閉じる処理
function closeHamburgerDrawer(){
// ドロワーメニューを非表示にする
hamburgerDrawer.classList.remove("is-active");
// 半透明背景を非表示にする
hamburgerDrawerOverlay.classList.remove("is-active");
}
// ハンバーガーボタンをクリックしたときにメニューを開く
hamburgerDrawerOpen.addEventListener(
"click",
openHamburgerDrawer
);
// 閉じるボタンをクリックしたときにメニューを閉じる
hamburgerDrawerClose.addEventListener(
"click",
closeHamburgerDrawer
);
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
コードをコピーする場合
使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合
HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q
ダウンロードしたけど、これをネット上で動かすにはどうするの?
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではSVGの3本線アイコンを配置したハンバーガーボタンとドロワーメニューを作成し、CSSではメニューの位置、横幅、半透明背景、スライド表示などを設定します。JavaScriptではis-activeクラスを追加・削除してドロワーメニューと半透明背景の表示を切り替えます。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはハンバーガーボタンとドロワーメニューを構成するファイルです。SVGで作成した3本線のアイコン、メニューの見出し、ナビゲーションの文字とリンク先、閉じるボタンの文字を変更できます。
style.cssはハンバーガーボタン、SVGアイコン、半透明背景、ドロワーメニュー、ナビゲーション、閉じるボタンのデザインを設定するファイルです。サイズ、横幅、余白、色、角丸、影、スライド速度などを変更できます。
script.jsはドロワーメニューを開閉するファイルです。ハンバーガーボタンをクリックするとis-activeクラスを追加し、閉じるボタンをクリックするとクラスを削除します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。ハンバーガーボタンをクリックすると画面左側からドロワーメニューが表示され、「閉じる」ボタンをクリックすると非表示になります。
カスタマイズできる内容
index.htmlではSVGのハンバーガーアイコン、ドロワーメニューの見出し、「ホーム」「サービス」「お問い合わせ」の表示文字とリンク先、閉じるボタンの文字を変更できます。style.cssではハンバーガーボタンやSVGアイコンの大きさ、ドロワーメニューの横幅、背景色、余白、メニューリンクの色や角丸、影、スライド速度などを変更できます。
数値調整
style.css
max-width:700px;
ハンバーガーボタンを配置するエリアの最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
padding:32px;
ハンバーガーボタンを配置するエリアの内側余白です。値を大きくすると内容と枠線の間隔が広がります。
width:48px;・height:48px;
ハンバーガーボタンの大きさです。値を大きくするとボタンが大きくなり、小さくするとコンパクトになります。
width:24px;・height:24px;
SVGアイコンの表示サイズです。値を大きくすると3本線のアイコンが大きく表示されます。
width:320px;
ドロワーメニューの横幅です。値を大きくするとメニューが広くなり、小さくすると狭くなります。
max-width:85%;
画面幅に対するドロワーメニューの最大横幅です。値を大きくすると画面を覆う割合が増え、小さくすると表示幅が狭くなります。
padding:32px 24px;
ドロワーメニューの内側余白です。上下の32pxと左右の24pxを変更すると、メニュー内の余白を調整できます。
transition:.3s;
半透明背景とドロワーメニューの切り替え時間です。.3秒で変化します。値を大きくするとゆっくり、小さくすると速く切り替わります。
gap:10px;
ナビゲーション項目同士の間隔です。値を大きくすると項目間が広がり、小さくすると狭くなります。
box-shadow:12px 0 30px ...
表示中のドロワーメニューへ付ける影です。12pxは横方向の位置、30pxはぼかしの大きさで、値を変更すると影の位置や広がりを調整できます。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxによってハンバーガーボタンを配置するエリアが画面幅に合わせて縮小されます。ドロワーメニューにはmax-width:85%を指定しているため、狭い画面でも画面幅に合わせて表示されます。また、640px以下ではエリアとドロワーメニューの余白を24px 18pxへ変更しているため、スマートフォン・タブレット・PCで利用できます。
コメント