SVGアニメーション、
回転の中心を指定する。

〽️中心の座標を得る。 〽️SVGならそのまま動くが。 〽️CSS記述に変換。 〽️表現が広がる。





⬆︎SVGついてのまとめページはこちら。

こんにちは、「ふ」です。
今回は任意の位置を中心とした、SVG要素の回転アニメーションを実装したいと思います。

■ w_mill.svg

今「任意の位置」と言ったのは、「回転の中心(基準点)を好きなところに指定できる」という意味です。
上の画像(w_mill.svg)をサンプルとして使用します。

風車はSVG領域のやや右上にあります。これをその場で回転させたい。
回転アニメーション自体は単純なもので済むのですが、問題はその中心(基準点)の指定。

もし風車がSVG領域の中央に位置しているのであれば、

transform-origin:center;

とすれば事なきを得るのですが、画像の風車は「top」や「center」などでは指定できない位置にあります。
どのように基準点を指定すればいいのでしょうか??

中心の座標を得る。


先づは中心点の座標を取得しないとはじまりません。その方法ですが、書き出したコード上ではなく、ベクターソフト(イラレやVectornator)の段階で「仕込み」を行います。

ベクターソフトでSVG画像を開きます。
ここではAdobe Illustratorを使いました。

円をテキトーに描き、回転の基準にしたい場所に中心を合わせて配置します。
今回の例では風車をその場で回転させる、ということなので、双方の中心同士を揃えます。ベクターソフトでスマートガイドを使えば、簡単にできますね ♬

円を追加した状態で、あらためてSVGとして書き出し。

ファイルをコードエディタで開き、追加した円の描画タグを見つけます。
特別なことをしていなければ、1番下に追加されているはずです。




<circle class="st3" 「「1cx="569.3" cy="246.6"」」 r="33.3"/>

円(circle)のタグは、次のような属性で決定されます。

 cx:中心のx座標
 cy:中心のy座標
 r:半径


このことから、円の中心、イコール風車の回転軸の座標は( 569.3, 246.6 )という事がわかりますね!

仮に風車の中心以外を基準点にしたい場合も、好きなところに円を描いてSVG出力。これで基準点の座標が得られます。

「「3<!-- コメントアウト <circle class="st3" cx="569.3" cy="246.6" r="33.3"/> -->」」

追加した円自体はweb上に表示したくないので、コメントアウトしておきます。

SVGならそのまま動くが。


扨(さて)中心の座標が取得できたところで、SVGの属性を使ってアニメーションさせてみます。
はじめにHTMLの<body> 〜 </body>内にSVGコードを流し込み。

■ HTML > body


<body> <svg version="1.1" .... > <style type="text/css">  「「3〜略〜」」 </style> 「「1<g id = "w_mill">」」 <path .... /> <path .... /> <path .... /> ...... 「「1</g>」」 「「3<!-- コメントアウト <circle class="st3" cx="569.3" cy="246.6" r="33.3"/> -->」」 </svg> </body>

風車部分をグループ化し、idをつけておきます。「w_mill」としました。

現在のブラウザでの表示はこのようになっています。

SVGのtransform属性では、

transform = "回転角度 基準のx座標 基準のy座標"

という形で回転の状態を指定する事ができます。
先ほど取得した中心座標を使い、試しに45°回転させてみましょう。

<g id = "w_mill" 「「1transform = "rotate(45 569.3 246.6)"」」> <path .... /> <path .... /> <path .... /> ...... </g>

ちゃんと反映されました。
つぎはアニメーションさせてみましょう。今記述したtransform属性は削除して、グループの外側にanimateTransformタグを記述します。

<g id = "w_mill" >  〜略〜 </g> 「「1<animateTransform」」 「「1xlink:href = 」」「「4"#w_mill"」」 「「1attributeName =」」 「「4"transform"」」 「「1type = 」」「「4"rotate"」」 「「1from =」」 「「4"0 569.3 246.6" 」」 「「1to = 」」「「4"360 569.3 246.6"」」 「「1dur =」」 「「4"4s"」」 「「1repeatCount = 」」「「4"indefinite"」」 「「1/>」」

指定している属性は以下の通り。

 xlink:href:アニメーションの対象
 attributeName:変化させる属性
 type:transformの種類
 from:開始の状態
 to:終了状態
 dur:継続時間
 repeatCount:繰り返し

結果がこちら⬆︎です。中心を指定した回転アニメーションができました。めでたしめでたし

ところで。

ここで使用した、

transform = "回転角度 基準のx座標 基準のy座標"

はSVG独自の属性で、CSSではこの指定を使うことはできません。

実装したいアニメーションがこれだけであれば、SVG内で完結させても良いかと思います。しかし他のアニメーション要素やイベント要素なども絡めてwebを実装したい、という方もいらっしゃるでしょう。
そうなるとこの「中心を指定した回転アニメーション」を、CSSプロパティで表現できたほうが何かと便利です。次のセクションで試してみましょう。

CSS記述に変換。


CSSでの「中心を指定した回転」は、

transform-origin:〇〇; translate: rotate(〇〇);

のように、「基準点」と「回転」を分割して表記する形式をとっています。
しかも、transform-originはSVGの座標値で指定する事ができません。「%」表記に変換する必要があります。

そもそもSVG要素の座標値は、親要素であるSVG領域に定められたviewBox属性に基づいて指定されます。<svg>タグの部分をみてみましょう。

<svg version="1.1" id="レイヤー_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 「「1viewBox="0 0 841.9 595.3"」」 >

viewBoxの座標指定はx方向が「0〜841.9」、y方向が「0〜595.3」になっています。
一方、先ほど基準をとるために描画した円のコードはこちら。

<circle class="st3" 「「1cx="569.3" cy="246.6"」」 r="33.3"/>

イメージとしてはこのように。
viewBoxのxは「0〜841.9」。そのうち「569.3」のところにあるのが円の中心です。yに関しても同じ事が言えます。

ということは、この関係を「%」に変換するには

(「「1(円の中心座標)」」/「「1(viewBoxの最大値)」」) %

とすればいいのですね。

これをCSSのtransform-originに指定します。めんどくさいのでcalcを使って、計算式を直接ぶち込みましょう。

#w_mill { transform-origin:「「1calc(100% * 569.3 / 841.9) calc(100% * 246.6 / 595.3)」」; }

その上でアニメーション。

#w_mill { transform-origin:calc(100% * 569.3 / 841.9) calc(100% * 246.6 / 595.3); 「「1animation:w_mill 4s linear infinite;」」 } @keyframes w_mill { 「「1to { transform:rotate(1turn); }」」 }

これでCSSアニメーションでも同じ実装ができました。

プロパティはCSSのものを使用しているので、JavaScriptのWeb Animations API⬇︎に取り入れることもできますね。

SVGでWeb Animations API。

2020.11.12
〽️ ネイティブJavaScriptでのアニメーション。


表現が広がる。


最後までお読みいただき、ありがとうございました。

記事中で使った回転アニメーションの対象要素は1つだったので、calcを使い計算式をCSSに直接記述しました。もっとたくさんの要素を回転させたい場合には、JavaScriptで関数を組んで中心点を仕込んだほうが楽チンでしょう。

また今回はごく単純なサンプルで行いましたが、「回転の中心を自由に指定できる」というのは表現の幅がすごく広がってきます。
例えば何枚かのカードを扇型に開いたり、くすだま🎊を開いてみたり・・みなさんもそんなSVGアニメーションを作って楽しんでみてください!
ではまた〜 ♬




SVGに画像をぴったりと配置〜
preserveAspectRatio。

2021.02.19
縦横比が違っても安心。



ページめくりアニメーション 作り方。

2021.02.02
画像を読み込むだけで実装。












「ふ」です。

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