ゲーミングPCっぽく光るCSSのレシピ

## これは何

- ふと「ゲーミングPCっぽい光り方をCSSで書けないかな〜」と思って作ってみたものです
- あまり実用性はありません、一発芸としてご認識ください

## 完成品

このように光ります

<p class="codepen" data-height="500" data-theme-id="dark" data-default-tab="css,result" data-user="xrxoxcxox" data-slug-hash="NWNRLZr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Like a gaming pc">
  <span>See the Pen <a href="https://codepen.io/xrxoxcxox/pen/NWNRLZr">
  Like a gaming pc</a> by Keisuke Watanuki (<a href="https://codepen.io/xrxoxcxox">@xrxoxcxox</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 作り方

### 1. 背景を用意する

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/21dc6744-59b4-d2b5-15ec-8741c338ccbc.png)

- 白背景だと「光ってる」感の演出が難しいので、背景を暗くします
    - この段階のスクショだと何も分かりませんね

```html:index.html
<div class="container"></div>
```

`scss:style.scss
.container {
  background-color: #000;
  display: grid;
  height: 400px;
  place-items: center;
  width: 100%;
}
`

- Tips
    - `display: grid;`と`place-items: center;`の2行だけで上下中横揃えができます

### 2. `@keyframes`を用意する

- 色の変化を定義しています

```scss:style.scss
@keyframes rainbow {
  0% {
    background-color: red;
  }
  14% {
    background-color: orange;
  }
  28% {
    background-color: yellow;
  }
  42% {
    background-color: green;
  }
  56% {
    background-color: aqua;
  }
  70% {
    background-color: blue;
  }
  84% {
    background-color: purple;
  }
  100% {
    background-color: red;
  }
}

```

### 3. メインの光を用意する

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/c90ee45c-3c3d-7db5-d5da-d82e8831ce93.png)

- 静止画なので伝わりづらいですが、この段階で7色に変化するボックスが完成しています

```html:index.html
<div class="container">
  <div class="box"></div>
</div>
```

`scss:style.scss
.box {
  animation: rainbow 5s infinite;
  filter: blur(10px);
  height: 120px;
  position: relative;
  width: 120px;
  will-change: filter;
}
`

- Tips
    - フチを`filter: blur(10px);`とぼかすことで、光の表現っぽくなります
    - `will-change: filter;`はスタイリングには必要ないのですが、iOS Safariではこういった記述をしないと上手く表示してくれないので記載しています

### 4. 中心の光り方に変化をもたせる

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/11b09d74-4e7b-882b-063f-1b2d71fa6d0a.png)

- すごーく微妙な差ですが、均一な光り方だったのに対し、今は中心の色を少し変えています
    - 実際のゲーミングPCの画像を見ると、中心が少し明るかったのでそれを再現しています

```scss:style.scss
.box {
  &::before {
    background:
      radial-gradient(
        yellow,
        transparent
      );
    content: "";
    height: 100px;
    left: 10px;
    mix-blend-mode: overlay;
    position: absolute;
    top: 10px;
    width: 100px;
  }
}
```

- Tips
    - `yellow`から`transparent`へと色が変化する円形のグラデーションを先ほどのボックスに重ねて配置
    - `mix-blend-mode: overlay;`で良い感じに色が混ざるように指定

### 5. 光り方にエッジをつける

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/54c678a2-f7e4-5644-dd09-491c3d2b8b61.png)

- 今は周辺を単にぼかしているだけですが、実際はそんなに簡単な表情でもありません
    - 光るパネルがあるとして、パネルの幅まではエッジの効いた光り方、それより外側に少し光がもれて輪郭がぼやっとする、そんなイメージです

```scss:style.scss
.box {
  &::after {
    animation: rainbow 5s infinite;
    content: "";
    height: 100px;
    left: 10px;
    mix-blend-mode: screen;
    position: absolute;
    top: 10px;
    width: 100px;
  }
}
```

- Tips
    - 最初に作った光の枠よりひとまわり小さな光を用意します
    - `mix-blend-mode: screen;`で際立たせます

### 完成

- 最初に載せたものと同じですが、改めて全てを合わせるとこのように光ります
- 背景以外は1つのdivだけで作れます
    - ゲーミングPCっぽいあしらいを作りたいなあと思ったときにいかがでしょうか

<p class="codepen" data-height="500" data-theme-id="dark" data-default-tab="css,result" data-user="xrxoxcxox" data-slug-hash="NWNRLZr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Like a gaming pc">
  <span>See the Pen <a href="https://codepen.io/xrxoxcxox/pen/NWNRLZr">
  Like a gaming pc</a> by Keisuke Watanuki (<a href="https://codepen.io/xrxoxcxox">@xrxoxcxox</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>