タイミングパラメータの構成要素
アニメーションにはキーフレームパラメータのほか, アニメーションの時系列に対する振る舞いを表すタイミングパラメータが必要です. このパラメータには次のプロパティから構成されるオブジェクトを指定します.
duration アニメーション1ループの持続時間
iterations アニメーションの繰り返し回数
iterationStart 1ループ内のアニメーションを開始する位置.
delay アニメーションを呼び出した後, 開始するまでの遅延時間
endDelay アニメーションが終了した後の完了までの遅延時間
fill アニメーション動作の開始前・終了後における進捗値の取り扱い
direction アニメーションの再生方向
easing アニメーション進捗値の重み付け方法
spacing キーフレームの自動算出方法
iterationComposite ループ時のアニメーションの取り扱い
composite (複数のアニメーションが動作していた場合の)アニメーション値の取り扱い
id アニメーションの識別子† 用途不明
各プロパティの役割を図にすると次のようになります.
タイミングパラメータのプロパティ相関
なお, タイミングパラメータに単一の数値を与えた場合はduratoin値が与えられたものとして扱います. 以下, それぞれの意味合いについて見ていきます.
CSS Animations/SVG Animationsとの相関
タイミングパラメータは他のアニメーション仕様から概念を取り込んでいます. 以下にその相関についてまとめました.
CSSプロパティとの相関
タイミングパラメータ CSSプロパティ名 値の指定等 SVGアニメーション属性
duration animation-duration 単位秒(s) dur
iterations animation-iteration-count 無制限の場合「infinite」を指定. repeatCount/repeatDur
iterationStart - - -
delay animation-delay 単位秒(s) -
endDelay - - -
fill animation-fill-mode 互換 fill:remove/freeze
direction animation-direction 互換 -
easing animation-timing-function 互換 calcModeと keySpline属性で表現
spacing - -
iterationComposite - - accumulate:none/sum
compsite - - additive:replace/sum
- animation-name @keyframesの参照 -
Animation.playState animation-play-state - -
Web Animations APIはCSS Animations寄りの仕様であり, 相互運用は難しくありません. 一方SVG Animations(つまりSMIL)を移行する場合は, アニメーションモデルの違いから相応のコードリライトが発生します. また, SVG Animationsから導入された仕様は実装が遅れています.
durationによるアニメーションの持続時間の指定
タイミングパラメータにdurationプロパティが含まれていた場合, アニメーションをその長さ(ミリ秒)で実行します. 0
もしくは"auto"
が与えられた場合, アニメーションは即時完了したことになります.
iterationsによるアニメーションのループ回数の指定
タイミングパラメータにiterationsプロパティが含まれていた場合, その回数分アニメーションを繰り返します. 同様にInfinity
を指定した場合は特に指示されない限りアニメーションを繰り返し続けます. 未指定の場合は1として解釈されます.
ループ回数に1未満の端数を指定することもできます.
iterationStartによるアニメーションのループ開始位置の指定
タイミングパラメータにiterationStartプロパティが含まれていた場合, アニメーションを指定したループ回数の分実行済みの状態から開始します. なお, iterationStartの有無に関わらず, アニメーションはiterationsの回数分実行されます. 例えば, iterationStart:0.5, iterations:3とした場合, アニメーションは0.5ループ目から開始され, 3.5ループ目に終了します.
delayによるアニメーションの開始時刻の指定
タイミングパラメータにdelayプロパティが含まれていた場合, アニメーションの開始時刻をそのミリ秒分遅延します.
delayパラメータに負の値を指定した場合, 指定したミリ秒分アニメーションが進行したものとして開始されます.
endDelayによるアニメーションの完了時刻の指定
タイミングパラメータにendDelayプロパティが含まれていた場合, アニメーションの終了後もそのミリ秒分アニメーションの完了を遅延します.
endDelayパラメータに負の値を指定した場合, 指定したミリ秒分アニメーションの終了を待たずしてアニメーションを完了します.
fillによるアニメーション開始時・終了時の値の取り扱い
アニメーションによって変更された内容は, 通常アニメーションが完了した際に全て破棄されます. fillプロパティはこのアニメーションに伴う値の取り扱いを表します.
[FillMode]
none アニメーション開始前は何もせず, 終了後は直ちにアニメーション中の値を破棄する.
forwards アニメーション開始前は何もせず, アニメーション終了後はその値を維持する.
backwards delay値を伴うアニメーションの開始待ちの間はアニメーション開始時の値として扱う. 終了後は直ちにアニメーション中の値を破棄する.
both forwards及びbackwordsを組み合わせたもの.
fill値によるアニメーション値の有効範囲
directionによる再生方向の指定
タイミングパラメータにおけるdirectionプロパティはアニメーションの再生方法及びループ方法を指定します.
[PlaybackDirection]
normal 通常のアニメーション再生です.
reverse アニメーションを逆再生します.
alternate 1ループ毎にアニメーションを折り返します.
alternate-reverse 逆再生からはじめて1ループ毎にアニメーションを折り返します.
逆再生はキーフレーム順を逆にするわけでなく, (順)再生したアニメーションの時間経過をそのまま巻き戻すように動作します. つまり一般的なビデオ再生と同じ動作をとります.
easingによるアニメーション進捗度の重み付け
タイミングパラメータにeasingプロパティが設定されていた場合, その内容を元にアニメーション進捗度にイージング関数による重み付けを行います. 詳しくは次のセクションで解説します.
SVG Animationsに由来するパラメータ
以下に示すspacing, iterationCompsite, compositeらはいずれもSVG Animations(SMIL)を起源とする仕組みであり, より高度なタイミング制御を行うためのパラメータです.
これらをサポートする環境はまだないようです. また, API構成には疑問が残ります.
spacingによるキーフレームの自動算出
タイミングパラメータのspacingプロパティはoffset値が未設定のキーフレームを実際の進捗度に割り当てる際の方式を表します.
distribute キーフレーム間を進捗度で等分するようにキーフレームを自動定義します. 規定値.
paced(left) 進捗度が確定しているキーフレーム間でアニメーションが等速(上り下りの傾きが一定)となるようにキーフレームを自動定義します.
例えば次のようなキーフレーム設定があったとします.
すると, spacingプロパティによって自動算出されるoffset値(つまりキーフレーム)が変化します.
spacingプロパティによるキーフレーム算出の違い
iterationCompsiteによるアニメーション値の累積
iterationCompsiteプロパティではループ毎のプロパティ値の変位を累積するかどうかを指定します.
[IterationCompositeOperation]
replace ループの毎に値を元に戻します. 規定値.
accumulate ループ毎に値を累積していきます.
compositeによるアニメーションの合成
compositeプロパティはアニメーション時に算出されたプロパティ値を既存のプロパティ値にどのように適用するかを指定します. addを設定することで複数のアニメーションが合成され, より複雑な動作を表現可能です.
[CompositeOperation]
replace プロパティ値はアニメーション時の値で置き換えられます. 規定値です.
add アニメーション時の値は現在のプロパティ値に加算されます(加法的アニメーション) .
accumulate アニメーション時の値は現在のプロパティ値に合成(累積)されます(累積アニメーション) † .
加法的アニメーション
addを指定した場合, SVG Animationsにおけるbyアニメーション/additive=sumアニメーションに相当します.
accumulateについては例えばfilter値をアニメーション化する場合, blur(2)にblur(3)をaddする場合,「blur(2)blur(3)」という結果が得られるのに対し, accumulateの場合は「blur(2+3)」が得られると説明されています.
加法的アニメーションの再現
現在APIレベルでの加法的アニメーションをサポートする環境はありませんが, アニメーション対象の構造を工夫することで再現することは可能です. アニメーション対象をdiv要素やg要素等のコンテナ要素で囲み, コンテナ要素・アニメーション対象の双方をアニメーションさせます.
composite値の動きが確認出来ないのでサンプルコードの確からしさについては眉唾です.
後発アニメーションの優位性
composite値は規定値としてreplaceが選択されます. 従って同一プロパティに対するアニメーションは, 後から実行したものが既に実行済みのアニメーションを覆い隠します .
タイミングパラメータの取得
Animationオブジェクトを生成した際に設定したタイミングパラメータはAnimation.effect.timingから取得できます.
AnimationEffect Animation.effect
アニメーションの基本設定・現況を取得するためのAnimationEffectオブジェクトを取得します.
AnimationEffectTiming AnimationEffect.timing アニメーションを構成するタイミングパラメータ情報を取得します.
[Animation.effect.timing]
readonly double AnimationEffectTiming.delay
delay値を取得します.
readonly double AnimationEffectTiming.endDelay
endDeray値を取得します.
readonly FillMode AnimationEffectTiming.fill
fill値を取得します.
readonly double AnimationEffectTiming.iterationStart
iterationStart値を取得します.
readonly double AnimationEffectTiming.iterations
iterations値を取得します.
readonly double/DOMString AnimationEffectTiming.duration
duration値を取得します.
readonly PlaybackDirection AnimationEffectTiming.direction
direction値を取得します.
readonly DOMString AnimationEffectTiming.easing
easing値を取得します.
一見意味のない機能に見えますが, CSSアニメーション等のAnimationコンストラクタを経由しないアニメーション の分析を行いたい場合に有用な機能です.
タイミングパラメータとメモリリーク
Animationオブジェクトの生成に際し下記パラメータを指定した場合, 時間経過によって無効とならない(なりにくい)アニメーション が作られます.
iterations: Infinity(ないしは大きな値)
を指定したもの
fill: forwards/both
を指定したもの
duration
を極端に大きくとったもの
このようなAnimationオブジェクトは一度実行されるといつまで経ってもメモリから開放されません . なぜならアニメーションが終了しない, もしくは終了後もプロパティの値を書き換え続けているからです. 従って暗黙的にAnimationオブジェクトを生成するElement.animateメソッドによるアニメーションを何度も繰り返した場合, 古いAnimationオブジェクトが積み重なることでメモリリークが発生します. しかも, 先に見たとおり同じプロパティに対するアニメーションは後から実行したものが優先されるため, 問題が発生しても気付きにくいという性質をもっています.
jQuery等のanimateメソッドと同じ感覚で扱うとまずハマります.
メモリーリーク発生の原理
この問題はAnimationオブジェクトを再利用するか, アニメーション開始時に既存のAnimationオブジェクトをキャンセルすることで解決します.
アニメーションを繰り返した際, 次第にアニメーションがガタつく現象が発生した場合はこの暗黙的なAnimationオブジェクトの蓄積を疑いましょう. なおメモリリーク有無の判断にはdocument.getAnimationsメソッドが便利です.