見出し画像

ハンバーガーメニューの作り方【JavaScript】

※自分用備忘録

コード例です。

JavaScriptにはいろいろな記述の仕方があるため、最適な記述ではない場合があります。

ハンバーガーボタンを作成

HTML

<div id="menuBtn">
 <div></div>
 <div></div>
  <div></div>
</div>

CSS

#menuBtn {
 margin-left: auto;
 width: 50px;
 height: 50px;
 background-color: #777;
 position: relative;
}

#menuBtn div {
 height: 1px;
 width: 60%;
 background: #333;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, 0);
 transition: 0.3s;
}

#menuBtn div:nth-of-type(1) {
 transform: translate(-50%, -10px);
}

#menuBtn div:nth-of-type(3) {
 transform: translate(-50%, 10px);
}

JSでtoggleを設定

JavaScript

document.addEventListener('DOMContentLoaded', function() {

});

上記のコードにはHTMLを読み込んだ後にJSを動かすという意味があります。
記述しなくても機能しますが、記述しておくとエラー回避につながる場合があります。

以降のコードはこの中に記述していきます。

JavaScript

document.getElementById("menuBtn").addEventListener("click",function() {
  this.classList.toggle("active");
})

classから取得してtoggle用のclassを設定することもできますが、idは基本的に一つのページに同じidが存在しないので、idで取得した方が処理的に早い場合があります。

ハンバーガーメニューをクリックしてclassのactiveを付与したときの設定

HTML

<nav id="nav">
  <ul id="ul">
    <li>menu1</li>
    <li>menu2</li>
    <li>menu3</li>
  </ul>
</nav>

CSS

#menuBtn.active div:nth-of-type(2) {
 opacity: 0;
}

#menuBtn.active div:nth-of-type(1) {
 transform: rotate(45deg) translate(-50%, 0);
 transform-origin: 0% 50%;
}

#menuBtn.active div:nth-of-type(3) {
 transform: rotate(-45deg) translate(-50%, 0);
 transform-origin: 0% 50%;
}

#nav {
 opacity: 0;
 visibility: hidden;
 transition: .3s;
}

#nav.active {
 opacity: 1;
 visibility: visible;
}

navはdisplay: none;でも隠すことができますが、その場合いtransitionが効きません。

opacityで設定するとtransitionが効きます。
opacityを0にしただけではクリックができてしまうため、visibilityも一緒に設定する必要があります。

JavaScript

document.getElementById("nav").classList.toggle("active");

this.classList.toggle("active");の下に上記のコードを追加します。

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