SVGのpathを使ったモーションパスアニメーションの実装方法

SVGのpathを使ったモーションパスアニメーションの実装方法

おじいちゃん

おじいちゃん

こんにちは、おじいちゃんです

今回はSVGのpathを使ったモーションパスアニメーションの実装方法について書きたいと思います。


【こちらもおすすめ】

 
SVGとjQueryで絵を描いているようなアニメーションを実装する方法

SVGのpath要素

path要素を使うことで、好きな図形を描くことができます。
Illustratorを使っている方はよく使ってますよね。Illustratorで描いたパスからSVGを書き出して使うこともできるのですが、今回は直接SVGタグのpath要素に描いて作ってみましょう。

 
d=”M 50,50 L 200,50 Z

SVGでpathを描く場合は、上のように各コマンドパラメータをいれることでpathを描画できます。少しクセがありますが、自分で好きなpathを描いてみると慣れてきますので、遊んでみてください。

pathを描画するためのコマンドは下記があります。

  • m/M : pathの始点を移動
  • Z : pathを閉じる
  • l/L : 直線
  • h/H : 水平線・垂直線(X座標)
  • v/V : 水平線・垂直線(Y座標)
  • q/Q : 2次ベジェ曲線
  • t/T : 2次ベジェ曲線(制御点は前の曲線から自動計算)
  • c/C : 3次ベジェ曲線
  • s/S : 3次ベジェ曲線(制御点は前の曲線から自動計算)
  • a/A : 円弧 半径,半径

SVGとpathについては下記サイトでまとめられているので、ぜひ読んでみてください。

参考:10分でわかるSVG 基礎編

さっそくpathを描いてみる

それでは、アニメーションさせたい軌道をpathで描いてみましょう。
まずは直線から。

<svg id="svg" width="500" height="500">
    <path id="target_path" d="
			M 10,250
			L 490,250 Z"
    stroke="#000" fill="none" />
</svg>

line_only

描けましたね。
線です。

次に動かしたいSVG要素を配置しましょう。

<svg id="svg" width="500" height="500">
    <path id="target_path" d="
			M 10,250
			L 490,250 Z"
    stroke="#000" fill="none" />
   <circle id="move_circle" cx="0" cy="0" r="5" fill="red"></circle>
</svg>

半径5pxの赤丸をSVG要素の左上に配置しました。
cxやxyで座標位置をずらせるのですが、今は気にしないでください。

アニメーションさせてみよう

SVGでアニメーションさせる方法はいくつかあるのですが、今回は、

  • SVGDOMのanimateMotionタグを使ったアニメーション
  • JavaScriptを使ったアニメーション

この2つについて書きたいと思います。

animateMotionタグを使ったアニメーション

先ほど作ったcircleの中にanimateMotionタグを配置し、下記プロパティを設定します。

  • dur:秒数
  • repeatCount:再生回数(リピートしたい場合はindefinite)

mpath要素で動かしたいpathのセレクタを指定してください。

<svg id="svg" width="500" height="500">
    <path id="target_path" d="
			M 10,250
			L 490,250 Z"
    stroke="#000" fill="none" />
   <circle id="move_circle" cx="0" cy="0" r="5" fill="red">
       <animateMotion dur="3s" repeatCount="indefinite">
         <mpath xlink:href="#target_path"></mpath>
       </animateMotion>
   </circle>
</svg>

line01_move

記事内で使われている画像は参考のgifです。

animateMotionメソッドを使うことで、モーションパスに沿ったアニメーションを実装することができます。

SVGDOMのアニメーションについては、下記サイトでまとめられているので参考にしてみてください。

参考:SVGで図形やアニメを描画してみよう

animateMotionメソッドは、簡単にモーションパスアニメーションを実装できるのですが、残念ながら一部のIEとAndroidが対応していません。
使いどころを選ぶ必要があります。

JavaScriptを使ったアニメーション

次にJavaScriptを使ったアニメーション方法です。

//pathを取得
var $targetPath = document.getElementById('target_path');
//動かしたいsvg要素を取得
var $moveCircle = document.getElementById('move_circle');

//動かす値を取得
var counter = 0;
//再生方向反転用フラグ
var state = true;
//pathの長さを取得
var leng = $targetPath.getTotalLength();

//アニメーション関数
function moveCircle(){
  
  //終点についたら反転させる判定
  if( parseInt(counter,10) === 1 ){
    state = false;
  } else if ( parseInt(counter,10) < 0 ){
    state = true;
  }
  
  //アニメーション用のcounter
  if(state){
    counter += 0.003;
  } else {
    counter -= 0.003;
  }
   
  //現在の座標位置を取得
  var point = $targetPath.getPointAtLength(counter * leng);
 
 //動かしたいSVG要素のtranslateを変更
  $moveCircle.setAttribute("transform","translate("+ point.x + ","+ point.y +")");
  
  //再帰
  window.requestAnimationFrame(moveCircle);
}

var timer = window.requestAnimationFrame(moveCircle);

pathに関するメソッドは下記サイトにまとめられているので参考にしてみてください。

参考:MDN SVGPathElement(英語)

pathを好きなように変えてみる

今までは直線でしたが、今度は好きなpathを描いてみてください。

直線のpathを複数つないでみたり、

<path id="target_path" d="
		M 10,250
		L 490,250 490,490 10,490 Z"
    stroke="#000" fill="none"/>

line02_move

 

2次ベジェ曲線を描いてみたり、

<path id="target_path" d="
		M 10,250
		Q 130,100  250,250&amp"
    stroke="#000" fill="none" />

curve01_move

 

2次ベジェ曲線を複数描いてみたり。

<path id="target_path" d="
             M 10,250
             Q 130,100 250,250 370,400 490,250"
    stroke="#000" fill="none" />

curve02_move

pathに沿ってアニメーションしていますね。
この動きを応用することでjQueryのanimateでは実現が難しい曲線を描く軌道でも、好きなようにアニメーションさせることができます。

まとめ

いかがだったでしょうか。

SVGを使えば表現できるアニメーションの幅が広がるので、興味のある方はぜひ勉強してみてください。

上京して早2年。「おじいちゃん」と呼ばれ早2年。

名前で呼んでくれる人がいても、
いいのではないだろうかと、
思ったりしてます。

ほんでは!

 

【アニメーション表現の幅を広げる!】

CSS3とjQueryでオリジナル画像のスプライトアニメーションを実装する方法

animateとjQuery.Deferredで動きのある「トップへ戻る」ボタンを作ってみよう

p5.jsでProcessingのようにリッチなWeb表現を作るチュートリアル

ScrollMagicを使ってスクロールに応じたアニメーションをさせてみよう

小さな工夫が光る、テキストリンクのHoverアニメーション参考集

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

おじいちゃん
おじいちゃん フロントエンドエンジニア / 後藤 寛一

フロントエンドエンジニアのおじいちゃんと言います。本当は24歳です。よろしくお願いします。

このメンバーの記事をもっと読む
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL