LoginSignup
0
1

More than 3 years have passed since last update.

【備忘録:HTML、CSS、jQuery】ハンバーガーメニュー

Last updated at Posted at 2020-06-16

ハンバーガーメニュー実装時に気をつける点を書いていきます

ハンバーガーメニューとは?

・ハンバーガーメニューはよく目にすると思いますが、念のため紹介します。
スクリーンショット 2020-06-16 20.02.49.png
こんな感じに端っこに、三本ラインのメニューをよく見ると思います。これがハンバーガーメニューです。
※グレー背景はコンテンツ部分だと思ってくだい。

んでコレをクリックすると、
スクリーンショット 2020-06-16 20.02.59.png
このように、何もないところからメニューが出てくるといったものです。

今回制作したのは、「コンテンツ部分全部にメニューがかかる」ハンバーガーメニューになります。
あとSP時のみハンバーガーメニューになります。

ハンバーガーメニューのソース

HTML、CSSのソースをはります。

menu.html
<div class="container">
  <div class="l-humbegermenu">
    <button class="m-humbegermenu js-humbegermenu"><span>MENU</span></button>
  </div><!-- /.l-breadcrumb -->
  <div class="l-breadcrumb">
    <ol class="m-breadcrumb-items">
      <li><a href="#">hogehoge</a></li>
      <li><a href="#">hogehoge</a></li>
      <li><a href="#">hogehogehogehoge</a></li>
    </ol>
  </div><!-- /.l-breadcrumb -->
</div>

HTMLは結構シンプルです。

CSSは全部載せるとながいので、メニューの初期位置部分を載せます。

menu.scss
.l-breadcrumb{//①ハンバーガーメニューの初期位置(最初は隠している)
  background: #fefde8;
  width: 100%;
  height: 120%;
  z-index: 1;
  position: absolute;
  top: 0;
  left: 0;
  transform: translateX(180%);
  padding: 0;
}
.is{
  &-humbegermenuOpen{//①ハンバーガーメニューの初期位置(最初は隠している)
    &::before{
      background-color: #fff;
      display: block;
      height: 3px;
      width: 24px;
      top: calc(50%);
      left: calc(50% - 10px);
      transform: rotate(-45deg);
      transition: all .3s ease;
    }
    &::after{
      background-color: #fff;
      display: block;
      height: 3px;
      width: 24px;
      top: calc(50%);
      left: calc(50% - 10px);
      transform: rotate(45deg);
      transition: all .3s ease;
    }
    span{
        text-indent:100%;
        white-space:nowrap;
        overflow:hidden;
        transition: all .3s ease;
      &::before{
          transition: all .3s ease;
          content: none;
      }
    }
    }
  &-show{//②ハンバーガーメニューの出てきて止まる位置
      transform: translateX(0);
      transition: all .3s ease;
  }
  &-transition{//③ハンバーガーメニューを閉じる際の動きに必要クラス
    transition: all .3s ease;
  }
}

解説

htmlは特に大きい説明はないので、cssを説明します。

menu.scss
.l-breadcrumb{//①ハンバーガーメニューの初期位置(最初は隠している)
  background: #fefde8;
  width: 100%;
  height: 120%;
  z-index: 1;
  position: absolute;
  top: 0;
  left: 0;
  transform: translateX(180%);
  padding: 0;
}

ここは実際の黄色背景のメニューが出る部分です。
メニューを絶対配置にし画面幅いっぱいに表示できるようにしています。

メニューは、右から左ににゅるという感じに出したかったので、translateX(180%)で見えなくなるぐらいまで右に寄せています。
ボタンをクリックすると、「.l-breadcrumbにtranslateXを0にするクラスをつける」ということをして、右から左ににゅると出るように表現しています。

menu.scss
.is-show{//②ハンバーガーメニューの出てきて止まる位置
      transform: translateX(0);
      transition: all .3s ease;
  }

次のポイントが以下のtransition用クラスです。

menu.scss
.is-transition{//③ハンバーガーメニューを閉じる際の動きに必要クラス
    transition: all .3s ease;
  }

.l-breadcrumbにtransitionをつければいいのですがそうすると、
「ウィンドウサイズを変更すると、ブレイクポイントの際、一瞬表示されてから右に寄る」
ということが発生します。
display:noneなどで消しているのではないので、コンマ3秒見えながらtranslateX(180%)がかかるといった感じです。
なので、transitionのクラスをメニュークリック時に付与し、閉じる際のアニメーションを与えるようにしています。

JS

上記cssのクラスをjsで制御しています。

menu.js
$(function() {  
    let $humbegerBtn = $('.js-humbegermenu');
    let $breadcrumb = $('.l-breadcrumb');
    let $humbegerOpen = 'is-humbegermenuOpen'

    $humbegerBtn.on('click', function(){
      let $this = $(this);
      $this.toggleClass($humbegerOpen);//ハンバーガーメニューのアイコンクラスを付与
      $breadcrumb.toggleClass('is-show');//ハンバーガーメニューのオープンクラスを取ったりつけたり
      setTimeout(function(){
        $breadcrumb.toggleClass('is-transition');
      },200);
      return false;
    });

    $(window).on('resize', function() {//ウィンドウサイズを変更した際に、ハンバーガーメニューがイキた状態になるのでそれを解除
      let $windowWidth = window.innerWidth;

      if($windowWidth > 640){
        $breadcrumb.removeClass('is-show is-transition');
        $humbegerBtn.removeClass($humbegerOpen);
      };
    });
  });

setTimeoutでis-showと同時につけるのではなく、一瞬遅くつけるということをして、ウィンドウサイズ変更にも対応できるようにしています。
あと、リサイズイベントで、メニューを開いた状態から「SP→PC→SP」とウィンドウサイズを変えても、メニューが開いた状態にならないようにしています。

ほんとは三本ラインのソースも載せたかったのですが、多くなるためそこは割愛します。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1