Snap.svg は、SVG を扱う JavaScript のライブラリの一つで、特にベクター図形のアニメーション作成に広く用いられています。
SVG が扱う図形は、単純にいえば、2点間を結ぶ直線を基本にしています。各直線について前の状態と後の状態が与えられているとします。短時間当たりの微小変化を計算して表示すれば、前の図形が後の図形に滑らかに変化するように見えます。Snap.svg は、そのプロセスを簡単に記述できる関数を提供しています。
Snap.svg を用いるには、
CDN <script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg.js"></script>
を記述するだけです。
単純な例として、左上の長方形を位置と形状を変化させて右下の円に変化させます。
x y width height rx ry 前図形(左上) 0 0 100 100 0 0 後図形(右下)150 80 50 50 25 25
ソースコード
function Rect1() { var svg = Snap('#svgRect'); svg.clear(); var 図形 = svg.rect(); // 図形が rect であること宣言 var 変化時間 = 3000; var 打切時間 = 3000; function anim(){ 図形.attr( {x:0, y:0, width:100,height:100, rx:0, ry:0, fill:"aqua", stroke:"blue"}); // 前図形 図形.animate( {x:150, y:80, width:50,height:50, rx:25, ry:25 }, // 後図形 変化時間, // 初期状態→最終状態のサイクル時間 function(){ anim(); } ); setTimeout(function(){図形.stop()},打切時間); }; anim(); }
アニメーションは、次の形式で記述します。
function anim() {
{図形.attr[前図形], 図形.animate([後図形], 変化時間, イージング);
};
変化の方法では、コールバック関数で、自分自身 anim() を再帰呼び出しして、アニメーションを継続させます。
後図形は前図形から変化する属性だけを記述します。ところが、色(fill)や回転などの属性を与えると、エラーになってしまいます。私にはその原因がわかりません。
最も一般的なのは、図形を直線のつながりとして表現する(path図形)にすることでしょう。
この場合は、path の d 属性を配列として与えるのが通常です。
そして、前図形の直線と後図形の直線が1:1の対応をしている必要があります。
function Path1() { var svg = Snap('#svgPath1'); // Snap.svgを定義 svg.clear(); // 前後図形のパス var 前図形 = "M 30 30 L 120 30 V 120 H 30 Z"; var 後図形 = "M 100 100 L 120 30 V 120 H 30 Z"; // 初期状態 var 図形 = svg.path(前図形).attr({stroke: "blue", strokeWidth:4, fill: 'aqua'}); // 変化 var 変化時間 = 1000; // アニメーション時間 var イージング = mina.easein; // Snap.svgで定義されているイージング関数 図形.animate({path: 後図形}, 変化時間, イージング); // 前図形→後図形 }
画面をマウスクリックすれば後図形になり、再度クリックすれば前図形に戻ります。
このような操作はよく用いられますが、コードは下の後半を追加するだけです。
function Path2() {
var svg = Snap('#svgPath2'); // Snap.svgを定義
svg.clear();
// 前後図形のパス
var 前図形 = "M 30 30 L 120 30 V 120 H 30 Z";
var 後図形 = "M 100 100 L 120 30 V 120 H 30 Z";
// 初期状態
var 図形 = svg.path(前図形).attr({stroke: "blue", strokeWidth:4, fill: 'aqua'});
var 変化時間 = 1000; // アニメーション時間
var イージング = mina.easein; // Snap.svgで定義されているイージング関数
var クリック = false; // クリックの状態 false クリック
svg.click(function () {
if (!クリック) {
図形.animate({path: 後図形}, 変化時間, イージング); // 前図形→後図形
クリック = true; // クリック状態にする
}
else {
図形.animate({path: 前図形}, 変化時間, イージング); // 後図形→前図形
クリック = false; // クリック状態解消
}
});
}