CSSでアニメーション!「animation」と「keyframes」の使い方のおさらい

animationプロパティは指定できる値を見てもらうと分かりますが、transitionととても似ています。

animationで指定できる値(プロパティ)は以下のとおり。

  • animation-name
  • animation-duration
  • animation-timing-function
  • animation-delay
  • animation-iteration-count
  • animation-direction
  • animation-fill-mode
  • animation-play-state

この内、durationtiming-functiondelayについては、同様のプロパティがtransitionにも存在します。

animationでは、もっと細かい指定ができるというイメージでいいかと思います。キーフレームアニメーションで開始から終了までを細かく設定できます。

それでは、animationの使い方を見ていきましょう。

W3C公式のドキュメントはこちらから。
https://drafts.csswg.org/css-animations-1/

animationの概要

アニメーションの指定の仕方について、概要から説明していきます。

animationは、@keyframeとセットで使うプロパティです。

  • animationは「設定」
  • @keyframeは「動き」

といった感じのイメージでしょうか。

実際のコードを見てみましょう。

<div class="animation"></div>

animationプロパティで、アニメーションの名前や回数、時間などを指定します。

そして、@keyframesで、順番にどういった振る舞いをしていくかを指定しています。0%から100%まで刻みながら設定できるので、細かな動きを実現できるようになっています。

.animation {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation: animation-haniwaman 3s linear 0s infinite normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animationが内包する6つのプロパティの役割

animetionはショートハンドプロパティと言って、backgroundborderのように複数のプロパティを一括で指定できるようなプロパティです。

冒頭でも紹介しましたが、animationで指定できるプロパティは以下のとおりです。

  • animation-name -> アニメーションの名前
  • animation-duration -> アニメーションの開始から終わるまでの時間(1回分)
  • animation-timing-function -> アニメーションの進捗時の効果
  • animation-delay -> アニメーションが開始するまでの時間
  • animation-iteration-count -> アニメーションの繰り返し回数
  • animation-direction -> アニメーションを逆再生(順番)
  • animation-fill-mode -> アニメーションの開始前と終了後の状態
  • animation-play-state -> アニメーションの再生と停止

それでは1つずつ解説していきます。

animation-name

アニメーションの名前を指定します。他のアニメーションと被らないように注意しましょう。

animation-name: animation-haniwaman;

といった具合です。

この名前はキーフレームを指定する際に使用します。

先にどんな感じで使うかだけ実例を紹介します。

.animation {
	animation-name: animation-haniwaman;
}
@keyframes animation-haniwaman {
	0% {width: 0%;}
	100% {width: 100%;}
}

@keyframesの後ろに続くのが、animation-nameで指定した値になります。

animation-duration

1回分のアニメーションが開始してから終了するまでの時間を指定します。

説明
xs x秒
xms xミリ秒(1000ミリ秒 = 1秒)

実際の動きを確認しましょう。

1sで指定した場合

0%から100%までのアニメーション時間が1秒になります。

<div class="animation-duration-1s"></div>
.animation-duration-1s {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

5sで指定した場合

0%から100%までのアニメーション時間が5秒になります。

<div class="animation-duration-5s"></div>
.animation-duration-5s {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 5s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animation-timing-function

アニメーションの振る舞い方を指定します。「始め早く終わりゆっくり」とか、「一定のスピード」などが選択できます。

説明
ease 開始と完了を滑らかにする(cubic-bezier(0.25, 0.1, 0.25, 1.0) を指定したのと同じ)(初期値)
linear 一定(cubic-bezier(0.0, 0.0, 1.0, 1.0) を指定したのと同じ)
ease-in ゆっくり始まる(cubic-bezier(0.42, 0, 1.0, 1.0) を指定したのと同じ)
ease-out ゆっくり終わる(cubic-bezier(0, 0, 0.58, 1.0) を指定したのと同じ)
ease-in-out ゆっくり始まってゆっくり終わる(cubic-bezier(0.42, 0, 0.58, 1.0) を指定したのと同じ)
cubic-bezier(数値, 数値, 数値, 数値) 3次ベジェ曲線のP1とP2を (x1, y1, x2, y2) で指定

各値の違いを見てみよう

easelinearease-inease-outease-in-outの各値を並べてみました。

開始から終了までのアニメーション時間は同じですが、動きがそれぞれ異なることが分かります。

ease
linear
ease-in
ease-out
ease-in-out

animation-delay

アニメーションが開始されるまでの時間を指定します。

説明
xs x秒
xms xミリ秒(1000ミリ秒 = 1秒)

実際の動きを確認しましょう。

1sで指定した場合

アニメーションが開始するまでに1秒かかります。

※ マウスホバー or タップ

<div class="animation-delay-1s"></div>
.animation-delay-1s {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 1s;
	animation-iteration-count: 1;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

3sで指定した場合

アニメーションが開始するまでに3秒かかります。

※ マウスホバー or タップ

<div class="animation-delay-3s"></div>
.animation-delay-3s {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 3s;
	animation-iteration-count: 1;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animation-iteration-count

アニメーションの繰り返す回数を指定します。

説明
infinite 無限に再生を繰り返す
数値 数値で再生回数を指定する(初期値は1)

実際の動きを確認しましょう。

3で指定した場合

アニメーションが3回繰り返されます。

※ マウスホバー or タップ

<div class="animation-iteration-count-3"></div>
.animation-iteration-count-3 {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: 3;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

infiniteで指定した場合

アニメーションが無限に繰り返されます。

※ マウスホバー or タップ

<div class="animation-iteration-count-infinite"></div>
.animation-iteration-count-infinite {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animation-direction

繰り返すたびにアニメーションの向きが変わります。keyframesで表現すると、0% → 100%と、100% → 0%を繰り返すといったイメージです。

説明
normal 普通方向の再生でアニメーションサイクルを繰り返す(初期値)
alternate 奇数回では普通方向の再生、偶数回では逆方向の再生となって、アニメーションサイクルを繰り返す

実際の動きを確認しましょう。

normalで指定した場合

同じ方向に何度も繰り返されます。

<div class="animation-direction-normal"></div>
.animation-direction-normal {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 3s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

alternateで指定した場合

アニメーションの方向が偶数回と奇数回で変わります。

<div class="animation-direction-alternate"></div>
.animation-direction-alternate {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 3s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animation-fill-mode

アニメーションの開始前と開始後のスタイルを指定します。

説明
none 適応なし(初期値)
forwards アニメーションの終了時に、もとの状態に戻らない(100%の状態)
backwards アニメーションの終了時に、もとの状態に戻る(0%の状態)
both forwardsとbackwardsが両方適応される

実際の動きを確認しましょう。

forwardsで指定した場合

アニメーションの終了時に、もとに戻りません。(100%の状態になる)

※ マウスホバー or タップ

<div class="animation-fill-mode-forwards"></div>
.animation-fill-mode-forwards {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
	animation-fill-mode: forwards;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

backwardsで指定した場合

アニメーションの終了時に、もとに戻ります。(0%の状態になる)

※ マウスホバー or タップ

<div class="animation-fill-mode-backwards"></div>
.animation-fill-mode-backwards {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
	animation-fill-mode: backwards;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animation-play-state

アニメーションの再生と停止をコントールします。

説明
running アニメーションが再生されます(初期値)
paused アニメーションが停止します

実際の動きを確認しましょう。

動いているアニメーションを停止させる

無限にアニメーションしている要素を止めてみます。

※ マウスホバー or タップ

<div class="animation-play-state-paused"></div>
.animation-play-state-paused {
	width: 100px;
	height: 100px;
	background: #00BCD4;
	animation-name: animation-haniwaman;
	animation-duration: 1s;
	animation-timing-function: linear;
	animation-delay: 0s;
	animation-iteration-count: infinite;
	animation-direction: normal;
	animation-fill-mode: none;
	animation-play-state: running;
}
.animation-play-state-paused:hover {
	animation-play-state: paused;
}
@keyframes animation-haniwaman {
	0% {width: 100px;}
	100% {width: 100%;}
}

animationプロパティでまとめて指定する

以下の6つのプロパティをanimationで1つにまとめて指定できます。

  • animation-name -> アニメーションの名前
  • animation-duration -> アニメーションの開始から終わるまでの時間(1回分)
  • animation-timing-function -> アニメーションの進捗時の効果
  • animation-delay -> アニメーションが開始するまでの時間
  • animation-iteration-count -> アニメーションの繰り返し回数
  • animation-direction -> アニメーションを逆再生(順番)
  • animation-fill-mode -> アニメーションの開始前と終了後の状態
  • animation-play-state -> アニメーションの再生と停止

並び順は以下のとおり。
animation: [animation-name] [animation-duration] [animation-timing-function] [animation-delay] [animation-iteration-count] [animation-direction] [animation-fill-mode] [animation-play-state];

初期値で当てはめると
animation: none 0s ease 0s 1 normal none running;

複数のアニメーションを指定することも可能

カンマで区切ることで複数のアニメーションを指定することもできます。

animation: none 0s ease 0s 1 normal none running, none 0s ease 0s 1 normal none running;

@keyframesの指定方法

実際にどのように変化させていくかのスタイルを指定するのが@keyframesです。わたしはanimationeプロパティは「設定」、@keyframesは「振る舞い」という捉え方をしています。

@keyframesの指定の仕方について見ていきましょう。指定方法には2パターンあります。

最初と最後だけ指定

fromでアニメーション開始時のスタイルの指定。toで兄メーソン終了時のスタイルを指定します。2種類だけなのでとてもシンプルなアニメーションとなります。

@keyframes animation-keyframes {
	from {
		width: 0%;
	}
	to {
		width: 100%;
	}
}

実際の指定例として以下のとおりです。

.animation {
	width: 0;
	height: 100px;
	background: #00BCD4;
	animation: animation-keyframes 3s linear 0s infinite normal;
}
@keyframes animation-keyframes {
	from {
		width: 0%;
	}
	to {
		width: 100%;
	}
}

最初と最後だけの指定であればtraisitionと役割はほぼ同じですね。

%で区切る

0%から100%まで好きなタイミングを区切ってアニメーションを設定することができます。この柔軟性がanimationプロパティの真骨頂ではないでしょうか。複雑な動きを作ることができます。

※ 0%と100%は必須ではありません。好きな数字で作ることが可能です。

@keyframes animation-keyframes-per {
	0% {
		width: 0%;
	}
	20% {
		width: 50%;
	}
	40% {
		width: 25%;
	}
	60% {
		width: 75%;
	}
	80% {
		width: 50%;
	}
	100% {
		width: 100%;
	}
}

実際の指定例として以下のとおりです。

.animation {
	width: 0;
	height: 100px;
	background: #00BCD4;
	animation: animation-keyframes-per 3s linear 0s infinite normal;
}
@keyframes animation-keyframes-per {
	0% {
		width: 0%;
	}
	20% {
		width: 50%;
	}
	40% {
		width: 25%;
	}
	60% {
		width: 75%;
	}
	80% {
		width: 50%;
	}
	100% {
		width: 100%;
	}
}

おわり


animationの使い方について、紹介しました。

「薄っすら消えていく」みたいなよく使うようアニメーションは事前に作っておくといいかもしれません。

このページが気に入ったら
いいね!しよう

最新の情報をお届けします。

同じカテゴリーの記事