はじめに
メニューアイコンの中ではハンバーガーメニューが有名だと思いますが、その他にもいろいろな種類があって、それぞれに名前もつけられています。
本記事では、ハンバーガーメニューの次に比較的よく使われているであろうベントーメニューの実装方法について説明します(クリックしたときのいい感じのアニメーションについても説明します)。
なお、メニューアイコン(ハンバーガーメニュー)の基本的な実装方法については以下の記事で詳しく説明しています。
サンプル
右上のベントーメニューをクリックすると、9つのドットが回転しつつバツマークに変化します。
実装
HTML
JavaScriptを使わずにメニューアイコンを実装するにはチェックボックスを使います。
9つのドットはそのままdiv
タグを9つ並べています。この他にも#dots-wrap
で囲んだり、3つごとに.dots-row
で囲んだり、様々な方法があるかと思いますので、ご自分の好きなように並べてください。
<header>
<input id="navi" type="checkbox" />
<label for="navi">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
<div class="dots">
</label>
</header>
CSS
CSSは少し長いので、label
(9つのドット)と#navi
(クリック時のアニメーション)に分けて説明します。
SCSS
header {
width: 100%;
height: 80px;
#navi {
display: none;
&:checked {
~ label {
transform: rotate(225deg);
.dots:nth-of-type(1) { filter: opacity(0); }
.dots:nth-of-type(2) { transform: scaleY(4.75); }
.dots:nth-of-type(3) { filter: opacity(0); }
.dots:nth-of-type(4) { transform: scaleX(4.75); }
.dots:nth-of-type(5) { filter: opacity(0); }
.dots:nth-of-type(6) { transform: scaleX(4.75); }
.dots:nth-of-type(7) { filter: opacity(0); }
.dots:nth-of-type(8) { transform: scaleY(4.75); }
.dots:nth-of-type(9) { filter: opacity(0); }
}
}
}
label {
cursor: pointer;
position: fixed;
top: 32px;
right: 32px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
width: 26px;
height: 26px;
transition: .5s;
.dots {
width: 6px;
height: 6px;
background-color: black;
transition: .5s;
&:nth-of-type(3n+2) {
margin: 0 4px;
}
&:nth-of-type(2) { transform-origin: top; }
&:nth-of-type(4) { transform-origin: left; }
&:nth-of-type(6) { transform-origin: right; }
&:nth-of-type(8) { transform-origin: bottom; }
}
}
}
9つのドット
SCSS
label {
cursor: pointer;
position: fixed;
top: 32px;
right: 32px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
width: 26px;
height: 26px;
transition: .5s;
.dots {
width: 6px;
height: 6px;
background-color: black;
transition: .5s;
&:nth-of-type(3n+2) {
margin: 0 4px;
}
&:nth-of-type(2) { transform-origin: top; }
&:nth-of-type(4) { transform-origin: left; }
&:nth-of-type(6) { transform-origin: right; }
&:nth-of-type(8) { transform-origin: bottom; }
}
}
まず、9つのドットを囲むlabel
の横幅および縦幅は「ドットの大きさ×3+ドット間の余白×2」の値にします。例えば、ドットの大きさが6px
でドット間の余白が4px
の場合、6×3+4×2=26が横幅および縦幅になります。ドットの大きさやドット間の余白を変更する場合はlabel
の大きさも調節してください。
また、label
をフレックスボックスにし、justify-content
とalign-content
をspace-between
に設定することで、9つのドットが均等に配置されるようにしています。
左上から数えて2,4,6,8番目のドットはアイコンクリック時のアニメーションで変化させるので、それぞれtransform-origin
の値を設定しておきます。
クリック時のアニメーション
SCSS
#navi {
display: none;
&:checked {
~ label {
transform: rotate(225deg);
.dots:nth-of-type(1) { filter: opacity(0); }
.dots:nth-of-type(2) { transform: scaleY(4.75); }
.dots:nth-of-type(3) { filter: opacity(0); }
.dots:nth-of-type(4) { transform: scaleX(4.75); }
.dots:nth-of-type(5) { filter: opacity(0); }
.dots:nth-of-type(6) { transform: scaleX(4.75); }
.dots:nth-of-type(7) { filter: opacity(0); }
.dots:nth-of-type(8) { transform: scaleY(4.75); }
.dots:nth-of-type(9) { filter: opacity(0); }
}
}
}
ベントーメニューのアイコンをクリックするとチェックボックスのチェック状態が切り替わります。チェックボックスの:checked
にスタイルを設定することでアイコンクリック時にアニメーションを設定することができます。
設定するアニメーションは以下の通りです。
- 全体(
label
)を225°回転させる - 奇数番目のドット(
.dots:nth-of-type(1,3,5,7,9)
)を透明にする - 偶数番目のドット(
.dots:nth-of-type(2,4,6,8)
)を中央へ拡張する
ベントーメニューのクリック時のアニメーションは様々な種類があります。本記事の内容を参考にしていろいろなアニメーションを試していただければと思います。
まとめ
ベントーメニューとは日本語の「弁当」から来ているのでしょうね。四角い弁当箱におかずが詰め込まれている様子によく似ています。外国には日本のような弁当文化がないので、外国でも日本語の「弁当」という言葉が定着していることが伺えます。
本記事の内容を参考にして、ベントーメニューを実装していただければと思います。