1. 導入:なぜsteps()が必要なのか
Webデザインにおいてアニメーションといえば、transitionやanimationプロパティによる「滑らかな変化(イージング)」が一般的です。しかし、キャラクターのパラパラ漫画のような表現や、デジタル時計の数字の切り替わり、コマンドライン風のタイピングエフェクトを作りたいとき、滑らかな変化は逆に「邪魔」になります。
steps()関数を使うことで、アニメーションを等間隔の「階段状」に分割し、カクカクとしたコマ送りのような制御が可能になります。これが使えるだけで、JavaScriptを使わずに実装できる表現の幅がグッと広がります。
2. 基礎知識:steps()の仕組み
通常のイージング(easeやlinearなど)は、開始点から終了点まで値を補間して滑らかにつなぎます。一方、steps()は指定した分割数(integer)に従って、強制的に値を切り替えます。
主な引数は以下の2つです。
・分割数(integer):アニメーションを何段階に分けるか。
・位置指定(step-position):どのタイミングで変化させるか(startかendか)。
特に重要なのが「start」か「end」かの使い分けです。
・start:アニメーション開始と同時に最初のステップを表示させたい場合。
・end:アニメーション終了時に最後のステップまで表示させたい場合(デフォルト)。
3. 実装:パラパラ漫画風スプライトアニメーション
現場で最もよく使われるのは、1枚の画像に複数のコマが並んだ「スプライトシート」を動かす手法です。
手順は以下の通りです。
1. 背景画像としてスプライト画像を設定する。
2. background-positionの値を、アニメーション開始位置から終了位置へ移動させる。
3. animation-timing-functionにsteps(コマ数)を指定する。
4. サンプルプログラム:タイピング風テキストアニメーション
以下は、横幅をステップごとに広げることで、文字が1文字ずつ表示されるような演出を行うコードです。そのままコピーして試してみてください。
5. 応用・注意点:現場で陥りやすい罠
分割数の計算ミス:
最も多いのが、スプライトアニメーションの際、画像のコマ数とsteps()の数値を合わせるのを忘れるケースです。コマ数が合わないと、最後の一瞬だけ画像が飛んだり、中途半端な位置で止まったりします。必ず「1コマあたりの幅 × コマ数」が全体のサイズと一致しているか確認しましょう。
アクセシビリティへの配慮:
steps()を使った激しい点滅やコマ送りは、光過敏性発作のリスクがあるユーザーには負担になる可能性があります。OSの設定で「視差効果を減らす」が有効になっているユーザーに対しては、アニメーションを停止させるなどの配慮をメディアクエリ(prefers-reduced-motion)で実装することをおすすめします。
これらのポイントを押さえて、ぜひ表現力豊かなUI制作に役立ててください。

コメント