【Javascript】ハンバーガーメニュー内のコンテンツを「表示・非表示」にする方法

CSS HTML JavaScript プログラミング

こんにちは、ダイキです。
今回は、Javascriptで、ハンバーガーメニュー内のコンテンツを作成してみます。
ハンバーガーのボタンがクリックされたら、Javascript が作動する感じですね。
意外と引っかかるのが、display: none; と display: block; で対応してしまうことですね。ですがこれだと、transition が効きません。
なので、visibility: hidden; と visibility: visible; を使います。
以下にコードを載せていますので参考までにどうぞ。(※一部は別サイトのコードを参考にしています)

HTMLです。ハンバーガーメニュー内のコンテンツを「表示・非表示」にする方法


<header class="header">
  <div class="container d-flex">
    <div class="box-l box">
      <h1 class="h1-title">Sneakers</h1>
    </div>
    <div class="box-r box">
      <div id="js-open_btn" class="open_btn">
        <div class="open_btn-area">
          <span></span>
          <span></span>
          <span></span>
        </div>
      </div><!-- open_btn -->
    </div>
  </div>
  <div id="js-menu" class="menu">
    <div class="menu-list">
      <nav class="g-nav">
        <ul>
          <li><a href="#">PICK UP</a></li>
          <li><a href="#">FEATURE</a></li>
          <li><a href="#">CONTACT</a></li>
        </ul>
      </nav>
      <ul class="sns-list">
        <li><a href="#">Twitter</a></li>
        <li><a href="#">facebook</a></li>
        <li><a href="#">instagram</a></li>
      </ul>
    </div>
  </div><!-- menu -->
</header>

CSSです。ハンバーガーメニュー内のコンテンツを「表示・非表示」にする方法


/* ハンバーガーメニュー */

/*ボタン外側※レイアウトによってpositionや形状は適宜変更してください*/
.open_btn {
  /*ボタン内側の基点となるためrelativeを指定。
  追従するナビゲーションの場合はfixed+top、rightといった位置をセットで指定*/
  position: relative;
  z-index: 200;
  cursor: pointer;
  width: 50px;
  height:50px;
  border-radius: 5px;
}

/*ボタン内側*/
.open_btn .open_btn-area {
  transition: all .6s;/*アニメーションの設定*/
  width:50px;
  height:50px;
}

.open_btn span {
  display: inline-block;
  transition: all .4s;
  position: absolute;
  left: 14px;
  height: 3px;
  border-radius: 2px;
  background: #333;
  width: 45%;
}

.open_btn span:nth-of-type(1) {
  top:15px;	
}

.open_btn span:nth-of-type(2) {
  top:23px;
}

.open_btn span:nth-of-type(3) {
  top:31px;
}

/*activeクラスが付与されると .open_btn-areaが360度回転し、その中の線が回転して×に*/
.open_btn.active .open_btn-area{
  transform: rotate(360deg);
}

.open_btn.active span:nth-of-type(1) {
  top: 18px;
  left: 18px;
  transform: translateY(6px) rotate(-45deg);
  width: 30%;
  background-color: #fff;
}

.open_btn.active span:nth-of-type(2) {
  opacity: 0;
  background-color: #fff;
}

.open_btn.active span:nth-of-type(3){
  top: 30px;
  left: 18px;
  transform: translateY(-6px) rotate(45deg);
  width: 30%;
  background-color: #fff;
}

/* グローバルメニュー */

.menu {
  visibility: hidden;
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  width: 100%;
  height: 100vh;
  background-color: rgba(0,0,0,0.6);
  transition: all .3s ease-in-out;
}

.menu.active {
  opacity: 1;
  visibility: visible;
}

.menu-list {
  position: absolute;
  top: 0;
  left: 0;
  width: 300px;
  height: 100%;
  padding: 50px 30px;
  background-color: #000;
}

.menu-list .g-nav {
  margin-bottom: 50px;
}

.menu-list .g-nav li {
  padding: 15px 0;
  border-top: 2px solid #fff;
}

.menu-list .g-nav li:last-child {
  border-bottom: 2px solid #fff;
}

.menu-list a {
  color: #fff;
  text-decoration: none;
}

.menu-list .sns-list li {
  margin-bottom: 10px;
}

/* header */

.header {
  position: fixed;
  z-index: 100;
  width: 100%;
  background-color: #fff;
  padding: 15px;
}

.header .d-flex {
  align-items: center;
}

JavaScriptです。ハンバーガーメニュー内のコンテンツを「表示・非表示」にする方法


// ハンバーガーメニューがクリックスされると動く

const jsOpenBtn = document.getElementById("js-open_btn");
const jsMenu = document.getElementById("js-menu");

jsOpenBtn.addEventListener('click', () => {
  jsOpenBtn.classList.toggle('active');
  jsMenu.classList.toggle('active');
});