フォルダ:responsive_sample_02
ハンバーガーメニューとは…
(ハンバーガーボタン・ハンバーガーナビゲーション)
ナビゲーションを格納しているメニューボタンです。スマートフォンのようにスペースが限られた画面の中で、メニュー表示をするために使われるようになりました。
横3本線で表現されることが多く、「バンズ・パテ・バンズ」が重なった形に見えることから「ハンバーガー」と呼ばれています。
様々な実装方法がありますが、ここでは、CSSのみで実現できる、チェックボックスを利用した方法を紹介します。原理を理解しておけば、他のデザインのボタンも活用しやすくなります。
formのチェックボックスを利用したメニュー
- チェックがないとき…メニューは開かれていない
- チェックがあるとき…メニューは開かれている
チェックボックスの設置方法については、HTMLの資料ページで触れています
準備
- responsive_sample_02という名前でフォルダを作成します。
- responsive_sample_01の完成時のHTML・CSSをそのまま使い、追記・修正します
①チェックボックスを設置します
▼index.htmlへの追記
<header>
<h1>Site Title</h1>
<input type="checkbox" id="navBtn">
<label for="navBtn" class="open"></label>
<nav>
<!--中略-->
②チェックの有無で、メニューの表示・非表示が切り替えられるようにします
▼style.cssへの追記(@media
より前に追記)
nav {
display: none;
}
#navBtn:checked ~ nav {
display: block;
}
~
は、これ以降にあるセレクタに対して有効になるという意味です。
ここでは、チェックボックスにcheckが入っている(checked
の状態)ときの、nav
に対して有効、という意味になります。
③ボタンの位置を固定します
▼index.htmlへの追記
<input type="checkbox" id="navBtn">
<label for="navBtn" class="open">menu</label>
次の工程で、チェックボックスが見えなくなるので、位置の確認用に文字を入れておきます。
▼style.cssへの追記(@media
より前に追記)
header {
position: relative;
}
/*中略*/
#navBtn {
display: none;
}
.open {
cursor: pointer;
position: absolute;
top: 10px;
right: 10px;
display: block;
}
④ハンバーガーボタンを作ります
▼index.htmlへの追記
<input type="checkbox" id="navBtn">
<label for="navBtn" class="open"><span></span></label>
先ほど入力した文字の代わりに<span>を挿入します。
<span></span>の部分は、ハンバーガーボタンを作るときに使う部分です。
※<span>は、グループを作るタグの一種です
▼style.cssへの追記
.open {
cursor: pointer;
position: absolute;
top: 10px;
right: 10px;
display: block;
z-index: 100;
width: 40px;
height: 40px;
border: 1px solid #CCC;
border-radius: 2px;
}
/*humburger button*/
.open::before,
.open::after {
content: "";
}
.open span,
.open::before,
.open::after {
content: "";
position: absolute;
top: 18px;
left: 30%;
width: 40%;
border-bottom: 2px solid #333;
}
.open::before {
transform: translateY(-8px);
}
.open::after {
transform: translateY(8px);
}
/*close button*/
#navBtn:checked + .open {
background: #555;
}
#navBtn:checked + .open span {
transform: scaleX(0);
}
#navBtn:checked + .open::before {
transform: rotate(45deg);
}
#navBtn:checked + .open::after {
transform: rotate(-45deg);
}
⑤ボタンへのアニメーション追加(三本線→×印へのアニメーション)
transitionを使い、アニメーション効果を追加します
▼style.cssへの追記
.open span,
.open::before,
.open::after {
content: "";
position: absolute;
top: 18px;
left: 30%;
width: 40%;
border-bottom: 2px solid #333;
transition: transform .5s;
}
⑥画面幅が広いとき(コンピュータ表示)はハンバーガーボタンを非表示にし、ナビゲーションが常に見えている状態にする
▼style.cssへの追記
@media all and (min-width: 1025px) {
nav {
display: block;
}
#navBtn,
.open {
display: none;
}
@media all and (min-width: 1025px) {
より下の位置に追加するようにします。
作例では話をシンプルにするために、簡略化したコードを使用しています。興味がある人は、ほかの作成方法も調べてみてください。(「ハンバーガーボタン CSS」などの語で検索)
- 作成例:https://ngsm-syr.github.io/responsive_sample_02a/
- コード:https://github.com/ngsm-syr/responsive_sample_02a
【応用】ナビゲーションが横からスライドしてくるようにする
ナビゲーションの位置を変更し、横からスライドしてくるアニメーションを追加する例です。
①ナビゲーションを画面欄外(右端)に移動させ、ボタンクリック時に左側にスライドするようにします
▼style.cssへの追記・修正
#wrap {
display: flex;
flex-direction: column;
min-height: 100vh;
overflow: hidden;
}
/*中略*/
nav {
/* display: none; */
height: 100vh;
width: 300px;
position: absolute;
top: 0;
right: -300px;
z-index: 50;
background-color: rgba(0, 0, 0, .5);
transition: transform .5s;
}
#navBtn:checked ~ nav {
display: block;
transform: translateX(-300px);
}
/*中略*/
nav ul li {
/* display: inline-block; */
margin: 0 10px;
padding: 10px 0;
}
②コンピュータ表示時は、ナビゲーションがもとの位置に表示されるようにします。
@media all and (min-width: 1025px) {
nav {
display: block;
height: auto;
width: 100%;
position: static;
background-color: transparent;
}
nav ul li {
display: inline-block;
}
@media all and (min-width: 1025px) {
より下の位置に追加するようにします。
③ハンバーガーボタンの色やナビゲーション内の文字色を変更し、表示を整えます。
#navBtn:checked + .open span,
#navBtn:checked + .open::before,
#navBtn:checked + .open::after {
border-bottom-color: #EEE;
}
/*中略*/
nav ul li a {
text-decoration: none;
font-weight: bold;
color: #EEE;
}
@media all and (min-width: 1025px) {
/*中略*/
nav ul li a {
color: #333;
}
- 作成例:https://ngsm-syr.github.io/responsive_sample_02b/
- コード:https://github.com/ngsm-syr/responsive_sample_02b
参考リンク