CSSで作図する

Webページを作るときに細かいパーツならCSSだけで済ますことが多くなってきています。
そこでCSSで作成できる図形についてまとめ、少し複雑な図形の作り方についてまとめます。

## 基本図形
以下の図形を組み合わせて作図していきます。

### 四角形
基本中の基本。
長方形や正方形が作れます。

```css
.square {
   width: 100px;
   height: 100px;
   background: black;
}
```

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

![square.png](https://qiita-image-store.s3.amazonaws.com/0/42193/cf7ed614-7d43-92d0-1180-c83ff1307cf7.png)

### 円
`border-radius`を設定することで円を作成することができます。
width/heightの2分の1以上の値を設定することで円になります。

```css
.circle {
   width: 100px;
   height: 100px;
   background: black;
   border-radius: 50px;
}
```

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

![circle.png](https://qiita-image-store.s3.amazonaws.com/0/42193/92b981af-61e3-13ab-5c98-099daf4e7f99.png)

### 角丸の四角形
円にしない程度の`border-radius`を設定します。
角ごとに個別の値を設定することもできます。

```css
.square2 {
   width: 100px;
   height: 100px;
   background: black;
   border-radius: 40px 0 40px 0; /*左上,右下に40px*/
}
```

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

![square2.png](https://qiita-image-store.s3.amazonaws.com/0/42193/df70cd57-d50d-8660-3feb-0454b5a06e02.png)

### 三角形
borderの境目(top/rightなどの境目)が斜めになっていることを利用する。
![border.png](https://qiita-image-store.s3.amazonaws.com/0/42193/6995bce8-5514-a545-f721-86425b3cac30.png)
上向きの三角形が欲しいなら以下のように設定する。

```css
.triangle {
    width: 0px;
    height: 0px;
    background: transparent;
    border-bottom: 150px solid black;
    border-left: 100px solid transparent;
    border-right: 100px solid transparent;
}
```

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

![triangle.png](https://qiita-image-store.s3.amazonaws.com/0/42193/0b6a9f4c-8d13-7953-3388-a6d36a55de71.png)

## 変形
`transform`プロパティに値を設定することで様々な変形を行うことができます。
よく使う物として以下に挙げる`scale`と`rotate`があります。
これらの変形は組み合わせて使用することができます。

### 拡大/縮小
`transform`プロパティに`scale`を設定することでサイズを変更することができます。

```css
.square-scale {
   width: 100px;
   height: 100px;
   background: black;
   transform: scale(2);
}
```

```html
<div class="square-scale"></div>
```

![square-scale.png](https://qiita-image-store.s3.amazonaws.com/0/42193/bae3cefc-26dd-5bc9-27b0-527740e84afa.png)

### 回転
`transform`プロパティに`rotate`を設定することで回転することができます。
回転する中心はデフォルトでは図形の真ん中となっていますが、`transform-origin`プロパティを設定することで変更することもできます。

```css
.square-rotate {
   width: 100px;
   height: 100px;
   background: black;
   transform: rotate(45deg);
}
```

```html
<div class="square-rotate"></div>
```

![square-rotate.png](https://qiita-image-store.s3.amazonaws.com/0/42193/1e780f7f-cdd5-740d-29a0-b43d41be3036.png)

## テクニック
CSSで作図するときに重要になってくるのが少ない要素で作図するということです。
図形を作るために複数の要素をhtmlに書かなくてはならないと少しめんどく感じます。
そこでそのためのいくつかのテクニックをいくつか紹介します。

### before/after擬似要素を使用する
before/after擬似要素を使用することで本来の要素と合わせて最大3つの図形を組み合わせて作図することができます。

```css
.mountain {
   margin-top: 100px;
   width: 100px;
   height: 30px;
   background: black;
   position: relative;
}

.mountain:before {
   content: "";
   display: block;
   width: 80px;
   height: 30px;
   background: red;
   top: -30px;
   left: 10px;
   position: absolute;
}
.mountain:after {
   content: "";
   display: block;
   width: 50px;
   height: 30px;
   background: yellow;
   top: -60px;
   left: 25px;
   position: absolute;
}
```

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

![mountain.png](https://qiita-image-store.s3.amazonaws.com/0/42193/dacef10e-f4d0-aef2-5790-a65f48c85032.png)

### box-shadowで図形を使いまわす
`box-shadow`は本来影を付けるためのプロパティですが、このプロパティは複数設定が可能なため図形の使い回しが可能になります。

```css
.four-circle {
   width: 50px;
   height: 50px;
   border-radius: 25px;
   background: black;
   box-shadow: 
       60px 0,
       0 60px,
       60px 60px;
}
```

```html
<div class="four-circle"></div>
```

![four-circle.png](https://qiita-image-store.s3.amazonaws.com/0/42193/44a71ce2-be30-2141-144d-d82729715b74.png)

## 応用
以上のことを踏まえるといろいろな図形が作図できるようになります。
デベロッパーツールを使用しながら少しずつ位置を調整していくといい感じになります。
一つのhtmlの要素のみで完結させる場合使える図形は3つになることを頭に置きながら作図していきます。

### 電池サンプル1
今回のサンプルでは枠・バー・枠についている突起の3つのパーツで構成されています。

```css
.battery {
    border: 8px solid black;
    width: 50px;
    height: 30px;
    position: relative;
}

.battery:before {
    content: "";
    display: block;
    position: absolute;
    width: 10px;
    height: 25px;
    top: 3px;
    left: 2px;
    background: black;
    box-shadow: 
       13px 0,
       26px 0;
}

.battery:after {
    content: "";
    display: block;
    position: absolute;
    width: 10px;
    height: 20px;
    top: 6px;
    left: 57px;
    background: black;
}
```

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

![battery.png](https://qiita-image-store.s3.amazonaws.com/0/42193/20f1fd60-389b-90c1-1fd1-96b6f09d0446.png)

### 電池サンプル2
サンプル1では中のバーと突起で別々に作成していましたが、無駄が多いので以下のようにしてパーツ数を節約することができます。
ポイントは一つのパーツを小さく作って`box-shadow`で使いまわすという点です。

```css
.battery {
    border: 8px solid black;
    width: 50px;
    height: 30px;
    position: relative;
}

.battery:before {
    content: "";
    display: block;
    position: absolute;
    width: 10px;
    height: 20px;
    top: 3px;
    left: 2px;
    background: black;
    box-shadow: 
       0 4px,
       13px 0,
       13px 4px,
       26px 0,
       26px 4px,
       56px 3px;
}
```

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

![battery2.png](https://qiita-image-store.s3.amazonaws.com/0/42193/9c696af8-48f3-8451-639c-401c1b30cd33.png)