【CSS】【JavaScript】jQueryを使わずハンバーガーメニューを作りたい

CSS , JavaScript

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;

関連記事

Comments

  1. Taka より:

    * {
    margin: 0;
    padding: 0;
    }

    というリセットCSS的なものを使っているとメニューが閉じている時にも目に見えないメニューが押せてしまいます。共存させる解決法はありますでしょうか?

    • webmaster より:

      marginとpaddingのリセットであれば共存します。

      メニュー(classは.nav-list)は「display: none;」で非表示にしているので、それでも押せるということは、その押せるボタンに別な要因があると思われます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

関連記事