CSS ・ アニメーション

animation

アニメーションの設定

@keyframes で定義した動きを要素に適用し、再生時間や繰り返し回数などを指定します。

初期値
none 0s ease 0s 1 normal none running
適用対象
すべての要素
継承
しない
01

サンプルコード

HTML
1<div class="dot"></div>
2<p class="blink">読み込み中…</p>
CSS
1.dot {
2 width: 24px;
3 height: 24px;
4 border-radius: 50%;
5 background: #b68235;
6 animation: move 1.2s ease-in-out infinite alternate;
7}
8@keyframes move {
9 from {
10 transform: translateX(0);
11 }
12 to {
13 transform: translateX(200px);
14 }
15}
16.blink {
17 animation: fade 1s ease-in-out infinite alternate;
18}
19@keyframes fade {
20 from {
21 opacity: 1;
22 }
23 to {
24 opacity: .3;
25 }
26}
02

実行結果

ブラウザでの表示2つのアニメーションが繰り返し再生されます
03

解説

CSSアニメーションは、HTML要素に動きや変化を加えるための CSS の機能です。animation プロパティと @keyframes を使うことで設定できます。JavaScript などの複雑なプログラム処理を必要としないため手軽に実装できますが、クリックやドラッグなど、何かしらのアクションに反応してアニメーションを開始することはできません(その場合は JavaScript を使います)。

animation は、@keyframes で名前を付けて定義した動きを要素に適用するプロパティです。transition と違い、ホバーなどのきっかけがなくても自動で再生できます。

「名前 再生時間 速度の変化 繰り返し回数 方向」のように、スペース区切りでまとめて指定します。infinite で無限に繰り返し、alternate で行きと帰りを交互に再生します。

動かすプロパティは transform と opacity にすると、描画の負荷が軽くなめらかに動きます。

04

応用例・注意点

個別のプロパティ

プロパティ説明
animation-nameアニメーションの名前(@keyframes で付けた名前)
animation-duration始まって終わるまでの時間(2s など)。初期値は 0s でアニメーションしない
animation-timing-function変化の度合い(ease / linear など)
animation-delay何秒後にアニメーションを始めるか
animation-iteration-count繰り返し回数。初期値は 1(infinite で無限)
animation-direction再生方向(alternate で往復)
animation-fill-mode開始前・終了後のスタイル(forwards で終了時の状態を保つ)
animation-play-state再生・停止(マウスオーバーの際に使う)

表示時にふわっと現れる

forwards を付けると、アニメーション終了後もその状態のままになります。

CSS
1.fade-in {
2 animation: fadeIn .6s ease forwards;
3}
4@keyframes fadeIn {
5 from {
6 opacity: 0;
7 transform: translateY(8px);
8 }
9 to {
10 opacity: 1;
11 transform: none;
12 }
13}

注意点

  1. 01ホバー(:hover)に反応させるだけなら、animation より transition のほうが簡単です。
  2. 02点滅や激しい動きは、利用者によっては気分が悪くなる原因になります。prefers-reduced-motion で止められるようにします。
  3. 03width や top を動かすと描画の負荷が高くなります。transform と opacity を使います。
05

個別のプロパティを詳しく

例:個別のプロパティで1つずつ書く

1秒待ってから、2秒かけてフェードインし、フェードアウトと交互に永遠に繰り返します。

HTML
1<p class="title">フェードイン</p>
CSS
1@keyframes fadeIn {
2 0% {
3 opacity: 0;
4 }
5 100% {
6 opacity: 1;
7 }
8}
9.title {
10 font-size: 24px;
11 font-weight: bold;
12 color: #b68235;
13 animation-name: fadeIn;
14 animation-duration: 2s; /* 2秒かけてフェードイン */
15 animation-delay: 1s; /* 1秒待ってから */
16 animation-iteration-count: infinite; /* 永遠に繰り返す */
17 animation-direction: alternate;
18}
ブラウザでの表示

コードと表示の対応

  1. animation-name: fadeIn;@keyframes fadeIn で定義した動きを使う
  2. animation-duration: 2s;1回の再生に2秒かける
  3. animation-delay: 1s;1秒待ってから始める
  4. animation-iteration-count: infinite;永遠に繰り返す
  5. animation-direction: alternate;行き(フェードイン)と帰り(フェードアウト)を交互に再生する

animation-name

animation-name の値には、英数字、ダッシュ(-)、アンダースコア(_) が使えます。fadeIn や slide-up のように、アニメーションの動きをイメージしやすい名前にするとよいです。

animation-duration

duration は「間隔」という意味で、1回のアニメーションが終了するまでの時間を指定します。初期値は 0s となり、アニメーションは起こりません。 s は秒(second)を表し、ほかに ms(ミリ秒)も指定できます。2 のように数字だけでは効かないので、s か ms を必ず付けます。

animation-timing-function

アニメーションの変化速度を設定できます。

値動き
ease初期値。開始時と終了時は緩やかに変化
ease-in開始時は緩やかに変化、終了に近づくと早く変化
ease-out開始時は早く変化し、終了時は緩やかに変化
ease-in-out開始時と終了時は、かなり緩やかに変化
linear開始から終了まで一定に変化
step-startアニメーションの開始時点で終了状態になる
step-endアニメーションが終わる時点で終了状態になる(それまでは開始時の状態のまま)
steps(数, start または end)指定した整数の段階で、パラパラ漫画のように変化。start を指定すると各段階の始めに、end を指定すると各段階の終わりに切り替わる
cubic-bezier(x1, y1, x2, y2)変化の度合いを任意で指定

animation-delay

アニメーションが始まるまでの時間(待ち時間)を指定できます。animation-delay: 1s; なら、アニメーションが適用されてから1秒後に始まります。

「画面に入ってから」ではない点に注意

  • delay の時間は、ページを読み込んで アニメーションが適用された時点から 数えます。ページの下のほうにある要素は、スクロールして画面に入る前にアニメーションが終わっていることがあります。
  • 「スクロールして画面内に入ったら動かす」には、JavaScript(Intersection Observer など)でクラスを付けて、そのクラスに animation を書きます。

animation-iteration-count

iteration は「反復」という意味で、アニメーションを繰り返す回数 を指定できます。初期値は 1 です。数字だけでなく、永遠に繰り返す infinite もあります。

animation-direction

アニメーションを繰り返すときに、どこから始めるか(再生方向)を指定できます。

値動き
normal初期値。繰り返す際に最初に戻って開始する
reverse最後の状態から逆向きに再生する
alternatenormal と reverse を交互に繰り返す(行って戻る)
alternate-reversereverse と normal を交互に繰り返す。先に reverse から始まる

animation-fill-mode

アニメーションの開始前と終了後に、どのスタイルを適用するかを指定できます。アニメーションが終わった後にどのような状態を保持したいかで値が変わります。animation-delay と組み合わせて使うことが多い です。

値動き
none初期値。アニメーションで指定したスタイルは、開始前・終了後には適用されない(終わると元のスタイルに戻る)
forwardsアニメーション終了時のスタイルが、終了後にも適用される
backwardsanimation-delay で待っている間も、アニメーション開始時のスタイルが適用される
bothforwards と backwards の両方が適用される

たとえば「1秒待ってからフェードインし、そのまま表示しておく」なら animation-fill-mode: both; にします。backwards で待っている間も透明のままになり、forwards で終わった後も表示されたままになります。

animation-play-state

ホバーなどのアクションとともに使われるプロパティです。アニメーションしている要素にカーソルを当てたときに、アニメーションを一時停止するなどの設定ができます。

値動き
running初期値。アニメーションは継続される
pausedアニメーションを停止する。running に戻すと、止まったところから再開する

例:マウスを乗せると一時停止する

回り続ける四角にマウスを乗せると止まり、離すとその位置から再び回ります。

HTML
1<div class="box"></div>
CSS
1@keyframes spin {
2 to {
3 transform: rotate(360deg);
4 }
5}
6.box {
7 width: 60px;
8 height: 60px;
9 margin: 16px;
10 background-color: #e1ad66;
11 animation: spin 3s linear infinite;
12}
13.box:hover {
14 animation-play-state: paused;
15}
ブラウザでの表示

コードと表示の対応

  1. animation: spin 3s linear infinite;3秒で1回転を、一定の速さで永遠に繰り返す
  2. .box:hoverマウスを乗せている間だけ
  3. animation-play-state: paused;アニメーションを一時停止する
↑↓ 選択Enter 移動Esc 閉じるCtrl K⌘K で開閉