私はjavascriptとRaphaellibを使って一種のjavascriptマップを作成しています。クリックするとオブジェクトを拡大できますが、アニメーション化する必要があります(ゆっくりと飛び込むなど)。車輪の再発明をせずにそうする方法はありますか?
2 に答える
svgオブジェクトのビューボックスをアニメーション化できない理由はありません。Raphaelは、そのような機能をそのままでは提供していません。ただし、プラグインの作成はかなり簡単です。例えば:
Raphael.fn.animateViewBox = function animateViewBox( x, y, w, h, duration, easing_function, callback )
{
var cx = this._viewBox ? this._viewBox[0] : 0,
dx = x - cx,
cy = this._viewBox ? this._viewBox[1] : 0,
dy = y - cy,
cw = this._viewBox ? this._viewBox[2] : this.width,
dw = w - cw,
ch = this._viewBox ? this._viewBox[3] : this.height,
dh = h - ch,
self = this;;
easing_function = easing_function || "linear";
var interval = 25;
var steps = duration / interval;
var current_step = 0;
var easing_formula = Raphael.easing_formulas[easing_function];
var intervalID = setInterval( function()
{
var ratio = current_step / steps;
self.setViewBox( cx + dx * easing_formula( ratio ),
cy + dy * easing_formula( ratio ),
cw + dw * easing_formula( ratio ),
ch + dh * easing_formula( ratio ), false );
if ( current_step++ >= steps )
{
clearInterval( intervalID );
callback && callback();
}
}, interval );
}
このプラグインのインストール後にインスタンス化されたすべてのペーパーは、Raphaelの組み込みのanimateメソッドが機能するのとまったく同じ方法でanimateViewBoxを使用できます。例えば...
var paper = Raphael( 0, 0, 640, 480 );
paper.animateViewBox( 100, 100, 320, 240, 5000, '<>', function()
{
alert("View box updated! What's next?" );
} );
ここでデモンストレーションが行われます。
Raphaelアニメーションは、要素の属性をアニメーション化することで機能します。element.animateを呼び出すときは、最終的なオブジェクトパラメータ、そこに到達するのにかかる時間、および線形にしたくない場合はイージング関数を指定します。
たとえば、円を拡大/縮小するには、次の例を検討してください。http: //jsfiddle.net/eUfCg/
// Creates canvas 320 × 200 at 10, 50
var paper = Raphael(10, 50, 320, 200);
// Creates circle at x = 50, y = 40, with radius 10
var circle = paper.circle(50, 40, 10);
// Sets the fill attribute of the circle to red (#f00)
circle.attr("fill", "#f00");
// Sets the stroke attribute of the circle to white
circle.attr("stroke", "#fff");
var zoomed = false;
circle.click(function () {
if (zoomed) {
this.animate({ transform: "s1" }, 500);
zoomed = false;
} else {
this.animate({ transform: "s4" }, 500);
zoomed = true;
}
});
これは、円の変換プロパティをアニメーション化します。マップを拡大縮小するには、すべての要素をグループ内に配置し、最終的に完成させたい拡大縮小と変換を考慮して、グループの変換プロパティをアニメーション化する必要があります。
変換プロパティの詳細については、http://raphaeljs.com/reference.html#Element.transformを参照してください。