CSSで画像を八角形に切り抜く

画像をどうしても変わった形で切り抜きたくって、
試行錯誤と表示崩れのご指摘いただきながらも、なんとか完成させれたのでメモメモ。

## 完成した形
画像を背景に指定して、八角形に切り抜く。
<img width="491" alt="スクリーンショット 2016-10-20 4.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/d5acaf99-72fe-31b6-133f-d8cdd5f50599.png">



## 作り方と考え方

### STEP1 : キホンの要素を作り、正方形にしたdivに写真を入れる
- htmlに入れ子になった３つクラスを準備する

```html
<div class="photo_wrap">
　<div class="photo">
  　　<div class="photo_frame"></div>
　</div>
</div>
```

- 真ん中のdivのサイズを指定し、正方形にする。
- 背景に画像を指定する。
- 画像の表示サイズをcoverにする。

```css
.photo_wrap {
}

.photo {
  width: 200px;
  height: 200px;
  background-image: url("http://urx.red/up2U");
  background-size: cover;
}

.photo_frame {
}
```
こんな感じ
<img width="561" alt="スクリーンショット 2016-10-20 4.06.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/202c62ac-ce27-2286-7b40-fbaf885d2f0f.png">


### STEP2 : ２つの正方形である、写真と枠線を重ねて八角形を作る
- .photoに枠線をつけます。ちょっと太めに。
- position: relative;を指定する。

```css
.photo_wrap {

}
.photo {
  width: 200px;
  height: 200px;
  background-image: url("http://urx.red/up2U");
  background-size: cover;
  
  border: 20px solid #fbfaf6;
  position: relative;
}
.photo_frame {
}
```

次に、写真に重ねるための枠線を作ります

- photo_frameを幅と高さを100%にして正方形にする。
- 写真に対してぴったり中央揃えにしたいのでpositionは`absolute`に。`top:50%`、`left:50%;`指定。
- borderを指定して枠線を作る。ガッツリ太めに。
- 45度傾けます。

```css
.photo_frame {
  width: 100%;
  height: 100%;
  position: absolute;
  top:50%;
  left: 50%;
  border: solid 80px #fff;
  transform: translate(-50%,-50%) rotate(45deg);
}
```


ここまででこんな感じになるはず。
<img width="589" alt="スクリーンショット 2016-10-20 4.15.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/fd03018a-16e8-55bc-3a73-8e25d05799a3.png">
八角形が見えてきました。

### STEP3 : はみ出した余計な部分を隠す
ここでやっと.photo_wrapの出番です。

- overflow: hidden;を指定しはみ出しを隠す

```css
.photo_wrap {
  overflow: hidden;
}
.photo {
  width: 200px;
  height: 200px;
  background-image: url("http://ur0.link/ujc9");
  background-size: cover;

  border: 20px solid #fff;
  position: relative;
}
.photo_frame {
  width: 100%;
  height: 100%;
  position: absolute;
  top:50%;
  left: 50%;
  border: solid 80px #fff;
  transform: translate(-50%,-50%) rotate(45deg);
}
```
<img width="447" alt="スクリーンショット 2016-10-20 4.18.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/01c1aa4c-402f-61f8-4995-13a16ecab4c1.png">

あとはお察しの通りborderを背景色と同じ色にすればきれいな八角形になります！完成！
<img width="491" alt="スクリーンショット 2016-10-20 4.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/aed0eba0-1a9b-4d13-030e-efd209564a50.png">


## ちょっと応用とか余談
八角形にこだわらず.photo_frameのサイズを調節すれば枠のサイズを変えれるのでアレンジできるので
応用できることを頭に入れとくと使えるかも。border消してみたり。などなど。

<img width="398" alt="スクリーンショット 2016-10-20 4.43.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/109208/e7a0f301-b657-df17-8d5b-56a41e4726e5.png">

```css
.photo_wrap {
  overflow: hidden;
}
.photo {
  width: 200px;
  height: 200px;
  background-image: url("http://ur0.link/ujc9");
  background-size: cover;

  //border: 20px solid #fff;
  position: relative;
}
.photo_frame {
  width: 120%;
  height: 120%;
  position: absolute;
  top:50%;
  left: 50%;
  border: solid 80px #fff;
  transform: translate(-50%,-50%) rotate(45deg);
}
```


## 参考
[CSSで画像の四隅に三角をつけてイイカンジの枠組みっぽくする](http://qiita.com/potato4d/items/b31aefb7114ed9b348ea)
ここをベースに考えさせてもらいました。あとわかりやすかったので、文章の構成も参考にさせてもらいました！ありがとうございますー！