CSS Animationを使って、動的デザインでイキろう

## はじめに
こんにちは、ITわんこと申します。音楽好きの犬です。
今回は**CSS Animation**の使い方について解説していこうと思います。

アニメーションが必要な開発現場はそれほど多くないかなとは思いますが、
そういった現場でこそ、ちょっとアニメーションを付けたい等の要望があった時に
他のメンバーに対してドヤれると思うので、ぜひ本記事を読んでいってください。

## CSS Animationとは
そもそもの話としてCSS Animationとは何でしょうか？
CSS Animationとは文字通りCSSでアニメーションを実現する機能です。

例えばどんなことができるかというと、以下のようなことができます。

https://x.com/yui540/status/1480755439885496320

これは自分が尊敬する[yui540](https://x.com/yui540)さんの作品例なのですが、
**"凄い！こんなことまでできちゃうの！？"** って思いますよね。

本記事では、こういったアニメーションを実現するために必要なCSS Animationの基礎を解説したいと思います。

## CSS Animationの仕組み

### @&#xFFF0;keyframes
アニメーションを実現する仕組みとして、まず覚えてほしいのはCSSの`@keyframes`という機能です。これはアニメーションの内容を保存しておける、変数のような役割を果たします。

具体的には以下のように記述します。
```css
/* "color-changing"はkeyframeの名前 */
@keyframes color-changing {
  0% {
    background-color: red;
  }

  50% {
    background-color: blue;
  }

  100% {
    background-color: yellow;
  }
}
```
このようにアニメーションの各段階で対象の要素がどういった状態であるかを定義することで、滑らかに状態が変化するアニメーションを作成することができます。

この例で言うと最初は赤色で始まり、中間地点で青色になって、最後は黄色に変化します。

実際に画面でアニメーションを実行するとこのようになります。

![2024-12-1519.36.24-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891278/798ec9eb-8944-c04f-8247-a4ab34b0e6e8.gif)

::: note
ちなみにですが、`@keyframes`には`from`, `to`という記述方法もあります。
これは`from`が最初の状態、`to`が最後の状態を表しています。

つまり先程の例で言うと下記のように記述することも可能です。

```css
@keyframes color-changing {
  from {
    background-color: red;
  }

  50% {
    background-color: blue;
  }

  to {
    background-color: yellow;
  }
}
```
:::

### animationプロパティ
`@keyframes`によるアニメーションの作成自体は完了しましたが、この時点ではアニメーションをHTML要素に適用することはできていません。

実際にアニメーションを適用するためには、CSSセレクタに`animation`プロパティの設定をすることが必要です。

`animation`プロパティには、以下のような種類があります。

```css
animation /* すべてを一括で設定できるショートハンド */
animation-name /* 使用する@keyframesの名前を指定 */
animation-duration /* アニメーションの実行時間を指定 */
animation-timing-function /* アニメーションの緩急を設定できる */
animation-delay /* アニメーションの実行を遅延させられる */
animation-iteration-count /* アニメーションの実行回数を指定 */
animation-direction /* アニメーションの進行方向を指定 */
animation-fill-mode /* アニメーション前後の状態を維持する設定 */
animation-play-state /* アニメーションの一時停止を行う設定(running/paused) */
```

プロパティについて解説し始めると本当に長くなってしまいますので、詳細は他の情報源を参照して下さい。おすすめのサイトを2つ紹介しておきます。

**概要を知りたい場合はこちら**

https://www.tribeck.jp/column/opinion/production/20240415/


**詳しく知りたい方はこちら**

https://developer.mozilla.org/ja/docs/Web/CSS/animation

では、これらの`animation`プロパティを使ってアニメーションの設定をしていきます。

サンプルコードは下記のとおりです。
こちらでは、`box-animation`クラスに対してアニメーションを設定しています。


```css
.box-animation {
  animation-name: color-changing; /* @keyframesのcolor-changingを指定 */
  animation-duration: 5s; /* 5秒かけてアニメーションを実行 */
  animation-fill-mode: forwards; /* アニメーション実行後の状態を維持　*/
}
```

::: note warn
基本的には好きな`animation`プロパティを設定していただければ良いのですが、最低限`animation-name`と`animation-duration`が無いと動作しない点は覚えておいてください。
:::

そして`box-animation`クラスを要素につけるとアニメーションが行われるようになります。

```html
<div class="box box-animation"></div>
```

::: note
直接記述する方法だとページが読みまれた時点でアニメーションが始まってしまうので、特定のユーザー操作時に再生したい場合は`button.onclick`等のイベントリスナーにて`box-animation`を付与すると良いでしょう。
:::

## まとめ
まとめるとCSS Animationの使い方は以下のとおりです。

1. `@keyframes`でアニメーションを作成する
2. `animation`プロパティで、クラスセレクタにアニメーション再生設定をする
3. プロパティを記載したクラスを指定の要素に付与する

CSS Animationの基礎としては、これが分かっていれば十分だと思います。
あとは実際にコードを触りながら色々と学んでいきましょう。

## おまけ

本記事で紹介したサンプルコードが実際に動いているサンドボックス環境を配布します。
文字で読むより触ってみて体験するほうがわかりやすいと思うので、ぜひ色々やってみてください。

https://stackblitz.com/edit/stackblitz-starters-xgasepeu?file=index.html

CSS Animationについてゲーム形式で学べるサイトがあります。
すっごく楽しいので、時間がある方は是非どうぞ。

https://css-animations.io/task/1

## さいごに
本記事を最後まで読んでいただきありがとうございます。
少しはCSS Animationに興味を持っていただけたでしょうか。

CSSのコーディングというと比較的単純な作業というイメージがあるかと思います。
しかしながら現代のCSSは複雑な仕様がたくさん導入されており、探求してみると意外に面白いと思います。

本記事を通してCSSに魅せられたCSSerが増えることで、手の込んだリッチなサイトが多く生まれるようになり、インターネッツがより豊かになることを願っています。

### 追伸
[さわらつき](https://x.com/sawaratsuki1004)先生のCSS Kawaiiロゴ来ないかな....

## 参考文献

- [CSS Animationプロパティのおさらい](https://www.tribeck.jp/column/opinion/production/20240415/)
- [CSS ANIMATIONS](https://www.tribeck.jp/column/opinion/production/20240415/)