CSSとJavaScriptでハンバーガーメニューを作成する例を紹介します。JavaScriptを使いますが、jQueryなどのライブラリは使いません。いろいろな案件に携わっているとjQuery使用禁止!なんてこともあったりします。
サンプルではFontAwesomeのアイコンフォントを使っています。
HTML
ナビゲーション部分はボタンとメニューのシンプル構成です。「ul#nav-list」部分が開閉メニューのクラスになります。
<nav class="hamburger-nav">
<button type="button" id="nav-toggle" class="nav-toggle-button"></button>
<ul id="nav-list" class="nav-list close">
<li><a href="">HOME</a></li>
<li><a href="">INFORMATION</a></li>
<li><a href="">PRODUCTS</a></li>
<li><a href="">ABOUT</a></li>
<li><a href="">INQUIRY</a></li>
</ul>
</nav><!-- /.hamburger-nav -->
CSS
次にCSS部分です。メニュー開閉時のアニメーションはCSSで行っています。
/*---------------------------------------------
Hamburger Nav
---------------------------------------------*/
.hamburger-nav {
margin-top: 1.5em;
width: 30px;
text-align: right;
}
.nav-list {
display: none;
position: absolute;
top: 0;
left: 0;
z-index: -1;
width: 100%;
height: 100vh;
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 60px 0 30px;
background: rgba(0, 0, 0, 0.95);
text-align: center;
}
.nav-list > li a {
display: block;
padding: 10px 1em;
text-decoration: none;
color: white;
}
.nav-list.open {
display: block;
z-index: 1;
animation: showAni .5s ease 0s 1 normal;
}
@keyframes showAni {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.nav-list.close {
display: block;
opacity: 0;
animation: hideAni .5s ease 0s 1 normal;
}
@keyframes hideAni {
0% {
opacity: 1;
z-index: 1;
}
100% {
opacity: 0;
z-index: -1;
}
}
.nav-toggle-button {
position: relative;
z-index: 2;
cursor: pointer;
}
.nav-toggle-button.close::before, .nav-toggle-button.open::before {
font-family: 'FontAwesome';
}
.nav-toggle-button.close::before {
content: '\f0c9';
}
.nav-toggle-button.open::before {
content: '\f00d';
}
JavaScript
最後にJavaScriptです。jQueryが使えるならばそちらの方が断然短く記述できます。
// jQuery無しでナビゲーションを開閉する関数
function navToggle() {
// 開閉ボタンを取得
var toggleBtn = document.getElementById('nav-toggle');
// 開閉するナビゲーション本体を取得
var navView = document.getElementById('nav-list');
// 開閉ボタンの現在のクラスを取得
var toggleBtnClass = toggleBtn.getAttribute('class');
// 開閉ボタンのクラスで条件分岐
// 1. 開閉ボタンのクラスが「close」だったら
if(toggleBtnClass == 'nav-toggle-button close') {
// 閉じている状態のクラスを削除
toggleBtn.classList.remove('close');
navView.classList.remove('close');
// 開いている状態のクラスを付与
toggleBtn.classList.add('open');
navView.classList.add('open');
}
// 2. 開閉ボタンのクラスが「open」だったら
else {
// 開いている状態のクラスを削除
toggleBtn.classList.remove('open');
navView.classList.remove('open');
// 閉じている状態のクラスを付与
toggleBtn.classList.add('close');
navView.classList.add('close');
}
}
// 指定IDをクリックした際に関数を実行
document.getElementById('nav-toggle').onclick = navToggle;
* {
margin: 0;
padding: 0;
}
というリセットCSS的なものを使っているとメニューが閉じている時にも目に見えないメニューが押せてしまいます。共存させる解決法はありますでしょうか?
marginとpaddingのリセットであれば共存します。
メニュー(classは.nav-list)は「display: none;」で非表示にしているので、それでも押せるということは、その押せるボタンに別な要因があると思われます。