ハンバーガーメニューとは…
(ハンバーガーボタン・ハンバーガーナビゲーション)
ナビゲーションを格納しているボタンです。スマートフォンのようにスペースが限られた画面の中で、メニュー表示をするために使われるようになりました。
横3本線で表現されることが多く、「バンズ・パテ・バンズ」が重なった形に見えることから「ハンバーガー」と呼ばれています。
JavaScriptのtoggleを使った仕組み
toggleとは一つのボタン1つでオン・オフを切り替える機能のことです。ここでは、ボタン操作時に、クラス名を付けたり、外したりすることでナビゲーションの開閉を行います。transition効果(遷移のアニメーション)などはCSS側で制御します。
- クリック(タップ)すると、
.openクラスを追加 - もう一度クリック(タップ)すると、
.openクラスを取り除く
準備
- javascript_menuという名前でフォルダを作成します。
- レスポンシブデザインの完成時のHTML・CSSをそのまま使い、追記・修正します
- script.jsを新たに作成し、
<head>に次のコードを追加します。
<!--中略-->
<link rel="stylesheet" href="style.css">
<script src="script.js" defer></script>
</head>
<body>
<!--中略-->
①ボタンを設置します。
仕組みを単純にするためにボタンは記号で作成します。
また、<nav>に対して、クラス名とID名を追加します。
▼index.htmlへの追記
<header>
<h1>Site Title</h1>
<button class="menu-btn" id="js-btn">
<span class="icon-open">≡</span>
<span class="icon-close">×</span>
</button>
<nav class="nav-menu" id="js-nav">
<!--中略-->
②ボタン操作で、メニューの表示・非表示が切り替えられるように、クラス名の付け外しの設定をします。開発モードで確認するとクラス名が付いたり、外れたりする様子 が確認できます。
▼script.jsへの追記
// JavaScript
console.log("読み込みOK");
const btn = document.querySelector('#js-btn');
const nav = document.querySelector('#js-nav');
// ボタンがクリックされたら、両方に「open」クラスをつけ外しする
btn.addEventListener('click', function() {
btn.classList.toggle('open');
nav.classList.toggle('open');
});
③ボタンを設置します。
▼style.cssへの追記
header {
position: relative;
}
header h1 {
/*中略*/
}
#js-btn {
cursor: pointer;
position: absolute;
top: 10px;
right: 10px;
z-index: 100;
width: 40px;
height: 40px;
border: 1px solid #CCC;
border-radius: 2px;
background: transparent;
font-size: 2rem;
line-height: 1;
padding: 0;
}
/*位置調整*/
#js-btn span {
position: relative;
top: -2px;
left: 0;
}
④記号が切り替わるようにします。
.openクラスがついているときに、≡ を非表示にし、代わりに × が見えるようにしています。
▼style.cssへの追記(上記コードの続きに挿入)
.icon-close {
display: none;
}
#js-btn.open .icon-open {
display: none;
}
#js-btn.open .icon-close {
display: inline;
}
⑤ボタン開閉時のメニュー位置を変更します。
この状態で右方向にスクロールしてみてください。表側から見えなくなったナビゲーションがサイトの欄外に表示されていることがわかります。ボタンを操作したときに、欄外からサイト内側へ移動する仕組みになります。
▼style.cssへの追記
.nav-menu {
height: 100vh;
width: 300px;
position: absolute;
top: 0;
right: -300px;
z-index: 50;
background-color: rgba(0, 0, 0, .5);
transition: transform .5s;
}
.nav-menu.open {
transform: translateX(-300px);
}
⑥欄外に移動したナビゲーションを表示にします。
はみ出した要素を非表示にするため、#wrapに次のコードを追加します。
#wrap {
display: flex;
flex-direction: column;
min-height: 100vh;
overflow: hidden;
}
⑦ナビゲーション内の項目を縦表示にし、文字色を変更します。
今回のクラス名に合わせてセレクタ名を、nav→.nav-menu に変更します。
▼style.cssへの追記
.nav-menu ul {
list-style: none;
padding-bottom: 1rem;
text-align: center;
}
.nav-menu ul li {
/* display: inline-block; */
margin: 0 10px;
padding: 10px 0;
}
.nav-menu ul li a {
text-decoration: none;
font-weight: bold;
color: #FFF;
}
⑧画面幅が広い状態(コンピュータでの表示時)で、ハンバーガーボタンを非表示にし、ナビゲーションが常に見えている状態にします
▼style.cssへの追記
@media all and (min-width: 1025px) {
#js-btn {
display: none;
}
.nav-menu {
display: block;
height: auto;
width: 100%;
position: static;
background-color: transparent;
}
.nav-menu ul li {
display: inline-block;
padding: 0;
}
.nav-menu ul li a {
color: #333;
}
@media all and (min-width: 1025px) { より下の位置に追加するようにします。
- 作成例:https://ngsm-syr.github.io/javascript_menu_01/
- コード:https://github.com/ngsm-syr/javascript_menu_01
おまけ:iconを置き換える
ボタン部分を別のアイコンに置き換えることも可能です。CSSのみでボタンを作成すれば、三本線から×へと変化するアニメーション効果をつけることもできます。
▼三本線から×へと変化するボタン
- 作成例:https://ngsm-syr.github.io/javascript_menu_02/
- コード:https://github.com/ngsm-syr/javascript_menu_02
参考リンク