【CSS】枠線つきの三角形を作る方法。対角線を使った三角形を使って吹き出しを作る。

##枠線つきの三角形を作る方法。対角線を使った三角形を使って吹き出しを作る。

CSSで枠線つきの三角形を使った吹き出しを作る際に、四辺のどれか２つを使う三角形は比較的に簡単にできたが、

**対角線を使った三角形**を作るのに手間取ったので、その作り方について。


##完成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/fa4a1955-5f18-69aa-a193-1a244553ad47.png)

画像を設置して、その横に吹き出しを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/d6bdb7a8-4c7b-5f19-d0c9-ca19f82d3a71.png)

欲しい三角形は上図の右側。対角線を使ったもの。



<br>
##目次
2. [作り方](#作り方)
3. [吹き出しのコード](#吹き出しのコード)
4. [画像も含めたコード](#画像も含めたコード)
5. [対角線を使った三角形の作成方法の詳細](#対角線を使った三角形の作成方法の詳細)
    6. [単なるdivタグ](#単なるdivタグ)
    7. [色分けして確認](#色分けして確認)
    8. [横幅をなくす](#横幅をなくす)
    9. [borderの数による四角形の形の違い](#borderの数による四角形の形の違い)
10. [対角線を使った三角形を作る方法](#対角線を使った三角形を作る方法)
    11. [４辺を指定した三角形のうち、２辺を透明にする](#４辺を指定した三角形のうち２辺を透明にする)
    12. [２辺を指定した三角形のうち、１辺を透明にする](#２辺を指定した三角形のうち１辺を透明にする)


<br>
##作り方
divタグを使って対角線を使った三角形に枠線をつけることはできない。

このため、**枠線の色で塗り潰した三角形を作って、上から少し小さい白い三角形を重ねる**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/6832a1f8-56ce-464c-33b4-a1d4c1370358.png)

グレーの三角を重ねた場合のイメージ。（白だと見えないので）

吹き出しの外枠をdivタグで作成し、枠線の三角を`::before`で、内側の白い三角形を`::after`で作って配置する。


<br>
##吹き出しのコード

```html:.html
<div class="img-balloon_balloon">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
```

```css:.css
.img-balloon_balloon {
  margin-left: 24px;
  padding: 16px;
  width: 100%;
  font-size: 15px;
  color: #333;
  border: solid 1px #ccc;
  border-radius: 8px;
  position: relative;
}
.img-balloon_balloon::before {
  content: "";
  border-left: 16px solid transparent;
  border-top: 16px solid #ccc;
  position: absolute;
  top: 16px;
  left: -16px;
}
.img-balloon_balloon::after {
  content: "";
  border-left: 15px solid transparent;
  border-top: 15px solid white;
  position: absolute;
  top: 17px;
  left: -14px;
}
```

以上で吹き出しが完成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/57f27199-bd86-d98b-fb2d-629fe29639cc.png)


<br>
##画像も含めたコード
画像と吹き出しを横並びにするため、`display:flex`を使う。

位置は上端合わせにするため、`align-items: flex-start;`も適用する。


```html:.html
<div class="img-balloon_balloon">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
```

```css:.css
.img-balloon_wrapper {
  margin: 8px 0;
  display: flex;
  align-items: flex-start;
}

.img-balloon_img {
  width: 64px;
  height: auto;
}

.img-balloon_balloon {
  margin-left: 24px;
  padding: 16px;
  width: 100%;
  font-size: 15px;
  color: #333;
  border: solid 1px #ccc;
  border-radius: 8px;
  position: relative;
}
.img-balloon_balloon::before {
  content: "";
  border-left: 16px solid transparent;
  border-top: 16px solid #ccc;
  position: absolute;
  top: 16px;
  left: -16px;
}
.img-balloon_balloon::after {
  content: "";
  border-left: 15px solid transparent;
  border-top: 15px solid white;
  position: absolute;
  top: 17px;
  left: -14px;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/5134cebd-a797-a46c-4c2c-5acac37042a7.png)



<br>
##対角線を使った三角形の作成方法の詳細
対角線を使った三角形について細かく見てみる。

###単なるdivタグ
まずはベースとして、単なるdivタグに枠線をつけた状態を確認。

```css:.css
.sankaku{
  border: 32px solid yellowgreen;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/7091f06b-618d-3173-bb15-d25e9032eab8.png)

divタグは**ブロック要素のため横幅の指定がないと画面いっぱいに広がる**。この四角形が、どのように構成されているかを知ることがカギとなる。

**四角形は、boarder-top, -right, -bottom, -leftの４つの要素で構成される**。

```:
border: 32px solid yellowgreen;
```

↓　同じ

```
border-top: 32px solid yellowgreen;
border-right: 32px solid yellowgreen;
border-bottom: 32px solid yellowgreen;
border-left: 32px solid yellowgreen;
```

なので、**boarderで指定したdivタグの高さはtopとbottomを合わせた、64px = 32px + 32pxとなる**。（※32pxでないことに注意！）



###色分けして確認
わかりやすくそれぞれを色分けしてみる。

```css:
.sankaku{
  border-top: 32px solid yellow;
  border-right: 32px solid blue;
  border-bottom: 32px solid pink;
  border-left: 32px solid red;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/82d9807c-6716-643d-08b0-d41148c118f6.png)

横幅は指定してないので、画面幅に合わせて変化する。


<br>
###横幅をなくす
`display: inline-block`とすることで、横幅を中の要素に合わせることができる。

- 中身なしの場合、縦幅・横幅は０ｐｘ（外側に枠線borderが表示される）
- 中身がある場合はその長さに自動調整される。

```css:.css
.sankaku{
  display: inline-block;
  border-left: 32px solid red;
  border-right: 32px solid blue;
  border-bottom: 32px solid pink;
  border-top: 32px solid yellow;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/ed9294c8-cfba-d353-f927-56a66240d97f.png)

ここで単純に、黄色と赤色の２つで対角線を使った三角形が作れるじゃん！と思うとborderのワナにハマる、、、

指定してある要素の数（borderの数）によって四角形の形が大きく変わってくる。


<br>
**▼（参考）中身を入れた場合**

`<div class="sankaku">中身がある場合</div>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/1f9df037-165d-d0f1-ba74-894f677cf5de.png)


##borderの数による四角形の形の違い

borderを指定する数によって、形状が変化していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/d95ae212-b4b9-eca3-155f-8fb6f6c4b1d0.png)

- 4辺を指定：　大きな正方形
- 3辺を指定：　長方形
- 2辺を指定：　小さな正方形


###2辺を指定した小さな正方形
小さな正方形は指定の組み合わせによって、同じ形状が作れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/00b82ca8-30fa-ac2b-6859-d5b706a17ccc.png)

なお、border-topと-bottom,  border-leftと-rightの組み合わせは何も表示されない。



<br>
##対角線を使った三角形を作る方法
対角線を使った三角形を作る方法は２つある。

- ４辺を指定した三角形のうち、２辺を透明にする
- ２辺を指定した三角形のうち、１辺を透明にする


###４辺を指定した三角形のうち、２辺を透明にする

```css:.css
.sankaku{
  display: inline-block;
  border: 32px solid transparent;
  border-top: 32px solid yellow;
  border-right: 32px solid blue;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8f718f12-2c20-bce7-b07a-0c7bc459f8e1.png)

この色を同じ色にすれば、対角線を使った三角形になる。


▼実態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/c99a44ae-cad7-becf-9c21-cf23234f5647.png)


上記はborderで４つまとめてtransparentに設定した後に上書きしたが、４つそれぞれを設定するのでも同じ。

```css:.css（同等）
.sankaku{
  display: inline-block;
  border-top: 32px solid yellow;
  border-right: 32px solid blue;
  border-bottom: 32px solid transparent;
  border-left: 32px solid transparent;
}
```

コード量からすると、borderを使い、上書きする方が少ない。



<br>
##２辺を指定した三角形のうち、１辺を透明にする

```css:.css
.sankaku{
  display: inline-block;
  border-top: 32px solid yellow;
  border-left: 32px solid transparent;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/161ef53a-6386-40d8-6ad5-7d318500a60e.png)


**▼実態**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e9586ece-e30d-2726-790c-b4d7bf6d1f57.png)


<br>
上記は、-topと-leftを使ったが、-bottomと-rightでも作成できる。

```css:.css
.sankaku{
  display: inline-block;
  border-right: 32px solid blue;
  border-bottom: 32px solid transparent;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/a72e34f9-1684-3fa2-0b13-be9274be2729.png)