見出し画像

【web】ハンバーガーメニュー2(js)

こんにちは、つちだにんじんです。
前回はcssのみでのハンバーガーメニューを作成しましたので、今回はjsを使用してハンバーガーメニューを作成します。

作り方的に、あまり大差ないです(笑)

jsを使用してハンバーガーメニューを作成する


結論から言うと作りはこんな感じです。↓

<!-- html -->

<div class="hamburger" id="hamburger">
    <span></span>
    <span></span>
    <span></span>
  </div>

  <!-- ナビゲーションメニュー -->
  <nav class="nav-menu" id="navMenu">
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Services</a></li>
      <li><a href="#">Contact</a></li>
    </ul>
  </nav>
/* css */

*{
  font-family: Arial, sans-serif;
}
.hamburger{
  display: flex;
  flex-direction: column;
  cursor: pointer;
  width: 30px;
  margin: 20px 20px 20px auto;  
}
.hamburger span{
  height: 4px;
  background-color: #257180;
  margin: 4px 0;
  width: 100%;
  transition: 0.4s;
}
.nav-menu{
  display: none; /* デフォルトでは非表示 */
  background-color: #257180;
  position: absolute;
  top: 70px;
  right: 0px;
  width: 50%;
  padding: 20px 3%;
}
.nav-menu ul{
  list-style-type: none;
  margin: 0;
  padding: 0;
}
.nav-menu ul li:not(:last-child){
  border-bottom: 1px solid #fff;
}
.nav-menu ul li a{
  color: #fff;
  text-decoration: none;
  display: block;
  padding: 20px 0;
}
.nav-menu ul li a:hover{
  color: #FD8B51;
}
/* メニューがアクティブなときのスタイル */
.nav-menu.active{
  display: block;
}
/* .changeがついた時のスタイル */
.change span:nth-of-type(2){
  opacity: 0;  
}
.change span:nth-of-type(1){
  transform: rotate(45deg) translateY(7px) translateX(9px);
}
.change span:nth-of-type(3){
  transform: rotate(-45deg) translateY(-10px) translateX(10px);
}
// js

// hamburgerとnavMenuを取得

const hamburger = document.getElementById('hamburger');
const navMenu = document.getElementById('navMenu');

hamburger.addEventListener('click', () => {  // hamburgerをクリックしたら
  navMenu.classList.toggle('active');    // メニューの表示切り替え
  hamburger.classList.toggle('change');  // アイコンのスタイル変更用クラス
});

こんな感じです。
前回も書きましたが、見る人側の環境でjsをブロックしていると作動できないです。

HTML

まずはHTMLでのマークアップです。
前回はcssのみで作成するため、チェックボックスを使用して作りましたが、今回はクリック動作の判定をjsで行うのでチェックボックスは不要です。

<!-- 三本線 -->
<div class="hamburger" id="hamburger">
    <span></span>
    <span></span>
    <span></span>
  </div>

  <!-- ナビゲーションメニュー -->
  <nav class="nav-menu" id="navMenu">
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Services</a></li>
      <li><a href="#">Contact</a></li>
    </ul>
  </nav>

cssのみの時に比べると、htmlは説明不要なくらいとてもシンプルになりました。

id名をつけているのは、jsでid名を取得させているためです。
ちなみにclass名を取得したい場合は

// js
const elements = document.getElementsByClassName('クラス名');

jsはこう書いてください。

CSS

.hamburger{
  display: flex;
  flex-direction: column;
  cursor: pointer;
  width: 30px;
  margin: 20px 20px 20px auto;  
}
.hamburger span{
  height: 4px;
  background-color: #257180;
  margin: 4px 0;
  width: 100%;
  transition: 0.4s;
}
.nav-menu{
  display: none; /* デフォルトでは非表示 */
  background-color: #257180;
  position: absolute;
  top: 70px;
  right: 0px;
  width: 50%;
  padding: 20px 3%;
}
.nav-menu ul{
  list-style-type: none;
  margin: 0;
  padding: 0;
}
.nav-menu ul li:not(:last-child){
  border-bottom: 1px solid #fff;
}
.nav-menu ul li a{
  color: #fff;
  text-decoration: none;
  display: block;
  padding: 20px 0;
}
.nav-menu ul li a:hover{
  color: #FD8B51;
}
/* メニューがアクティブなときのスタイル */
.nav-menu.active{
  display: block;
}
/* .changeクラス */
.change span:nth-of-type(2){
  opacity: 0;  
}
.change span:nth-of-type(1){
  transform: rotate(45deg) translateY(7px) translateX(9px);
}
.change span:nth-of-type(3){
  transform: rotate(-45deg) translateY(-10px) translateX(10px);
}

面倒になったのでスタイルもとてもシンプルにしてあります。

.nav-menu.active{ display: block; }は、「デフォルトでは非表示」とある部分でdisplay: none;で非表示にしているのを解除するためです。
jsでクリックしたら.changeクラスが付与されるように指定したので、その.changeに対して三本線の動きをつけています。

JavaScript

最後はjsです。
これも複雑ではなくシンプルなものです。

const hamburger = document.getElementById('hamburger');
const navMenu = document.getElementById('navMenu');

hamburger.addEventListener('click', () => {
  navMenu.classList.toggle('active');    // メニューの表示切り替え
  hamburger.classList.toggle('change');  // アイコンのスタイル変更用クラス
});


1,2行目で「#hamburger」と「#navMenu」を取得しています。
hamburger.addEventListener('click', () => { });「#hamburger」がクリックされたら行う動作を指定しています。
これの{ }の中にその動作を書きます。

navMenu.classList.toggle('active');「#navMenu」にactiveというクラス名を付与
hamburger.classList.toggle('change');「#hamburger」にchangeというクラス名を付与するものです。


これでjsを用いたハンバーガーメニューは完成です。
jsもシンプルなものなので、js初心者でも作りやすいかと思います!


私のHPです。
webグラフィックデザインイラスト制作などのお仕事がありましたら、ぜひこちらからお気軽にお問合せください!

いいなと思ったら応援しよう!