【完走賞ゲットだぜ！】CSSでタイマーボールを作る！

## はじめに
みなさん初めまして。🎅🏻

Qiita株式会社でUI/UXデザイナーとして、情報設計、体験設計(UX)、UIデザイン、フロントエンドまで携わっている @degudegu2510 です。

今年のQiita Advent Calenar 2022では、1つのアドベントカレンダーに1人で25記事を投稿しきった方 **全員** に完走賞がおくられる企画を開催しています。🎉 🎉 

Qiita運営として、ユーザー様だけに25記事完走してもらうのは、とても忍びないので、私も25記事完走しようと思います。

この記事は、そのカレンダーの18記事目です。

18記事目は、 「**【完走賞ゲットだぜ！】CSSでタイマーボールを作る！**」です。

タイマーボールは、ターン数がかかればかかるほどポケモンが捕まえやすくなるボールです。
そのため、捕まえるのに30ターン近くかかってしまったポケモンには積極的に使いたいボールです。

この記事では、CSSで作るタイマーボールを紹介しようと思います。


## 完成形
完成形は**↓こちら**です。
影やアニメーションを用いて、球体を表現しています。
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="MWXGqNq" data-user="sp_degu" 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/sp_degu/pen/MWXGqNq">
  タイマーボール3d</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 作成手順
では、早速作って行きましょう！

### 01. タイマーボールの外形を作る
まずは、↓このようなタイマーボールの外形を作って行きましょう！
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/21b29bfc-e78e-acea-3d21-ef19a3097bc9.png)

まず、この外形を作るために複数のグラデーションを重ねて作っていきます。

構造としては以下の画像のような形で、`radial-gradient`を使い、赤い部分を作成し、その上から、`linear-gradient`を使って色を重ねています。

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b69dcc72-4927-5a3c-4580-cf8306583098.png)

これをCSSで表現すると以下のようになり、
上から、`グレーの線を作る` → `左側の赤い部分` → `右側の赤い部分` を表現しています。
```sample.css
div {
  background:
    linear-gradient(#545351 22%, transparent 22% 46%, black 46% 54%, transparent 54%),
    radial-gradient(circle at 100% 60%, transparent 76%, #CE1C2C 76%),
    radial-gradient(circle at 0% 60%, #E6E3DA 76%, #CE1C2C 76%);
}
```

このようにすることで、以下のような形になります。
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="yLEQjNZ" data-user="sp_degu" 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/sp_degu/pen/yLEQjNZ">
  タイマーボール3d</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 02. タイマーボールの内部を作る
次に、↓このようなタイマーボールの内側の部分を作って行きましょう！
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/bc8fe3af-0e5e-51b8-f0ee-3e36ffedca91.png)



タイマーボールの内部の模様は、`.pattern`で上部の赤い部分を作成し、`position: absolute;`でいい感じの位置に配置しています。

また、タイマーボールが、立体的に見えるように、中のボタンに`box-shadow`を使い２種類の影を使っています。
２種類の影の影を使うための`box-shadow`は以下のように、1種類の影ごとに`,`区切ると複数の影を使うことができます。

```sample.css
div {
  box-shadow: 2px 2px 4px rgba(0,0,0,0.2), -3px -3px 4px rgba(255,255,255,0.2);
}
```

このように、`box-shadow`で２種類の影を使い、ボタン部分を作成して、内部の模様を作りました。
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="MWXzGwx" data-user="sp_degu" 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/sp_degu/pen/MWXzGwx">
  タイマーボール3d</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

※ ついでに、ボタンを押せるようにしてみました。


### 03. タイマーボールを立体的に見えるようにする
次に、↓このようにタイマーボールが立体的に見えるようにして行きましょう！
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c145094e-f500-5a66-2c04-09a6e0535ea8.png)

`box-shadow`を使って、内側に影をつけて、上部の赤い部分にも影をつけてあげると、立体感が出ます。
内側に影を出すためには、 `box-shadow` に `inset` を追加することで、内側になります。

```sample.css
.base::after {
  content: "";
  box-shadow: -20px -10px 40px rgba(0, 0, 0, .5) inset;
  border-radius: 50%;
  height: 100%;
  position: absolute;
  width: 100%;
}

.pattern {
  box-shadow:
    2px 2px 4px rgba(255, 255, 255, 0.4) inset,
    -2px -2px 4px rgba(0, 0, 0, 0.4) inset;
}
```

このように`::after`に`box-shadow`で影を作ることで、模様も含めて、影を追加することができます。
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="ZERmoGZ" data-user="sp_degu" 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/sp_degu/pen/ZERmoGZ">
  タイマーボール3d</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


### 完成. タイマーボールをアニメーションさせる
最後にアニメーションさせたら、完成です。

タイマーボールには、時計の針が進んでいるように見えるアニメーションを再現するため、
長針と短針の`div`を用意して、回転するCSS Animationを追加します。

まずは以下のように、HTML と CSSを追加して、時計の針が進むアニメーションを作成していきます！
また、アニメーションする時間を長針と短針で変えることで、回転する速さを変えています。

```sample.html
<div class="clock">
  <div class="long hand"></div>
  <div  class="short hand"></div>
</div>
```

```sample.css
.long {
  height: 300px;
  clip-path: polygon(40% 0, 60% 0, 100% 50%, 50% 100%, 0 50%);
  background: linear-gradient(black 22%, transparent 22%);
  animation: rotate-anim 12s linear infinite;
}

.short {
  height: 240px;
  clip-path: polygon(40% 0, 60% 0, 100% 50%, 50% 100%, 0 50%);
  background: linear-gradient(gray 15%, transparent 15%);
  animation: rotate-anim 148s linear  infinite;
}

@keyframes rotate-anim {
  0% {rotate: 0deg}
  100% {rotate: 360deg}
}
```

このような感じに記載することで、
タイマーボールが左右に揺れ、ボタンの部分が点滅するようなアニメーションが加わり、完成です。
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="MWXGqNq" data-user="sp_degu" 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/sp_degu/pen/MWXGqNq">
  タイマーボール3d</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## まとめ

この記事では、CSSでタイマーボールを作ってみました。

このボールを使って、捕まえるのに30ターン近くかかってしまったポケモンをより高確率で捕まえて、ポケモンマスターを目指して行きましょう！

アドベントカレンダーは、今日で18日目が終わり、あと7日です。
残り1週間になりましたが、もっと複雑なボールを作って投稿するので、是非、カレンダーを購読して、応援していただけると嬉しいです。

https://qiita.com/advent-calendar/2022/degudegu2510

---

最後まで読んでくださってありがとうございます！

X(Twitter)でも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/degudegu2510