jQueryを使わない生のjavascriptでハンバーガーメニューを実装する方法を紹介します。生のjavascriptはVanillaJS(バニラJS)やPureJS(ピュアJS)ともいいます。この方法で実装できるとjQueryが裏側でどんな処理を行っているのかわかり、より応用の効くプログラムが書けるようになります。長く使えるプログラムですので、コピペ用にブックマークしておいてください。
ハンバーガーメニューの完成デモ
まずはハンバーガーメニューのデモになります。HTMLとCSSとJavaScriptで実装しています。デモのボタンをクリックするとメニューが開き、もう一度押すとメニューが閉じます。スマホサイトでは頻出する定番のUIになります。
See the Pen 最もシンプルなハンバーガーメニュー実装方法01 by YutoSeta / ホームページ制作のエクレア (@yutoseta) on CodePen.
javascriptの実装内容を解説
当たり前の話で恐縮ですが、今回はjQueryではなくjavascriptそのものですので、scriptタグに直接プログラムを書いていけば、jQueryを読み込む必要はありません。
まずは、HTMLやCSSは無視してJavaScriptのコードのみご覧ください。
ハンバーガーメニューのデモとして実際に使用しているコードになります。
document.querySelector('.menu-btn').addEventListener('click', function(){
document.querySelector('.menu').classList.toggle('is-active');
});
addEventListenerメソッドはユーザーの操作を検知して、なんらかの処理を実行します。今回は、「.menu-btn」要素をクリック(click)したときに、「.menu」の要素のクラス一覧(classList)からtoggleメソッドによって「is-active」というクラスの付け外しをしています。is-activeがついている時はメニューが開いている状態、付いていない時はメニューが閉じている状態です。
つまりは、addEventListenerメソッドとtoggleメソッドの組み合わせでクリックで指定の要素にis-activeクラスの付け替えをしています。
JavaScriptとCSSの役割分担をしよう
今回のプログラムでは、メニューボタン(.menu-btn)をクリックしたら、メニュークラス(.menu)に任意のクラス(.is-active)の付け替えを行う、という処理しかJavaScriptには記述していません。クラスの付け替えのみでメニューの閉じ開きを実現しています。この付け替えするクラス「is-active」はメニューがアクティブな状態(開いている)とそうでない状態(閉じている)を表現するためのクラスになっています。HTMLとCSSが中心のウェブサイトでは、このようにしてJavaScriptはなるべくクラスの付け替えだけで実現してあげるとプログラムがシンプルになります。
さて、.menuにis-activeというクラスが付け替えられているわけですが、ここでCSSをみてみましょう。以下の部分がクラスの付け替えによって書き換えられるスタイル部分です。
/*----------------------------
* アニメーション部分
*----------------------------*/
/* アニメーション前のメニューの状態 */
.menu{
transform: translateX(100vw);
transition: all .3s linear;
}
/* アニメーション後のメニューの状態 */
.menu.is-active{
transform: translateX(0);
}
transitionでは、アニメーション前のメニューの状態とアニメーション後のメニューの状態を0.3秒間かけて一定のスピード(linear)で変化させることでアニメーションを実現しています。
アニメーション前のメニューの状態(is-activeクラスが付いていないとき)はtransform:translateX(100vw);
で右に画面幅(100vw)分だけずらしています。これでメニューを閉じている時の位置にしています。
アニメーション後のメニューの状態(is-activeクラスがついているとき)はtransform:translateX(0);
として右にずれた分を元に戻しています。これでメニューを開いている時の位置にしています。
CSSでアニメーション前のメニューとアニメーション後のメニューを定義して、javascriptのクラスの付け替えでその状態を変化させる。というのがシンプルにハンバーガーメニューを実装するポイントです。
いろいろなメニュー開閉アニメーション
See the Pen 最もシンプルなハンバーガーメニュー実装方法01 by YutoSeta / ホームページ制作のエクレア (@yutoseta) on CodePen.
/* アニメーション前のメニューの状態 */
.menu{
transform: translateX(100vw);
transition: all .3s linear;
}
/* アニメーション後のメニューの状態 */
.menu.is-active{
transform: translateX(0);
}
See the Pen 最もシンプルなハンバーガーメニュー実装方法02 by YutoSeta / ホームページ制作のエクレア (@yutoseta) on CodePen.
/* アニメーション前のメニューの状態 */
.menu{
pointer-events: none;
opacity: 0;
transition: opacity .3s linear;
}
/* アニメーション後のメニューの状態 */
.menu.is-active{
pointer-events: auto;
opacity: 1;
}
/* アニメーション前のメニューの状態 */
.menu{
transform-origin: top left;
transform: rotateZ(-90deg);
transition: all .3s ease;
}
/* アニメーション後のメニューの状態 */
.menu.is-active{
transform: rotateZ(0deg);
}
See the Pen 最もシンプルなハンバーガーメニュー実装方法04 by YutoSeta / ホームページ制作のエクレア (@yutoseta) on CodePen.
/* アニメーション前のメニューの状態 */
.menu{
pointer-events: none;
opacity: 0;
transform-origin: center;
transform: scale(.5);
transition: all .3s ease;
}
/* アニメーション後のメニューの状態 */
.menu.is-active{
pointer-events: auto;
opacity: 1;
transform: scale(1.0);
}
まとめ
今回のような記述をすることでハンバーガーメニューの実装が3行になったように、javascriptの記述量を大幅に減らすことができます。タブメニューやアコーディオンメニュー、プルダウンメニュー、ありとあらゆる動きを伴うUIパーツはこのようなクラスの付け替えのみで再現できるのです。
ユーザーのアクション(イベント)によってコンポーネントの状態を切り替える。コンポーネントの状態が変わることで見た目も変わる。この考え方は昨今のjavascriptフレームワークで用いるコンポーネント指向と同じです。ぜひ、活用していってください。
jQueryを使った実装方法はこの記事を参考にしてください
