SVGのanimateTransform
要素は、その親要素をアニメーションさせながら変形したり動かしたりするためのもの。from
とto
要素だけでもちょっとしたことならできるけど、複雑なことをやるにはvalues
とkeyTimes
属性とを組み合わせるようだ。
均等にシーンを割り当てる場合はvalues
属性を書くだけで良い。
<animateTransform
attributeName="transform"
attributeType="XML"
begin="0s"
dur="8s"
repeatCount="indefinite"
values="0; 300; 300; 0; 0"
type="translate"/>
values
属性に指定した値の個数から1を引いた数でdur
属性の値が均等に割られ、割り当てられる。
シーンへの割り当てが偏る場合はvalues
属性にkeyPoints
属性でタイミングを割り当てる。
<animateTransform
attributeName="transform"
attributeType="XML"
begin="0s"
dur="8s"
repeatCount="indefinite"
values="0; 300; 300; 0; 0"
keyTimes="0; 0.375; 0.5; 0.875; 1"
type="translate"/>
keyTimes
属性ではdur
属性の値を1とした相対的な数値でvalues
属性と同じ数だけ刻む。
calcMode="discrete"
にするとアニメーション過程が省略される。
<animateTransform
attributeName="transform"
attributeType="XML"
begin="0s"
dur="8s"
repeatCount="indefinite"
calcMode="discrete"
values="0; 75; 150; 225; 300; 225; 150; 75; 0"
type="translate"/>
ここではtranslate
に対してdiscrete
なのでジャンプしているように見える。
アニメーションとジャンプを混ぜる場合はkeyTimes
属性を同じタイミングで刻むだけで良い。ジャンプのみの場合もkeyTimes
属性を使う方がdiscrete
を使うより簡単かもしれない。
<animateTransform
attributeName="transform"
attributeType="XML"
begin="0s"
dur="8s"
repeatCount="indefinite"
values="0; 150; 300; 300; 150; 0; 0"
keyTimes="0; 0.375; 0.375; 0.5; 0.875; 0.875; 1"
type="translate"/>
移動するアニメーションとジャンプするアニメーションを別々に作り、end
イベントを使ってチェーンさせるという手もあるけど、同じtranslate
のアニメーションならまとめた方が書きやすい。
これにアニメーション自体のタイミングが加わることになるので、手で書くのはこれくらいが限界な気がする。そこへ行くとCSS TransitionsやCSS Animationsは書きやすい実装なんだな、と思った。