HTML CSS JavaScript 基礎 ハンバーガーメニュー の作り方 

初心者エンジニアなりにハンバーガーメニューの作り方をメモ用に書きました

# 全体コード

```html:index.html
<header>
    <a id="menu_button">
        <div></div>
        <div></div>
        <div></div>
    </a>
    <nav id="nav">
        <ul>
            <li>menu1</li>
            <li>menu2</li>
            <li>menu3</li>
            <li>menu4</li>
        </ul>
    </nav>
</header>
```
```css:style.css
@charset "utf-8";
*, *::before, *::after{
    box-sizing: border-box;
}
a{
    text-decoration: none;
}
ul{
    list-style: none;
}

#menu_button{
    display: block;
    height: 50px;
    width: 50px;
    background: rgb(117, 117, 117);
    position: fixed;
    top: 0;
    left: 0;
}
#menu_button div{
    height: 1px;
    width: 60%;
    background-color: #fff;
    position: absolute;
    top: 50%;
    right: 50%;
    transform: translateX(50%);
    transition: ease .4s;
}
#menu_button div:nth-of-type(1){
    transform: translate(50%,-10px);
}
#menu_button div:nth-of-type(3){
    transform: translate(50%,10px);
}

#nav{
    width: 30%;
    height: 100vh;
    position: fixed;
    top: 0;
    left: -30%;
    background-color: gray;
    font-size: 16px;
    z-index: -1;
    padding-top: 50px;
    transition: ease .4s;
}
#nav.active{
    transform: translateX(100%);
}

#menu_button.active {
    transform: translateX(0);
  }
#menu_button.active div:nth-of-type(1){
    transform: rotate(45deg);
    top: 25px;
    left: 10px;
  
} 
#menu_button.active div:nth-of-type(2) {
    opacity: 0;
}
#menu_button.active div:nth-of-type(3) {
    transform: rotate(-45deg);
    bottom: 25px;
    left: 10px;
}

```
```js:script.js
const menuButton = document.getElementById("menu_button")
const nav = document.getElementById("nav")

// menu_buttonをとってくる→クリックされたとき
menuButton.addEventListener("click",() =>{
    menuButton.classList.toggle("active")
    nav.classList.toggle("active")
})

```

## メニューボタンを作る
```html
<a id="menu_button">
    <div></div>
    <div></div>
    <div></div>
</a>
```
```css
#menu_button{
    display: block;
    height: 50px;
    width: 50px;
    background: rgb(117, 117, 117);
    position: fixed;
    top: 0;
    left: 0;
}
#menu_button div{
    height: 1px;
    width: 60%;
    background-color: #fff;
    position: absolute;
    top: 50%;
    right: 50%;
    transform: translateX(50%);
    transition: ease .4s;
}
#menu_button div:nth-of-type(1){
    transform: translate(50%,-10px);
}
#menu_button div:nth-of-type(3){
    transform: translate(50%,10px);
}
```
div要素を3つ作り、width60%、height1pxの要素を作ります

div:nth-of-type(1)で1つ目のdivと
div:nth-of-type(3)3つ目のdivを上下にtransformでずらします

## jsでtoggleを使いクリックで切り替え機能を追加する
```js
const menuButton = document.getElementById("menu_button")
const nav = document.getElementById("nav")

//クリックされたとき
menuButton.addEventListener("click",() =>{
    menuButton.classList.toggle("active")
    nav.classList.toggle("active")
})
```
メニューボタンと表示、非表示させるnavをdocument.getElementByIdを使い取得します

menu_buttonがクリックされたときにclassList.toggleを使いmenu_buttonとnavをactiveにします

## activeになった時にメニューボタンを×マークにし、navを表示させます
```css
#menu_button.active {
    transform: translateX(0);
  }
#menu_button.active div:nth-of-type(1){
    transform: rotate(45deg);
    top: 25px;
    left: 10px;
  
} 
#menu_button.active div:nth-of-type(2) {
    opacity: 0;
}
#menu_button.active div:nth-of-type(3) {
    transform: rotate(-45deg);
    bottom: 25px;
    left: 10px;
}
```
まず1つ目、2つ目のdiv要素をtransform: rotate(45deg);で回転させます
そして回転される支点は左上になってしまうのでtopとleftを使い位置を調整します

```css
#nav{
    width: 30%;
    height: 100vh;
    position: fixed;
    top: 0;
    left: -30%;
    background-color: gray;
    font-size: 16px;
    z-index: -1;
    padding-top: 50px;
    transition: ease .4s;
}
#nav.active{
    transform: translateX(100%);
}
```
navは元の位置を画面外にしておきactiveになった時にtransformで持ってきています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2859781/b5bd61f4-3b74-a466-51db-fa9f6ca4f83d.png)
　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2859781/974d448c-4090-37af-3e1f-e0c72bc4da60.png)