【CSS】 animation のコマ送り steps() を理解する

この記事は約7分で読めます。
サーバー等の運営維持費を得るため記事内に自動表示される広告が含まれています

「end (jump-end)」変化タイミングの図解

こんにちは、さち です。

先日、CSS でパカパカ点滅するアニメーションを作る方法について記事を書き、animationsteps() を使って実装しました。

そのときに、steps()仕様使い方についても説明しようと思ったんですが、ちゃんと理解しようとすると意外と奥が深く、改めてこの記事でまとめることにしました。

少しでもお役に立てれば幸いです。

スポンサーリンク

そもそも steps() とは?

CSS アニメーションには、アニメーションの動き方を指定する animation-timing-function プロパティがあります。このプロパティで使える値の一つが steps() です。

steps() を使うと、「コマ送り」のようなアニメーションを作ることができます。

具体的にどんな動き(アニメーション)なのか見たい方は、こちらの記事を参照してみて下さい。

【CSS】 アニメーション(animation)でパカパカ「点滅」を作る
こんにちは、さち です。先日、「CSS」でパカパカと点滅するアニメーション(animation)を作りたいことがありました。通常は滑らかにアニメーションしますが、あえて唐突に切り替わるアニメーションで点滅させたかったんです。animatio

「コマ送り」を作るには、どれくらいの「コマ数」で、どの「タイミング」の状態を切り取るのか決めなくてはいけません。

steps() には、「コマ数」「タイミング」を決める方法が用意されています。思い通りのアニメーションを作るために、仕様を理解していきましょう。

steps(X, Y) の意味

【X】 コマ数

steps(X, Y)X は、アニメーションの「コマ数」を指定します。

効果を理解するために、次のようなサンプルアニメーションを作ってみました。

ソース

<div class="animation steps1">1</div>
<div class="animation steps2">2</div>
<div class="animation steps3">3</div>
<div class="animation linear">linear</div>
/* 共通のアニメーション設定 */
.animation { animation: translate 4s; }

/* ステップ数の違いと linear との比較 */
.steps1 { animation-timing-function: steps(1, end) }
.steps2 { animation-timing-function: steps(2, end) } 
.steps3 { animation-timing-function: steps(3, end) } 
.linear { animation-timing-function: linear } 

/* アニメーションの内容 */
@keyframes translate {
    0%{ translate:   0px; }
   50%{ translate: 180px; }
  100%{ translate:   0px; }
}

steps(X, Y)Yend で統一してあるので、X の「コマ数」を 1 2 3 の3種類にするとどう変化するか、linear と比較しながら確認してみて下さい。

結果

表示結果

1
2
3
linear

「キーフレーム」間何コマでアニメーションするかを指定しているのが分かります。

例えば、今回のアニメーションには「キーフレーム」が 0% 50% 100% の3個あります。

コマ数を 3 にした場合、 0%50% を3コマ、50%100% を3コマでアニメーションします。つまり、アニメーション全体( 0% ~ 100% )は6コマになります。

図を作ってみたので、こちらでも確認してみて下さい。(薄い紫色の斜線は linear の動きです)

steps(1, end)

「steps(1, end)」変化タイミングの図解

キーフレーム(紫色の丸)の間を「1コマ」のアニメーションで描画します。

steps(2, end)

「steps(2, end)」変化タイミングの図解

キーフレーム(紫色の丸)の間を「2コマ」のアニメーションで描画します。

steps(3, end)

「steps(3, end)」変化タイミングの図解

キーフレーム(紫色の丸)の間を「3コマ」のアニメーションで描画します。

【Y】 タイミング

steps(X, Y)Y は、アニメーションの「コマ」がどの「タイミング」の瞬間を切り取ったものかを指定します。

効果を理解するために、次のようなサンプルアニメーションを作ってみました。

ソース

<div class="animation start">start</div>
<div class="animation end">end</div>
<div class="animation none">none</div>
<div class="animation both">both</div>
<div class="animation linear">linear</div>
/* 共通のアニメーション設定 */
.animation { animation: translate 4s; }

/* タイミングの違いと linear との比較 */
.start  { animation-timing-function: steps(3, start) }
.end    { animation-timing-function: steps(3, end) }
.none   { animation-timing-function: steps(3, jump-none) }
.both   { animation-timing-function: steps(3, jump-both) }
.linear { animation-timing-function: linear }

/* アニメーションの内容 */
@keyframes translate {
    0%{ translate:   0px; }
   50%{ translate: 180px; }
  100%{ translate:   0px; }
}

steps(X, Y)X はすべて 3 で統一してあるので、Y の「タイミング」を start end jump-none jump-both の4種類にするとどう変化するのか、linear と比較しながら確認してみて下さい。

結果

表示結果

start
end
none
both
linear

start end jump-none jump-both の4種類で、それぞれアニメーションが異なるのが分かります。

見た目だけでは仕様(仕組み)が分かりにくいので、図で確認してみましょう。(薄い紫色の斜線は linear の動きです)

start (jump-start)

「start (jump-start)」変化タイミングの図解

start は jump-start の省略表記で、最後のコマは除外し、最初のコマとその他のコマで均等な値にジャンプします。

jump-start と記述しても機能します
end (jump-end)

「end (jump-end)」変化タイミングの図解

end は jump-end の省略表記であり、最初のコマは除外し、最後のコマとその他のコマで均等な値にジャンプします。

jump-end と記述しても機能します
jump-none

「jump-none」変化タイミングの図解

jump-none は、最初と最後のコマを除外して、その他のコマで均等な値にジャンプします。

仕様上、コマ数を 2 以上にしないと使えません( 1 にするとエラーになる)
jump-both

「jump-both」変化タイミングの図解

jump-both は、最初と最後のコマも含めて、すべてのコマで均等な値にジャンプします。

参考資料

CSS steps() 関数 - MDN

コメント

タイトルとURLをコピーしました