【HTML+CSS+jQuery】定番のハンバーガーメニューに少し機能性を付与したコード

定番のハンバーガーメニューに少し機能性を付与したコード

画像のような典型的なハンバーガーメニューのコードを備忘録としてメモ。

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

HTML

  <header>
    <div class="headerInner">
      <div class="headerLogo">
        <figure class="logo">
          <a href="#">
            <img src="img/logo_01.png" alt="">
          </a>
        </figure>
      </div>
      <nav class="headerNav">
        <ul class="navList">
          <li><a href="#">ホーム</a></li>
          <li><a href="#">会社案内</a></li>
          <li><a href="#">お知らせ</a></li>
        </ul>
        <div class="btnBox">
          <a href="#" class="btn -type1" target="_blank">お問い合わせ</a>
        </div>
        <div class="sp">
          <div class="overlay" id="js-overlay"></div>
          <div class="hamburger"><span></span><span></span><span></span></div>
        </div>
      </nav>
    </div>
  </header>

header内に記述。

ハンバーガーメニューの3本線はモバイルだけで表示させるためにclass名「sp」を付与してPCでは非表示にしている。

3本線だからspanも3つ用意。

<div class="overlay" id="js-overlay"></div>

これはハンバーガーメニュー開時にwidthが100%じゃないときに、ハンバーガーメニューの領域以外の箇所をクリックしてもtoggleが動くようにするために、ハンバーガーメニューの領域以外の領域を作る。

  </footer>
  <!--jQuery-->
  <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
    crossorigin="anonymous"></script>
  <!--Scripts-->
  <script src="js/script.js"></script>

</body>
</html>

閉じbodyタグ直前にjQueryのCDNとscript.jsを読み込ませる。

SCSS

@use '../global'as g;

@include g.sp {

  .hamburger {
    position: relative;
    /*ボタン内側の基点となるためrelativeを指定*/
    cursor: pointer;
    width: 3.125rem;
    height: 3.125rem;
    border-radius: 5px;
    z-index: 1000;
  }

  /*ボタン内側*/
  .hamburger span {
    display: inline-block;
    transition: all .4s;
    /*アニメーションの設定*/
    position: absolute;
    left: 14px;
    height: 2px;
    border-radius: 2px;
    background: #000000;
    width: 50%;
  }

  .hamburger span:nth-of-type(1) {
    top: 0.9375rem;
  }

  .hamburger span:nth-of-type(2) {
    top: 1.4375rem;
  }

  .hamburger span:nth-of-type(3) {
    top: 1.9375rem;
  }

  /*activeクラスが付与されると線が回転して×に*/
  .active .hamburger {

    span:nth-of-type(1) {
      top: 1.125rem;
      left: 1.125rem;
      transform: translateY(0.375rem) rotate(-45deg);
      width: 40%;
      height: 1.7px;
    }

    span:nth-of-type(2) {
      opacity: 0;
      /*真ん中の線は透過*/
    }

    span:nth-of-type(3) {
      top: 1.875rem;
      left: 1.125rem;
      transform: translateY(-0.375rem) rotate(45deg);
      width: 40%;
      height: 1.7px;
    }
  }

  .overlay {
    background-color: rgb(195, 194, 194, 0.5);
    cursor: pointer;
    height: 100vh;
    width: 100vw;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    visibility: hidden;
    transition: all 0.6s;
    z-index: 100;
  }

  .active .overlay {
    opacity: 0.8;
    visibility: visible;
  }


  .navList {
    background: #fff;
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    right: -100%;
    z-index: 999;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    transition: ease-in-out 0.6s;

    li {
      position: relative;

      &::before {
        content: '';
        background-color: #B31D2D;
        width: 0.3125rem;
        height: 0.3125rem;
        border-radius: 50%;
        position: absolute;
        top: 0.8125rem;
        left: -0.625rem;
      }
    }
  }

  .active .navList {
    right: 0;
  }
}

ハンバーガーメニュー3本線、ハンバーガーメニュー開時、ハンバーガーメニュー領域外(overlay)のCSS。

jQuery

//Humburger Menu
$(function () {
  $('.hamburger').on('click', function () {
    $('body').toggleClass('active');

    $(".navList a").on("click", function () {
      $("body").removeClass('active');
    });

    if ($('body').hasClass('active')) {
      $('.overlay').on('click', function () {
        $('body').removeClass('active');
      });
    };
  });
});
  1. ハンバーガーメニューをクリックすると「body」に「active」というクラスをtoggleで付与。
  2. ハンバーガーメニューのリンクをクリックすると「body」から「active」を除去。これを記述することにより、アンカーリンクをクリックしてもハンバーガーメニューが閉じる。記述しないと、アンカーリンクにページ内移動しているのにハンバーガーメニューが閉じない。
  3. ハンバーガーメニュー開時の領域外をクリックすると、「body」から「active」が取り除かれ、ハンバーガーメニューが閉じるようになる。