メニューじゃないハンバーガーを作れるCSSをつくった。


CSSのチェックボックスなら、「チェックが入ってたら~する」って指定を行えば、
JSのクリックイベントのような使い方が出来る。

例えばハンバーガーメニューも作れる。
[CSSだけで簡単にドロワーメニュー\(ハンバーガーメニュー\)を作る \- Qiita](https://qiita.com/super-mana-chan/items/0310e3543bd1c3e4761a)

そしてわたしはついにハンバーガーも作れるのではと気づいてしまった、、、

<p class="codepen" data-height="268" data-theme-id="0" data-default-tab="css,result" data-user="himeka223" data-slug-hash="LYPOvjO" style="height: 268px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ハンバーガーが食べたいので作った">
  <span>See the Pen <a href="https://codepen.io/himeka223/pen/LYPOvjO">
  ハンバーガーが食べたいので作った</a> by himeka223 (<a href="https://codepen.io/himeka223">@himeka223</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

できてしまった、、、



# ハンバーガーを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/4c724230-01ae-c907-1af7-b665852a5f55.png)

```html
<div class="hamburger">
    <div class="hamburger__body">
    <div class="topping--lettuce"></div>
    <div class="topping--meat"></div>
    <div class="topping--tomato"></div>
    <div class="topping--cheese"></div>
  </div>
</div>
```
## かんたんに、構造
`.hamburger`…ハンバーガー自体の土台となる。
`.hamburger__body`…ハンバーガー自体。`after``before`で**パンの部分**を指定。
`.topping--{具材}`…トッピング。


## 重なりについて
重なっていくトッピングを表現するのに、トッピングを`position`で指定しようとしたが
これだと、**下のトッピングを抜いたのに、上のトッピングの位置が変わらなくなってしまう。**

例えば、トマトが嫌いでトマトを抜いたら、上のチーズが浮いたままになってしまう。
そんなハンバーガーは美味しくなさそう。

### ★`flexbox`で子要素の順番を逆にする指定をする

マイナスマージンとかを使ってみるとわかるように、
**HTMLは下の要素が手前に重なっていく。**
↓こんな感じで下にある要素が手前に重なる。
![.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/1b35d190-405a-5522-e32c-ab699965fecd.png)

そこで`flexbox`の**子要素の順番を逆にする指定**を使い、
見た目と逆に書いたHTMLをそのまま逆にすることで、
`下の要素が手前に重なっていった`のをそのまま逆転させる。

```scss
flex-direction: column-reverse;
display: flex;
```

`チーズ`
`トマト`
`肉`
`レタス`

こうゆうふうに重ねたいから

`レタス`
`肉`
`トマト`
`チーズ`

と記載する。

**そしてトッピングたちに`マイナスマージン`を指定して、重ねていく。**

## ハンバーガー自体の位置の調整

このままだと、トッピングしたときに下にバーガーが動いてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/7dce6fa6-0f47-c9ca-209b-dc5cf2f02b28.png)
ハンバーガー自体を`position`で下に揃えることで、トッピングしても上へ重なっていくようになる。

```scss
position: absolute;
bottom: 0;
left: 0;
```

## パンを作る

上と下のパンは、`hamburger__body`の`before`と`after`要素で作られている。

```scss
    &:after,
    &:before{
      content: " ";
      width: 100px;
      background-color: $bun;
    } 
    &:before{
      display: block;
      height: 20px;
      border-radius:30% 30% 40% 40%;
      box-shadow:0 -8px 0 0px darken($bun,8%) inset; 
    }
    &:after{
      display: none;
      margin-bottom: -10px;
      height: 30px;
      border-radius:50% 50% 40% 40%/70% 70% 40% 40%;
      box-shadow:0 -6px 0 0px darken($bun,8%) inset;
    }
  }
```

重なりについて説明したように、**`flexbox`の子要素の順番を逆にする指定**で、htmlの記述とは逆に表示されるので

`before`要素…下のパン
`after`要素…上のパン

の指定になる。

### ★`after要素`で上のパンを作る

まず、高さ20pxの長方形を作成。

`border-radius`でパンの丸みを表現する。

```scss
border-radius:50% 50% 40% 40%/70% 70% 40% 40%;
```
`border-radius`は角丸の半径の指定である。
左上・右上・右下・左下の順で指定。
`/`で区切ることで、`水平方向/垂直方向`の指定ができる。

box-shadowで影をつける。

```scss
box-shadow:0 -8px 0 0 darken($bun,8%) inset;
```
影の指定方法は
`box-shadow:横の位置 縦の位置 影のぼかし度 影の広さ 色 insetで中へ影を広げる;`
となる。
`darken($bun,8%)`はSCSSの機能で`$bun（変数で色コードを指定）`を8%暗くした色になる。

### ★`before要素`でも下のパンを作る
作り方は上のパンと同様
`角丸`を平たくして平たいパンにした。

## トッピングをつくる
トッピングは基本としては平たいパンと同じ。

```scss
width: 100px;
height: 20px;
margin-bottom: -10px;
border-radius:30% 30% 40% 40%;
```
高さ20px幅100pxで、丸みを付ける。

**`margin-bottom: -10px;`**とすることで、重ねることができる。
### ★チーズを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/9c7b303a-4f97-eb06-38e7-6ffb7cd21acb.png)


```scss
&--cheese{
    @extend %topping;
    background-color: $cheese;
    height: 10px;
    box-shadow:0 0px 0 2px $cheese ;
    &:after{
      display: block;
      content: " ";
      width: 0;
      height: 0;
      border-style: solid;
      border-width: 20px 50px 0 50px;
      margin-top:5px;
      border-color: $cheese transparent transparent transparent;
    }
  }
```

基本は普通のトッピングと同じ。

左右のトロッとした部分は、
`box-shadow:0 0px 0 2px $cheese ;`でチーズを他のトッピングより大きくして表現。
`width`でサイズを変えなかったのは、**中央からおおきくしたかったため。**
`width`だと、左を支点として、右に大きくなってしまう。

チーズの前のトロッとした部分は、
`after要素`で表現する。

borderプロパティで三角形を作り

```scss
border-style: solid;
border-width: 20px 50px 0 ;
border-color: $cheese transparent transparent transparent;
```
`margin-top:5px;`で少し下にずらしている。

###★レタスを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/ccc8555a-2194-aa13-fe3d-3f835a26b226.png)


こちらのサイトを参考に作りました。

```scss
  &--lettuce{
    @extend %topping;
    height: 15px;
    background-color:$lettuce;
    background:
      linear-gradient(-45deg, darken($lettuce,4%) 10px,  darken($lettuce,0%) 0) 10px;
    background-color: $lettuce;
    background-position: left bottom -3px;
    background-repeat: repeat ;
    background-size: 10px 20px;
  }
```

**45°のグラデーションをぼかし無しでつけて、そのサイズを決めてリピートさせる**ことでギザギザを指定する。


# ボタンの装飾
[CSSで作る！押したくなるボタンデザイン100（Web用）](https://saruwakakun.com/html-css/reference/buttons#section1)
こちらのコードをそのまま使用させていただきました。
作り方は割愛。

# `input`と`label`を連動させる

```html
<input id="lettuce" type="checkbox">
<!-- ~省略~ -->
<label class="button" for="lettuce">lettuce</label>
```
`input`と`label`は`id`と`for`を同じ値に指定することで紐付けることができる。
これで`for="lettuce"`の`label`をクリックすると、`id="lettuce"`の`input`のチェックをつけることができる。

```scss
#bun,#cheese,#tomato,#lettuce,#meat{
  display: none;
}
```

`input`のチェックボックスは必要ないので`display: none;`で非表示にする。


# `:checked`でチェック後の動作を指定

```scss

#lettuce:checked~{
  .hamburger{
    .topping{
      &--lettuce{
        display: block;
      }
    }
  }
  .button-area{
    .button[for="lettuce"]{
      /*ボタンを押したとき*/
        -webkit-transform: translateY(4px);
        transform: translateY(4px);/*下に動く*/
        box-shadow: 0px 0px 1px rgba(red, 0.2);/*影を小さく*/
        border-bottom: none;
    }
  }
}

```

まず、`#lettuce:checked`とすると、`#lettuce`にチェックが入ってた場合の動作を指定できる。
`~`セレクタは、**すべての隣接する要素**なので、
**隣接している、`.hamburger`の`.topping--lettuce`を表示するという動作にが実行される。**

ボタンも、同様に指定している。

# まとめ
ハンバーガーがおいしそうだから、作るのが楽しかった
マクドナルドの、一番安い薄いハンバーガーがたべたくなった