ふわっと浮き出てくるグローバルナビのハンバーガーメニュー

ちょこっと解説とサンプルページ

横とか上からスライドで出てくるメニューじゃなくて、ふわっと浮き出てくるハンバーガーメニューを作ってみた。

非表示のときは「opacity: 0;」だけじゃなくて、「right: -100vw;」で右に隠している。
本当は右からスライドして来てるんだけど、アニメーションで「right: 0;」にしたあと、「opacity: 1;」で表示される設定を入れている。

横幅が広いときは、containerサイズの端で表示されるようにするため、アニメをPC版とSP版で2つ入れた。

サンプルページ

コピペで使えるコード

HTML(ヘッダー)

<header class="header">
<div class="container">
<div class="nav">
<ul class="nav-list" id="navList">
<li class="nav-item"><a href="/#">menu1</a></li>
<li class="nav-item"><a href="/#">メニュー2</a></li>
<li class="nav-item"><a href="/#">メニューメニュー3</a></li>
<li class="nav-item"><a href="/#">menumenumenumenumenumenumenumenu</a></li>
<li class="nav-item"><a href="/#">メニュー</a></li>
<li class="nav-item"><a href="/#">めにゅー</a></li>
</ul>
</div>
<div class="hamburger" id="navBtn">
<span class="hamburger-line hamburger-line01"></span>
<span class="hamburger-line hamburger-line02"></span>
<span class="hamburger-line hamburger-line03"></span>
</div>
</div>
</header>

CSS

.header{
  background-color: #ddd;
  width: 100%;
  height: 45px;
}
.container{
  position: relative;
  max-width: 768px;
  width: 100%;
  margin-left: auto;
  margin-right: auto;
}
.nav {
  background-color: #fff;
  border-radius: 8px;
  -webkit-filter: drop-shadow(0px 3px 6px rgba(0, 0, 0, 0.16));
  filter: drop-shadow(0px 3px 6px rgba(0, 0, 0, 0.16));
  position: fixed;
  opacity: 0;
  right: -100vw;
  top: 45px;
  min-width: 150px;
  max-width: 300px;
  width: 100%;
  padding: 10px 20px;
  transition: all .6s;
  z-index: 100;
  overflow-y: auto;
  word-wrap:break-word;
}

.hamburger {
  position: absolute;
  right: 15px;
  top: 0;
  width: 45px;
  height: 45px;
  cursor: pointer;
  z-index: 300;
}

.nav-item a {
  color: #333;
  display: block;
  padding: 5px 0;
  text-decoration: none;
  transition: .8;
  transition: .3s;
}

.nav-item a:hover {
  opacity: .7;
}

.hamburger-line {
  position: absolute;
  left: 13px;
  width: 18px;
  height: 2px;
  background-color: #333;
  transition: all .6s;
}

.hamburger-line01 {
  top: 15px;
}

.hamburger-line02 {
  top: 20px;
}

.hamburger-line03 {
  top: 25px;
}

/* .nav-open がついたとき */
.nav-open .nav {
  -webkit-animation: navsp .5s linear forwards;
  animation: navsp .5s linear forwards;
}

@media (min-width: 768px) {
  .nav-open .nav {
    -webkit-animation: navpc .5s linear forwards;
    animation: navpc .5s linear forwards;
  }
}

.nav-open .hamburger-line01 {
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg);
  top: 20px;
}

.nav-open .hamburger-line02 {
  width: 0;
  left: 50%;
}

.nav-open .hamburger-line03 {
  -webkit-transform: rotate(-45deg);
  transform: rotate(-45deg);
  top: 20px;
}


/* ナビのアニメ */
@-webkit-keyframes navsp {
  0% {
    opacity: 0;
    right: 15px;
  }

  30% {
    opacity: 0;
    right: 15px;
  }

  100% {
    opacity: 1;
    right: 15px;
  }
}

@keyframes navsp {
  0% {
    opacity: 0;
    right: 15px;
  }

  30% {
    opacity: 0;
    right: 15px;
  }

  100% {
    opacity: 1;
    right: 15px;
  }
}

@-webkit-keyframes navpc {
  0% {
    opacity: 0;
    right: calc((50% - 768px / 2) + 15px);
  }

  30% {
    opacity: 0;
    right: calc((50% - 768px / 2) + 15px);
  }

  100% {
    opacity: 1;
    right: calc((50% - 768px / 2) + 15px);
  }
}

@keyframes navpc {
  0% {
    opacity: 0;
    right: calc((50% - 768px / 2) + 15px);
  }

  30% {
    opacity: 0;
    right: calc((50% - 768px / 2) + 15px);
  }

  100% {
    opacity: 1;
    right: calc((50% - 768px / 2) + 15px);
  }
}

JavaScript

// グローバルナビ
function globalNav() {
  const body = document.body;
  const hamburger = document.getElementById('navBtn');
  const navitem = document.getElementById('navlist');

  //ページ内にidがないときは無効にする
  if (!hamburger || !navitem){ return false;}

  hamburger.addEventListener('click', function() {
    body.classList.toggle('nav-open');
  });
  navitem.addEventListener('click', function() {
    body.classList.remove('nav-open');
  });
}
globalNav();

「 if (!hamburger || !navitem){ return false;} 」は、ページ内に変数で指定したidがないとき、エラーがでるので、idが無いときはjsが無効になるように入れてます。
(グロナビがページ内に無いってことはほとんどないと思うけど)

横からスライドして出てくるレスポンシブで切り替わるハンバーガーメニュー

PCとスマホで切り替わるハンバーガーメニューはこちら

グローバルナビのスマホのときだけハンバーガーメニューになるテンプレ