見出し画像

【HTML/CSS/JavaScript】ハンバーガーメニュー⇨2本線が×に



コードペン



https://codepen.io/Yusuke0620/pen/jOJQrp

HTML


      <div class="hamburger_menu">
        <span></span>
        <span></span>
      </div>
      
      <!-- 以下はコードの説明書き -->

      
      ⇧<br>
      ■仕様<br>
      // 1 ハンバーガーメニューがクリックされると全画面の色が変わる<br>
      // 2 ハンバーガーメニューがクリックされるとメニューアイコンの形状変更<br>
      // 3 ハンバーガーメニューがクリックされるとメニューバーが白色に変更<br>

CSS

/*-------------------------------------------
ページ全体のレイアウト
-------------------------------------------*/
body {
  display: grid;
  place-items: center;
  height: 100vh;
  background-color: #f0f0f0 ;
}

/* 解説 
ページ全体のレイアウトなので
ハンバーガーメニューに直接の影響はありません。
グリッドレイアウトでplace-itemsで縦横中央揃え
*/

/*-------------------------------------------
ハンバーガーメニュー大枠
-------------------------------------------*/
.hamburger_menu {
  display: block; 
  position: relative;
  width: 30px; 
  height: 30px; 
  cursor: pointer;
}

/* 解説
アイコン線を格納するための大枠(親要素)です
position: relative;で相対指定
*/

/*-------------------------------------------
ハンバーガーメニューのアイコン線
-------------------------------------------*/
.hamburger_menu span {
  position: absolute;
  background-color: #333333 ;
  height: 2px; 
  width: 100%;   
  border-radius: 1px;
  transition: all 0.4s ease-in-out;
}

/* 解説
大枠である.hamburger_menuの子要素である全spanに指定
position: absolute;で絶対指定
背景色、高さ、横幅、過度の丸みを指定
transitionで0.4秒かけてease-in-out→徐々に減速指定
*/

/*-------------------------------------------
ハンバーガーメニューのアイコン線
-------------------------------------------*/
/* 平時の位置 */
.hamburger_menu span:nth-of-type(1) {
  top: 10px;
}
.hamburger_menu span:nth-of-type(2) {
  bottom: 10px;
}
/* クリック時に横アイコンが斜めになる */
.hamburger_menu.active span:nth-of-type(1) {
  transform: translateY(4px) rotate(-45deg);
}
.hamburger_menu.active span:nth-of-type(2) {
  transform: translateY(-4px) rotate(45deg);
}

/* 解説
平時の位置では親要素に対して
topとbottomの10pxで固定している
クリック時はactiveセレクタを指定し
nth-of-type(1)はY軸に+4px下に移動し
反時計回りに45°回転
nth-of-type(2)はY軸に4px上に移動し
時計回りに45°回転
 */

/*-------------------------------------------
クリック後の背景色変更※classList用
-------------------------------------------*/
.overlay  {
  background-color: rgba(0, 0, 0, 0.8);
}

/* 解説
overlayは被せるという意味です
JavaScriptのクリックイベント時に背景を薄暗くします
 */

JavaScript

/*-------------------------------------------
// 1 ハンバーガーメニューがクリックされると全画面の色が変わる
// 2 ハンバーガーメニューがクリックされるとメニューアイコンの形状変更
// 3 ハンバーガーメニューがクリックされるとメニューバーが白色に変更
-------------------------------------------*/
const hamburgerMenu = document.querySelector(".hamburger_menu"); //定数menuに.hamburger_menuセレクタを代入
const body = document.querySelector("body"); //定数bodyにbodyを代入
const menuSpan = document.querySelectorAll(".hamburger_menu span");

  /* 
  ハンバーガーメニューがクリックされたら
  定数hamburgerMenuにactiveセレクタを代入
  定数bodyにoverlay セレクタを代入
  */
  hamburgerMenu.addEventListener("click", () => {
    hamburgerMenu.classList.toggle("active"); // メニューアイコンの形状変更
    body.classList.toggle("overlay"); //背景色変更

    /* spanは複数あるためforEachを使用し、span要素の集合に対して繰り返し処理を行う */    
    menuSpan.forEach(span => {

      /* 
      メニューがクリックされclassListが追加されたら
      #fff (true)、削除されたら#333(false)
      メニューバーの色を切り替える

      classList.containsメソッドは引数として与えられた要素(active)が含まれているかどうかチェック
      含まれているなら#fff色に、含まれていないなら#333色に
      */     
      span.style.backgroundColor = hamburgerMenu.classList.contains("active") ? "#fff" : "#333333";
    });
  });

この記事が気に入ったらサポートをしてみませんか?