私が持っている場合<div id="curve" style="position:relative; height:100px; width:100px; />
曲線上でどのように動かすのですか?私はググってみましたが、一度に2つの関数を呼び出す別の例を見つけることができません。これは私が望む種類のコードですが、動作しません:
$('#curve').click(function () {
$(this).animate(
{
top: 400,
left = $(this).left() + $(this).left()*$(this).left()
},
'slow',
function() { $(this).animate( { left: 600 }, 'fast' ); }
);
});
それが正しいコードではない場合でも、animateは移動先の「宛先」しかとらないので、動的宛先は機能しないと思います。これを機能させるために私は何を探していますか?
編集::私は間違いなくそのプラグインをピックアップしますが、なぜこのコードが期待どおりに機能しないのかも不思議です。
次に、forループとdelayメソッドを使用した別の試みを示します。
$('#curve').click(function () {
for (var i=0; i<400; i++ )
{
$(this).delay(1000);
$(this).css( { top: i, left: i*1.5 } );
}
});
ただそれが即座にその位置に行くことを除いて、遅延や何もありません。したがって、[0,0]から始まっていた場合、クリックするとすぐに[400,600]にテレポートします。遅延が機能しないのはなぜですか?
今回は、jsでアニメーションカーブを部分ごとに再計算し、少しずつ移動する必要があると思います(=プラグインを見つけることができますORすべてを実行する必要があります)自分で数学)
編集2:以前に追加されたリンクが移動されました=> http://foxparker.wordpress.com/2009/09/22/bezier- curves-and-arcs-in-jquery / 。ありがとう、ザック。
編集1:これは私に興味をそそられたので、Googleの研究はほとんど行いませんでした-思ったとおり、ここで使用できるプラグイン: http:/ /foxparker.wordpress.com/2009/09/22/bezier-curves-and-arcs-in-jquery/
jQuery.pathプラグイン はあなたが望むものです:
例:円弧に沿ってアニメートする
var arc_params = {
center: [285,185],
radius: 100,
start: 30,
end: 200,
dir: -1
};
$("my_elem").animate({path : new $.path.arc(arc_params)});
例:正弦波に沿ってアニメートする
var SineWave = function() {
this.css = function(p) {
var s = Math.sin(p*20);
var x = 500 - p * 300;
var y = s * 50 + 150;
var o = ((s+2)/4+0.1);
return {top: y + "px", left: x + "px", opacity: o};
}
};
$("my_elem").animate({path : new SineWave});
これは、アニメーションパスに任意の3次ベジェカーブを許可し、回転角度を計算することもできる、私が書いたシンプルな小さなライブラリです。 (ライブラリはまだ洗練または文書化されていませんが、ページにSVG要素がない場合でも、SVGのDOMの肩の上に立つことがいかに簡単かを示しています。)
http://phrogz.net/SVG/animation_on_a_curve.html
コードを編集して曲線/アニメーションの変更を監視するか、曲線を編集してコードの更新を確認できます。
私のサイトがダウンした場合、後世に関連するコードは次のとおりです:
function CurveAnimator(from,to,c1,c2){
this.path = document.createElementNS('http://www.w3.org/2000/svg','path');
if (!c1) c1 = from;
if (!c2) c2 = to;
this.path.setAttribute('d','M'+from.join(',')+'C'+c1.join(',')+' '+c2.join(',')+' '+to.join(','));
this.updatePath();
CurveAnimator.lastCreated = this;
}
CurveAnimator.prototype.animate = function(duration,callback,delay){
var curveAnim = this;
// TODO: Use requestAnimationFrame if a delay isn't passed
if (!delay) delay = 1/40;
clearInterval(curveAnim.animTimer);
var startTime = new Date;
curveAnim.animTimer = setInterval(function(){
var elapsed = ((new Date)-startTime)/1000;
var percent = elapsed/duration;
if (percent>=1){
percent = 1;
clearInterval(curveAnim.animTimer);
}
var p1 = curveAnim.pointAt(percent-0.01),
p2 = curveAnim.pointAt(percent+0.01);
callback(curveAnim.pointAt(percent),Math.atan2(p2.y-p1.y,p2.x-p1.x)*180/Math.PI);
},delay*1000);
};
CurveAnimator.prototype.stop = function(){
clearInterval(this.animTimer);
};
CurveAnimator.prototype.pointAt = function(percent){
return this.path.getPointAtLength(this.len*percent);
};
CurveAnimator.prototype.updatePath = function(){
this.len = this.path.getTotalLength();
};
CurveAnimator.prototype.setStart = function(x,y){
var M = this.path.pathSegList.getItem(0);
M.x = x; M.y = y;
this.updatePath();
return this;
};
CurveAnimator.prototype.setEnd = function(x,y){
var C = this.path.pathSegList.getItem(1);
C.x = x; C.y = y;
this.updatePath();
return this;
};
CurveAnimator.prototype.setStartDirection = function(x,y){
var C = this.path.pathSegList.getItem(1);
C.x1 = x; C.y1 = y;
this.updatePath();
return this;
};
CurveAnimator.prototype.setEndDirection = function(x,y){
var C = this.path.pathSegList.getItem(1);
C.x2 = x; C.y2 = y;
this.updatePath();
return this;
};
JQuery 1.4を使用していますか?
$(this).animate({
left: [500, 'easeInSine'],
top: 500
});
これを機能させるにはイージングプラグインが必要です: http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js
pathAnimator と呼ばれる、直線ではないアニメーション専用の小さなスクリプトがあります
非常に小さく、非常に効率的です。そしてjQueryも必要ありません;)