CSSアニメーション、
animation-fill-mode。

〽️何を扱っているのか。 〽️4つのサンプル。 〽️他のプロパティとの兼ね合い。 〽️複雑になってきた。





⬆︎CSSアニメーションについてのまとめページはこちら。




syntax。

animation-fill-mode: none/ forwards/ backwards/ both ;


こんにちは、「ふ」です。
今回はCSSアニメーションのanimation-fill-modeについて紹介します。

早速ですがサンプルを示します。

playボタン⬆︎を押してみてください。
要素が左から右へ移動するCSSアニメーションが、1度だけ実行されます。アニメーション終了後は、開始前の状態(規定値)に戻ってしまいます。

※再度プレビューするときは、1度resetボタンを押してから再びplayを押してください。



ここにanimation-fill-modeの「forwards」を適用してみましょう。

■ CSS

animation-fill-mode:forwards;



「play」を押して実行すると、アニメーションが1回実行されたあと、終了時の状態がそのまま維持されます。

このようにanimation-fill-modeは、CSSアニメーションにおいて、キーフレーム開始前後の状態を指定するプロパティです。
どういった仕組みになっているのか。詳しくみていきましょう。

何を扱っているのか。


animation-fill-modeには、4つの値が用意されています。


 ① none(初期値。キーフレーム開始前と終了後、規定値を維持)

 ② forwards(キーフレーム終了後、最後に採用されたキーフレームを維持)

 ③ backwards(キーフレーム開始前、最初に採用されたキーフレームを維持)

 ④ both(②と③の両方の条件を満たす)



意味がわかりません。

💧4つの値を理解するにあたって、下準備が必要です。

そもそも何をどうしているのか。
animation-fill-modeは、「キーフレーム開始前と終了後」に、どの状態を維持するかを指定します。
「アニメーションの前後」ではなくて、「キーフレームの前後」。
これは、どこを指しているのでしょうか?

次のようなCSSアニメーションを考えてみます。
既定値が背景色coral、キーフレーム0%は背景色がforestgreenに変わり、キーフレーム100%は背景色はそのままで右へと移動した状態です。 加えてここにanimation-delayを施します。「1秒」としましょう。


.sample { background-color:coral; animation:sample 2s 「「11s」」; } @keyframes sample { 0% { background-color:forestgreen; margin-left:0; } 100% { background-color:forestgreen; margin-left:80%; } }

このCSSアニメーションの流れはこの⬆︎ようになっています。
animation-delayを掛けているので、アニメーション自体が開始されてもキーフレームが開始されるまでに「待機時間」が発生しています。

animation-fill-modeが参照する「開始前」というのは、このdelayによる「待機時間」の部分を指します。つまり、「キーフレームが開始される前」ということですね。
animation-delayが発生している場合、CSSアニメーション自体の開始タイミングとは一致しません。

animation-fill-modeの参照する「終了後」は「キーフレームの完了後」を指します。これについてはCSSアニメーション自体の終了タイミングと常に一致します。

・キーフレームの開始前 ←アニメーションスタート時のanimation-delayが適用されている状態。

・キーフレームの終了後 ←アニメーション完了後に同じ。

指定できる「状態」は、先ほど示した「既定値、最初に採用されたキーフレーム、最後に採用されたキーフレーム」です。

キーフレームの開始前を「既定値にするかor最初のキーフレームにするか」また、キーフレームの終了後を「既定値に戻すor最後のキーフレームの状態にするか」、
それらの指定を行うのが、animation-fill-modeプロパティなのです。

4つのサンプル。


animation-fill-modeの役割、お分かりいただけたでしょうか?
今度は実際のサンプルを通して、その動きを見ていきましょう。

#sample { 「「4/*既定値*/」」 background-color:coral; animation:sample 2s linear; } @keyframes sample{ bb「「4/*最初のキーフレーム*/」」 bb0% { background-color:forestgreeen; margin-left:0; } bb「「4/*最後のキーフレーム*/」」 bb100% { background-color:forestgreen; margin-left:80%; }

先程のCSSアニメーション。animation-delayを一旦外した状態で試していきます。

 ① none(初期値)。

animation-fill-mode:「「1none」」;

初期値の「none」です。何も指定されない場合はこの値が採用されます。
キーフレーム開始前と開始後のいずれにも、「既定値」が採用さています。先程animation-delayの指定を外したので、「待機時間 = キーフレームの開始前」は存在しません。確認できるのはキーフレーム終了後の挙動だけです。

 ② forwards。

animation-fill-mode:「「1forwards」」;

「forwards」を指定すると、キーフレーム終了後には最後のキーフレームの内容が維持されます。先ほどと同じく見た目では確認できませんが、キーフレーム開始前は既定値が選択されています。

「CSSアニメーションで終わりの状態を維持する」ならこれですね。



扨(さて)ここで元のCSSアニメーションにanimation-delayを掛けてみます。

#sample { background-color:coral; animation:sample 2s linear 「「11s」」; }

delayを指定したことで、キーフレームが開始されるまでに「1s」の待機時間ができました。 これを初期値noneのままで実行してみましょう。

待機時間中、つまり「キーフレーム開始前」は既定値の「背景色:coral」の状態が採用されています。

 ③ backwards。

「backwards」は、キーフレーム開始前に「最初のキーフレーム」を採用します。終了後は既定値のままです。

animation-fill-mode:「「1backwards」」;

先程の「none」におけるサンプルと比べてみてください。
アニメーションを実行すると先づ1sの待機時間に入りますが、そこでいきなり最初のキーフレーム「背景色:forestgreen」が採用されています。

 ④ both。

animation-fill-mode:「「1both」」;

「both」は②のforwardsと③のbackwardsの両方の条件を満たします。
キーフレーム開始前は最初のキーフレームの内容、キーフレーム終了時は最後のキーフレームの内容が採用されます。

③のbackwardsや④のbothは、JavaScriptなどを使ってCSSアニメーションを発火させたときに効果を発揮します。

CSSアニメーション、発火のタイミングを制御する。

〽️ 好きなタイミングで発火/消火。

他のプロパティとの兼ね合い。


animation-fill-modeは、他のCSSアニメーションプロパティとの兼ね合いによって、結果が変わってきます。

前回の記事⬆︎で紹介したanimation-directionは、「キーフレームの方向」を変化させるプロパティでした。
そして今回のanimation-fill-modeは、「最初と最後のキーフレーム」を扱うのでしたね。

ではfill-modeが「forwards」で、directionに「reverse」を適用した場合。
キーフレームの方向が逆転するため、fill-modeで「終了後に採用されるキーフレーム」の対象は0%のほうと成増。

#sample { animation:sample 2s linear 「「1reverse forwards」」; }



元々の「100%のキーフレーム」からCSSアニメーションが開始され、終了後は0%のキーフレームの状態が維持されます。

さらに。
animation-directionの「alternate」は、キーフレームの方向を反転させて繰り返すものでした。
そうすると、CSSアニメーションの繰り返し回数(animation-iteration-count)によっても「終了後に採用されるキーフレーム」は変わってきます。

・ iteration-countが「2」であれば、最後のターンはキーフレームが逆転しているので、終了後は0%のキーフレームが採用されます。


#sample { animation:sample 2s linear 「「1alternate forwards 2」」; }



・ iteration-countが「3」などの奇数の場合、最後のターンは順方向。
したがって終了後に採用されるのは100%のキーフレーム。

#sample { animation:sample 2s linear 「「1alternate forwards 3」」; }



このようにanimation-fill-modeは、他のプロパティからの影響を大きく受けることに成増。

コーディングを進める中で、思い通りのCSSアニメーションにならない場合には、周りのプロパティ指定についてもチェックしてみてください。

複雑になってきた。


最後までお読みくださり、ありがとうございます。
今回のanimation-fill-modeで、CSSアニメーションのプロパティは8つある中のの7つ目となりました。
知れば知るほど複雑になってきますね💧


フーノページのCSSアニメーション基本コーナーでは「入門者向け」とうたいながらも、実際はかなり深い内容まで掘り下げて紹介しています。従ってしっかりと内容を理解していただければ、「専門書レベルの知識を取得した」と言っていいでしょう。

残るプロパティは1つ、「animation-play-state」です。次回も頑張って学習していきましょう!
ではまた〜♫













「ふ」です。

swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。