【完走賞ゲットだぜ！】CSSでスピードボールを作る！

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

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

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

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

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

12記事目は、 「**【完走賞ゲットだぜ！】CSSでスピードボールを作る！**」です。

スピードボールは、すばやさがはやいポケモンが捕まえやすくなるボールです。
特にすばやさの種族値が100以上だと捕まえやすいので進化後のポケモンが捕まえやすい傾向にある優秀なボールです。

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


## 完成形
完成形は**↓こちら**です。
影やアニメーションを用いて、球体を表現しています。
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="QWxqELO" 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/QWxqELO">
  スピードボール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/1ff5e113-3fff-7e75-aad4-520b588adb4b.png)


まず、この外形を作るために `linear-gradient` を使って作っていきます。

`linear-gradient`を以下のように記載することで、3色を上から順に
**0% ~ 46% ： #d60012**
**46% ~ 54% ： black**
**54% ~ 100% ： White**
と塗り分けることができます。

```sample.css
div {
  background: linear-gradient(#d60012 46%, black 46% 54%, white 54%);
}
```

このようにすることで、以下のような形になります。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="RwJjMLr" 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/RwJjMLr">
  スピードボール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/285d6de6-1782-cb16-bd05-7da4b0ac2848.png)

スピードボールの上部の黄色い模様は、長方形を`clip-path`の`polygon`(多角形)でいい感じの形に切り抜いて、それっぽい模様にしていきます。

`polygon`(多角形)では、頂点を１つずつ指定してあげることで、多角形を作成することができます。
今回の上部の黄色い模様は、以下のように作成しています。

```sample.css
.top_pattern {
  clip-path: polygon(0% 20%, 25% 6%, 100% 50%, 25% 94%, 0% 80%, 48% 50%);
}
```
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/222dda24-ccff-ac0e-8eb5-ec52e09316bd.png)


また、スピードボールの左右の黄色い模様は、`linear-gradient`で 黄色 → 黒 → 黄色となるような円形をいい感じの位置に2つ配置をしています。

ボタンの部分が、立体的に見えるように、中のボタンに`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`で２種類の影を使い、ボタン部分を作成することができます。
黄色い部分は、`position: absolute;` でいい感じ配置します。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="OJEOvxW" 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/OJEOvxW">
  スピードボール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/01606291-ee6a-bac1-0b21-d1cbbad7fe08.png)

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

```sample.css
div {
  box-shadow: -20px -10px 40px rgba(0, 0, 0, .5) inset;
}
```

このように、`box-shadow`に`inset`を使うことで、以下のようにスピードボールを立体的に見せることができます。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="bGKYvoR" 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/bGKYvoR">
  スピードボール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 Animationを追加します。

まずは以下のように、`translate`で、スピードボールの位置をアニメーションさせ、
`scale` と `rotate`を調整して、スピード感をアップさせます。

```sample.css
div {
  animation: ball-anim 3s ease-in-out infinite;
}

@keyframes ball-anim {
  0% {
    translate: 0;
  }
  34% {
    scale: 100% 100%;
    rotate: -15deg;
  }
  35% {
    translate: -100vw;
    scale: 100% 70%;
    rotate: 15deg;
  }
  65% {
    translate: 100vw;
    scale: 100% 70%;
    rotate: 15deg;
  }
  66% {
    scale: 100% 90%;
    rotate: -15deg;
  }
  80% {
    translate: -20%;
    scale: 100% 100%;
    rotate: -15deg;
  }
  100% {
    translate: 0;
  }
}
```

80%当たりのキーフレームあたりで、急停止しているようなアニメーションも追加しています。


このような感じに記載することで、スピードボールにスピード感が感じられるようなアニメーションが加わり、完成です。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="QWxqELO" 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/QWxqELO">
  スピードボール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でスピードボールを作ってみました。
このボールを使って、すばやさがはやいポケモンをたくさん捕まえてポケモンマスターを目指して行きましょう！

アドベントカレンダーは、今日で12日目が終わりました。
アドベントカレンダー完走を目指して、あと13日です。
引き続き投稿するので、是非、カレンダーを購読して、応援していただけると嬉しいです。

これからも、色々なものをどんどん作って行きます！

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

---

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

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

https://twitter.com/degudegu2510