【Animate.css】素のHTMLでも簡単にアニメーションを実装する方法！

＃はじめに
今回は、`Animate.css`という簡単にアニメーションを実装できるライブラリを紹介していきたいと思います。

https://animate.style/

## 使い方
### 事前準備
`head`タグに以下をコピペするだけで使用する準備は完了です。

```html
<head>
  <link
    rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
  />
</head>
```

npmでは以下のコマンドを実行します。
```bash
npm install animate.css
```

### classに使いたいアニメーションのクラスを仕込む

例えば、以下の要素をずっと横揺れさせたいとします。

```html
<h1>
  An animated element
</h1>
```

そんなときは、[公式サイト](https://animate.style/)の右側のペインから、つけたいアニメーションを探します。(以下画像赤枠の部分)

![スクリーンショット 2024-12-15 16.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/d5297613-a2b2-be51-af2e-7efd6fed173f.png)

今回は横揺れさせたいので、`animate__shakeX`を使用します。
要素をホバーすると出てくる、コピーボタンを押します。

![スクリーンショット 2024-12-15 16.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/52bf8079-2553-d266-8812-9374cb49f357.png)

それを、`animate__animated`という文字列に続く形でクラスに入れます。
`animate__animated`はAnimate.cssを使うよ、という宣言のようなものです。

```html
<h1 class="animate__animated animate__shakeX">
  An animated element
</h1>
```

すると...

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LEPGjqV" data-pen-title="animate__shakeX" data-user="hikagami0210" 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/hikagami0210/pen/LEPGjqV">
  animate__shakeX</a> by hikagami (<a href="https://codepen.io/hikagami0210">@hikagami0210</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

横揺れさせることができました！
ただ、このままだと一回でアニメーションが終わってしまうので、`animate__infinite`というクラスを足します。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="mybOaPL" data-pen-title="Untitled" data-user="hikagami0210" 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/hikagami0210/pen/mybOaPL">
  Untitled</a> by hikagami (<a href="https://codepen.io/hikagami0210">@hikagami0210</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

これで永久に横揺れさせ続けることができます。(酔い注意)

このように、Animate.cssを使えばめちゃくちゃ簡単にアニメーションをつけることができます！

### ユーティリティクラス
`animate__infinite`というクラスを使いましたが、このようにアニメーションを制御するクラス(ユーティリティクラス)は他にもありますのでそれを紹介していきたいと思います。

#### アニメーションを遅らせる
アニメーションを遅らせるクラスです。
5段階あります。

- animate__delay-2s
- animate__delay-3s
- animate__delay-4s
- animate__delay-5s

以下のようにすると、細かく調整することも可能です。
```css
.class {
  --animate-delay: 0.5s;
}
```

#### 速度を変化させる
アニメーションの速さを変化させます。
デフォルトは1sです。

- animate__slow (2s)
- animate__slower (3s)
- animate__fast	(800ms)
- animate__faster (500ms)

細かく調整することもできます。
```css
.class {
  --animate-duration: 0.5s;
}
```

#### 繰り返す
アニメーションの繰り返しを制御します。
先ほど使用した`animate__infinite`もこの中にあります。

- animate__repeat-1
- animate__repeat-2
- animate__repeat-3
- animate__infinite (ずっと繰り返す)

細かく調整することもできます。
```css
.class {
  --animate-repeat: 2;
}
```

## アニメーションを使用する上での注意
公式サイトには、ユーザー体験やアクセシビリティの観点からいくつかの注意がされています。
抜粋して、deeplで翻訳したものを載せておきます。（参考になったので...）

- **意味のあるアニメーション**
>要素をただアニメーションさせるのは避けるべきだ。アニメーションは意図を明確にするものであることを肝に銘じてください。アテンションシーカーのようなアニメーション（バウンス、フラッシュ、パルスなど）は、インターフェイスに「派手さ」をもたらすための手段としてだけでなく、インターフェイスの中の特別なものにユーザーの注意を向けさせるために使うべきです。
>
> 入口と出口のアニメーションは、インターフェイスで起こっていることを方向づけるために使われるべきで、新しい状態に移行していることを明確に知らせるものです。
>
> インターフェイスに遊び心を加えることを避けるべきだということではありません。ただ、アニメーションがユーザーの邪魔にならないように、また、大げさなアニメーションの使用によってページのパフォーマンスに影響が出ないように注意しましょう。

- **`prefers-reduced-motion`メディアクエリを無効にしないでください。**
> Animate.cssはprefers-reduced-motionメディアクエリをサポートしています。このメディアクエリは、OSシステムがサポートするブラウザの優先順位に基づいてアニメーションを無効にします（現在のほとんどのブラウザがサポートしています）。これは重要なアクセシビリティ機能であり、決して無効にしてはいけません！これは、平衡感覚の障害や発作性の障害のある人を助けるためにブラウザに組み込まれています。詳しくはこちらをご覧ください。あなたのウェブが機能するためにアニメーションが必要な場合は、ユーザーに警告を出しましょう

## さいごに
さいごまでお読みいただきありがとうございました！