自分で描いた絵を手書きでcss化する遊び

世の中にはcssで絵を描く人がいます。手法も色々で、div1つにbox-shadowのみであらゆる絵を描くようなものから、ドット絵やその他様々です。
自分も急にやりたくなったのでチャレンジしました。
今回はdivはそれなりに書く感じでわりと簡単そうなイラストを描いていきます。

## 作業環境
- CodePenを使用してでhamlとscssで書いています。環境構築不要で、テンプレートエンジンやCSSプリプロセッサが使えます
- hamlは慣れからのチョイスですが、htmlのテンプレートエンジンを考えると普通はPugになるでしょうか。divタグしか使用していないので、hamlを知らずとも雰囲気で見ることができると思います
- scssはStylusなどもっと簡素に書けるものもありますが、こちらも慣れです…

## うさぎ

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="eYjMXKQ" data-user="yuro1600" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yuro1600/pen/eYjMXKQ">
  うさぎさん</a> by kotomi (<a href="https://codepen.io/yuro1600">@yuro1600</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

アイコンのイラストを元にしています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/0dfa4b29-8f62-6155-677f-6728dbcfd685.png" width="200">

### 使ったcssとwebツール
#### border-radius

https://developer.mozilla.org/ja/docs/Web/CSS/border-radius

角丸や楕円を作るcssですが、最大8箇所値を指定できるのでわりとあらゆる丸みを帯びた形を作成できます。

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Backgrounds_and_Borders/Border-radius_generator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/c311e926-d713-280c-c864-d45862a9b543.png)
勘で作る場合や、どこに何の値を入れるのか忘れるうちはこういったツールを使うと自由な形を作る足掛かりになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/56291a4b-8632-e89b-36c4-b4045a01eb92.png)
顔や耳などの楕円を作っています。

```.scss
&__face {
    bottom: 0;
    width: 200px;
    height: 120px;
    background-color: $white;
    border-radius: 68px 57px 90px 90px / 114px 114px 80px 60px;
```

#### transform

https://developer.mozilla.org/ja/docs/Web/CSS/transform

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/623b5234-b20b-1c36-f0d6-40743d5bd8c2.png)
このうさぎを書くときは複雑なことは何もしていないので、残りは角度を変えたくらいです

```.scss
&__ear {
    top: 10px;
    width: 60px;
    height: 130px;
    background-color: $white;
    box-shadow: 5px 0 0 6px $brown, -2px -5px 0 6px $brown;
    
    &--right {
      right: 14px;
      border-radius: 60px 40px 10px 10px / 90px 140px 80px 80px;
      transform:rotate(10deg)
    }
    &--left {
      left: 20px;
      border-radius: 60px 60px 10px 10px / 140px 90px 80px 80px;
      transform:rotate(-1deg);
    }
  }
```

## 女の子

うさぎで何となくどういうことなのかわかったので、ここから実践編です。
うまくできなかった部分も多いので、これからも修行します…。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="dyjmBOx" data-user="yuro1600" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yuro1600/pen/dyjmBOx">
  寒そう</a> by kotomi (<a href="https://codepen.io/yuro1600">@yuro1600</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### ラフ
流石に無からは描けないので、完成イメージのイラストを用意しました。
おそらくここできっちり寸法を決めておくとcssに起こしていく作業も簡単になると思われるのですが、それならcssでやらなくても良いのでは？？？と思ってしまうことをやめられなかったのでこの状態でいきます。いきなり参考にならないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/1227f3b5-3be1-fc88-6f66-88370cf6f00b.png)

### 背景

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/931ad60e-b65e-890e-88b1-7db9dfb9df61.png)
まずは夜景を用意します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/596a904b-0d70-fcf5-04f4-8e8d0e703045.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/64f866f1-b2ef-660e-d5be-975aa066f86c.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/6b2c388f-21b9-abf9-f546-a997f84a6d8a.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/777aa083-91c3-6b71-0560-8a2f95c0efc1.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/aa5781f3-a702-bf71-f0dd-38394746254f.png">

月は擬似要素とbox-shadowで作っています。今回は背景と同じ色で誤魔化していますが、clip-pathで切り抜く感じにも作れそうです。

```.scss
&__moon {
      width: 40px;
      height: 40px;
      background-color: $sora;
      border-radius: 100%;
      box-shadow: 0 16px 0 5px $yellow, 0 16px 4px 6px rgba(255, 230, 126, 0.6),
        inset 0 0 4px 1px rgba(255, 230, 126, 0.6);
      transform: rotate(60deg);
      top: 10px;
      left: 40px;
      &::before {
        content: "";
        width: 41px;
        height: 40px;
        background-color: $sora;
        border-radius: 100%;
        top: -5px;
        left: 0;
      }
    }
```

### グラデーション

https://cssgradient.io/

各所にグラデーションを使用していますが、これもwebツールが色々あるので好みで使うと良いと思います。
ちなみに色相が離れた色でグラデーションを作りたいとき、2色の指定だと中間が濁ってしまいます。その場合中間の色を指定してあげると濁らない色にできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/c322c95c-23f4-54ba-50ee-0101fa4f13c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/ed3c0668-fbb7-8798-596e-3b1e49b27dc0.png)

### 重ね合わせの要素

擬似要素とbox-shadowで重なりを作っています。
box-shadowは元の要素を大きさや位置を変えて複製するようなものですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/2e8f5731-9603-6c12-c417-c44eb7afca70.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/a33ef8b7-ccd7-4a02-b00b-d45e907191ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/d2f585e3-1514-b9ba-f28b-7c0b63106f80.png)

```.scss
&__eye {
      width: 20px;
      height: 30px;
      background: linear-gradient(
        0deg,
        rgba(204, 99, 52, 1) 0%,
        rgba(83, 47, 22, 1) 100%
      );
      border-radius: 40% 60% 60% 40% / 50% 50% 30% 30%;

      &::before {
        content: "";
        width: 10px;
        height: 10px;
        background: radial-gradient(
          circle,
          rgba(255, 237, 232, 1) 45%,
          rgba(255, 255, 255, 0) 100%
        );
        border-radius: 50% 40% / 60% 30%;
        top: 0;
        left: 1px;
        box-shadow: 4px 17px 0px 2px rgba(240, 155, 58, 0.3);
      }
      &::after {
        content: "";
        width: 5px;
        height: 6px;
        background-color: $hair2;
        border-radius: 100%;
        top: 12px;
        left: 8px;
      }
```

### clip-path

https://developer.mozilla.org/ja/docs/Web/CSS/clip-path

髪の毛はclip-pathで切り抜いて毛先の表現を作りました。画像などの要素を任意の形や指定のパスで切り抜くプロパティです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/0c1e27db-b790-4fe9-31e7-3df5b989b8a7.png)

clip-pathもwebツールで簡単に使えます。

https://bennettfeely.com/clippy/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60754/3c4b2301-fbfd-7571-b2ac-00d5525c015f.png)
clip-pathで指定する頂点に対応した色がついているので、表示を見ながら対応箇所を微調整するのも容易です。

こんな感じで諸々行い冒頭のイラストを作成しました！

## まとめ
- 丁寧に下絵を用意したり寸法を見たりなどの準備はあった方がいいです（私はすべて見切り発車でした）
- 普段の業務でちょっとした装飾要素ならcssで作れるかも！という気持ちになれます
- 次はこれをアニメーションしたいです
- どちらかというと普通に絵がうまくなりたいです


## 参考にしたページやツール
https://toranoana-lab.hatenablog.com/entry/2020/12/15/103753

https://qiita.com/nezurika/items/47d2ffed4212bbab99f0

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Backgrounds_and_Borders/Border-radius_generator

https://bennettfeely.com/clippy/

https://cssgradient.io/