HTMLとCSSでカレーライスを作った

## カレーライスを作りました

※スマホではバグりますすみません

<p class="codepen" data-height="345" data-theme-id="dark" data-default-tab="css,result" data-user="thugumi-ishimaru" data-slug-hash="mdyPXEo" style="height: 345px; 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/thugumi-ishimaru/pen/mdyPXEo">
  カレーライス</a> by Thugumi Ishimaru (<a href="https://codepen.io/thugumi-ishimaru">@thugumi-ishimaru</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## どうやって作ったの

この記事ではカレーライスをHTMLとCSSで作ったときのポイントをいくつか抜粋したものを紹介します。
**実業務では**きっと**役には立ちません**ので、
「CSSってこんな表現できるんだな」・「CSS楽しい」と思っていただければ幸いです。

### パーツを細かく作る
[カレーのカレーによるカレーのためのAtomic Design](https://qiita.com/tsugu_maru_san/items/bddbb1b0fe0b347eca27)の記事で言及した、
Atomic Designの考えを元にして作りました。

#### Atomsの用意

* にんじん
* じゃがいも
* 牛肉
* 切った具材
* 米
* 皿

<img width="370" alt="スクリーンショット 2019-12-15 0.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/75fd7081-21c3-6fd5-1e79-78a17538b518.png">

<img width="370" alt="スクリーンショット 2019-12-15 0.18.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/a6d1465c-d05a-65a6-6090-29df966c5c3d.png">

<img width="371" alt="スクリーンショット 2019-12-15 0.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/c44f2661-9060-9bd2-fe59-d88db5f43be4.png">

<img width="371" alt="スクリーンショット 2019-12-15 0.18.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/888658f9-0993-f9a0-718d-0b680db998f4.png">

<img width="536" alt="スクリーンショット 2019-12-12 18.40.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/5e10f57e-a214-73f6-dbe7-a13900192b23.png">

<img width="368" alt="スクリーンショット 2019-12-15 0.18.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/54692c98-410f-17a9-0fba-c37d21329389.png">

これらをどう作ったか後ほど解説します。
（厳密には米はMoleculesですが、まぁよしとしましょう。）

これらを全て組み合わせることで、カレーライスを完成させました。

では、次に実際によく使ったCSSプロパティを紹介します。

### 秘伝のカレー3つのスパイス（プロパティ）

今回カレーライスを作るにあたって以下を意識しました。

* 影
* 丸みや、曲線の表現


~~逆に言うとこの2点しか抑えてなかった~~

#### box-shadow：立体感を持たせるスパイス
https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow

`box-shadow`は、要素に対して影をつけることができます。
これによってより立体的なになるように表現します。

じゃがいもの影のグラデーション、人参の棒線、切った具材の影、皿の凹凸等を再現しました。
じゃがいもを例にとってみます。

<img width="347" alt="スクリーンショット 2019-12-15 10.58.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/35c29824-757c-db69-2cb1-ca73563fa1af.png">

じゃがいものdivを用意します。

```html
  <div class="jaga"></div>
```

作成したdivに対して、`box-shadow`で土感を、
`border-radius`でじゃがいも特有の丸み・曲線を表現します。

```scss

.jaga {
    width: 300px;
    height: 250px;
    background: #E8CD7F;
    border-radius: 40% 40% 44% 40% / 35% 65% 40% 70%;
    box-shadow: inset 17px -20px 36px 24px rgba(203, 163, 44, 0.7), 
                inset 7px 8px 8px 2px rgba(149, 94, 55, 0.3),
                10px 9px 11px -13px rgba(178, 113, 49, 0.64), 
                inset 31px 0px 96px -21px #B07331;
}
```

※`border-radius`についてはこの後に解説します。

`box-shadow`は以下の値を設定できます。

```
box-shadow: {横にズラす値} {縦にズラす値} {ボカす値} {色};
```

また、`inset`を指定することで要素の内側に影をつけることができ、
さらにカンマ区切りにすることで上下左右それぞれに異なった影をつけることが可能です。
今回はじゃがいもの内側に影をつけてボカしたかったので、以下を指定しました。

```scss


box-shadow: inset 17px -20px 36px 24px rgba(203, 163, 44, 0.7),
            inset 7px 8px 8px 2px rgba(149, 94, 55, 0.3), 
            10px 9px 11px -13px rgba(178, 113, 49, 0.64), 
            inset 31px 0px 96px -21px #B07331;
```


これで、じゃがいものベースが出来上がりました。
<img width="364" alt="スクリーンショット 2019-12-15 11.10.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/94bd5802-70b8-77a0-25ee-f5946817fb41.png">

中にじゃがいもの芽を記述して完了です。
（ここでは省略するので、詳細はcodepenをみてください）
https://codepen.io/thugumi-ishimaru/pen/abzvGaq

#### border-radius：より自然な形にするスパイス
https://developer.mozilla.org/ja/docs/Web/CSS/border-radius

`border-radius`は要素の角を丸めるのに使います。
円形や、真四角のボタンを角丸にするために使用することが多いです。
今回はじゃがいもの曲線や、牛の体、切った具材の形等の変形・ご飯のモコモコ感を再現するのに使用しました。
ここでは、切った具材とご飯を例にあげます。

左上・右上・右下・左下の丸みの数値を個別で指定します。

```html
  <div class="ninjin"></div>
  <div class="jaga"></div>
  <div class="niku"></div>
```

```scss

$ninjin: #FF5F00;
$ninjinShadow: #F44A1C;
$jaga: #F2BD38;
$jagaShadow: #CE8117;
$niku: #BE6B21;
$nikuShadow: #882B11;

.ninjin {
  width: 75px;
  height: 100px;
  background: $ninjin;
  border-radius:80% 26px 60px 23px; // 左上80%,左上26px,右下60px,左下23px
  box-shadow: inset -10px 10px 0 $ninjinShadow;
  transform: rotate(95deg);
}

.jaga {
  width: 115px;
  height: 100px;
  background: $jaga;
  border-radius: 80% 76px 70px 33px;// 左上80%,左上76px,右下70px,左下33px
  box-shadow: inset -11px -5px 0 $jagaShadow;
}

.niku {
  width: 97px;
  height: 57px;
  background: $niku;
  border-radius: 70px 26px 80px 23px;// 左上70px,左上26px,右下80px,左下23px
  box-shadow: inset -6px -5px 0 $nikuShadow;
}
```

この結果がこちらです。
にんじん、じゃがいも、肉それぞれいろんな丸みを持ったものができました。
上記で紹介した`box-shadow`を使って影をつけて完了です！

<img width="371" alt="スクリーンショット 2019-12-15 0.18.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/703a30c6-bdd9-351d-f0ec-4b26bafcbffa.png">


また、丸みのあるdiv同士を重ねることでご飯のもこもこ感を表現します。

まず、ご飯の中央部分とその周りを取り巻くもこもこ用のdivを作ります。

```html

<div class="rice">
  <div class="rice_around">
    <div class="rice_aroundItem rice_aroundItem-1"></div>
    <div class="rice_aroundItem rice_aroundItem-2"></div>
    <div class="rice_aroundItem rice_aroundItem-3"></div>
    <div class="rice_aroundItem rice_aroundItem-4"></div>
    <div class="rice_aroundItem rice_aroundItem-5"></div>
  </div>
</div>
```

<img width="432" alt="スクリーンショット 2019-12-15 19.28.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/6bb7b407-59fa-8325-8f4f-3a0f6e0e076e.png">

このままではカッピカピの白米です。
インド人もびっくりです。

歯が割れちゃいけないので`.rice_aroundItem`に対して、`border-radius:50%`をつけ、丸みを出しご飯を柔らかくします。

<img width="414" alt="スクリーンショット 2019-12-15 19.28.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/cee0587c-fa80-9447-954a-049764827cb8.png">

あとは、高さ・位置を`position`を駆使して調節・中の盛られている米粒たちを
表現すれば完成です。

<img width="438" alt="スクリーンショット 2019-12-15 19.35.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/4d534ba1-efe6-1c26-39a0-a5a318c40f1a.png">


#### mask-image：角がある味（鋭角）をまろやかにするスパイス

`mask-image`は要素のマスクレイヤーとして使用する画像の設定を行います。
上記の、「丸みのあるdiv同士を繋げたけど、鋭角が気になる。。。」といったところの解決方法として使用しました。

今回はカレールーの下記枠部分の曲線を表現するのに使いました。
<img width="513" alt="スクリーンショット 2019-12-15 19.41.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/af90e5fa-1dde-7f6a-fb9b-90af5818ed57.png">

参考にした記事は以下です。
[HTML + CSSでリアルな目玉焼きを作る](https://qiita.com/nishihara_zari/items/d7dad5fbe2eb81301938)

`mask-image`と`radial-gradient`を使用して、曲線部分を作成しました。

では具体的な作り方です。

まず上記のご飯と同様に丸みのあるdivを用意します。

```html

<div class="roux">  
  <div class="roux_item roux_item-1"></div>
  <div class="roux_item roux_item-2"></div>
  <div class="roux_item roux_item-3"></div>
  <div class="roux_item roux_item-4"></div>
</div>
```

<img width="593" alt="スクリーンショット 2019-12-15 19.45.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/fea30883-7ef2-ca72-eb4a-dbb0482021b6.png">

原始人の肉みたいなのができました。
このままでは、角があり、カクカクしててカレールーには見えません。
トロッと感を出すために、ここで`mask-image`と`radial-gradient`の登場です。

まず、鋭角を隠すために`.roux_hide`を作成します。
作成した`.roux_hide`に対して、`mask-image`と`radial-gradient`を設定します。

```scss
/*色々省略*/


.roux {
    &_hide {
        background: $roux;
        position: absolute;
        z-index: 2;
        &-1 {
        width: 70px;
        height: 60px;
        -webkit-mask-image: radial-gradient(circle at 50% -170%, rgba(0, 0, 0, 0) 80%, #BB5B2A 80%);
        top: -43px;
        left: 108px;
        transform: rotate(-1deg);
        }
        &-2 {
        width: 70px;
        height: 50px;
        right: -32px;
        top: 92px;
        transform: rotate(85deg);
        -webkit-mask-image: radial-gradient(circle at 50% -180%, rgba(0, 0, 0, 0) 80%, #BB5B2A 80%);
        }
        &-3 {
        width: 60px;
        height: 80px;
        -webkit-mask-image: radial-gradient(circle at 20% -130%, rgba(0, 0, 0, 0) 90%, black 90%);
        transform: rotate(-173deg);
        top: 95%;
        right: 32%;
        }
        &-4 {
        width: 40px;
        height: 80px;
        -webkit-mask-image: radial-gradient(circle at 20% -160%, rgba(0, 0, 0, 0) 90%, black 90%);
        transform: rotate(-93deg);
        top: 150px;
        left: -39px;
        }
    }
}
```

その結果がこちらです。

<img width="587" alt="スクリーンショット 2019-12-15 19.51.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/6312dafe-81a0-33d7-53a1-4154fb69cb0d.png">



`mask-image`で作成した要素（`.roux_hide`）のくり抜きを設定し、`radial-gradient`で円の中心位置、サイズ、色を指定し透明にくり抜くようにしています。

### 盛り付け：お母さん「ご飯よーーーーーーー！！！！！」

色々と端折りましたが、ついに盛り付けです。

~~実家のカレーはルーを真上からかけます。~~

1つ1つのパーツをAtomsから作成したので、codepenで作成したもの1つ１つをコピペでペッと貼るだけです。
その後、位置・サイズ調整等を行い、カレーライスの！！！完成です！！！！！！

<img width="963" alt="スクリーンショット 2019-12-14 20.06.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/92cb02f6-167b-90e5-2722-fae4e4cc4cd3.png">

## さいごに

HTMLとCSSだけでカレーライスを作りました。
CSSでお絵かきする時に以下3つを覚えてってください！

* box-shadow：影をつけるよ
* border-radius：丸みを出してふんわりさせるよ
* mask-image（IEは対応してません😈）：滑らかな曲線にするよ

[Twitter](https://twitter.com/tsugu_maru_san)やってます！よかったらフォローしてみてください！

ありがとうございましたー！
カレーアドベントカレンダー引き続きよろしくお願いします。