2012-05-13 7 views
5

divをいくつか持っていて、その子に.animate({opacity:0},400, function(){});を使用しているとします。 アニメーションが完了するまでの残り時間を取得することは可能ですか?残りの200ミリ秒など、アニメーションがない場合は0ですか?おかげさまで アニメーションの残り時間を得る方法はありますか?

+1

...あなたは、その値を必要とする理由? @ RokoC.Buljan。 –

+1

。それは私が推測する趣味だ。彼はコレクションアニメーションの時代です。 – gdoron

+0

私はいくつかのコールバックを子にキューイングするのに問題があります。常にトリガーするとは限りません。子キューを判別するのは簡単ではないので、setTimeoutを使ってより信頼性の高いものを試してみたかったのです。 – Anonymous

答えて

6


私は、残り時間を取得するためにステップ機能を使用する例を作成しました:

get state!ボタンをクリックしてアニメーションを停止し、残りの時間を取得してください)

demo with distance
demo with opacity

距離の例のjQuery:

var time = 4000; 
var distance = 300; 
var currentTime = 0; 

$('#ball').animate({ 
    left: distance 
}, { 
    duration: time, 
    step: function (now, fx) { 

     currentTime = Math.round((now * time)/distance); 
     var data = fx.prop + ' ' + Math.round(now) + '; <b>' + currentTime + 'ms</b> '; 

     $('body').append('<p>' + data + '</p>'); 
    }, 
    easing: 'linear' 
}); 

$('#getTime').click(function() { 
    $('#ball').stop(); 
    $('body').prepend('<p>currentTime is:' + currentTime + ' ms; REMAINING: ' + (time - currentTime) + 'ms</p>'); 
}); 
  • あなたは、私が現在アニメーション化され(left)プロパティを取得するためにanimation stepfx.propを使用する方法を見ることができます。
  • あなたはどのように見ることができます:私たちは簡単にいくつかの簡単な数学((now*time)/distance)によって「停止/一時停止」状態を取得することができ、アニメーションの時間と距離を知ること(不透明度を、何でも...)と返さnow値のおかげで。
+0

ありがとうこれは非常に有用です!また、ステップ関数を可変書込みに限定すれば、パフォーマンスが大幅に低下することはありません。とにかく1ミリ秒か何かごとに呼ばれることはありません。 – Anonymous

+0

@ user1125062私たちは既にアニメーションを実行しているものにのみアクセスしているので、そうしてはいけません。 –

3

私はあなたがそれを必要としない理由はわかりませんが、stepあなたは、この値を抽出することができます:

ステップ関数

.animateの第二のバージョンは()ステップのオプションを提供 - アニメーションの各ステップで発生するコールバック関数。この関数は、カスタムアニメーションタイプを有効にしたり、アニメーションを変更したりするときに便利です。 2つの引数(nowとfx)を受け取り、これはアニメートされるDOM要素に設定されます。

:そのようなアニメーション要素のELEMような特性の数を含んjQuery.fxプロトタイプオブジェクトへの参照、開始:各ステップ
FXにアニメーション化されるプロパティの数値それぞれanimatedプロパティの最初と最後の値で終了し、アニメーション化されているプロパティのpropを返します。あなたがより良い[gdoronによって投稿として]あなたはstep機能 を使用することができる方法を理解するのに役立つ

docs

+0

ええ、でも、どうしたらいいですか? :) – Anonymous

+0

@ user1125062。あなたは現在の値、最初の値、最後の値などを取得することができます '、それだけで遊ぶ。とにかく私はあなたがやろうとしていることをやっている他の方法があると確信しています... – gdoron

+0

setIntervalまたはこのメソッドなし、AFAIK。これらはそれを得る唯一の方法です。 – inhan

3

すべての人が話している機能を聞いてください。step私はかつてあなたがやっていることを必要としていました。これは単純に、アニメーションの時間(以前はjQueryにこの番号を与えて以来、あなたに知られていたはずです)と商{現在の不透明度とターゲットの不透明度。次に、その商に総アニメーション時間を掛け、総時間から合計を差し引かせます。そのような単純な。

擬似コード:ちょうど好奇心のうち

func calculate-time-left-in-a-running-fade-in-animation: 
{ 
    var current_opacity = $elem.css('opacity'); 
    var target_opacity = this.getTargetOpacity(); 

    var total = this.getTotalAnimationTime(); 

    var quotient = current_opacity/target_opacity; 
    return total - quotient * total; 
} 
+0

興味深いアプローチは、それにもかかわらず!精度が重要であれば、ステップは唯一の方法です。 – Anonymous

+0

属性値を自分で取得するか、now変数を使用することは、アニメーションが一時停止されている限り、全く同じことです。 jQueryのstep-example @roXonでは、アニメーションのすべてのステップで多くのオーバーヘッドが発生します。例のようにグローバル変数を実際に導入するかもしれません。計算の前にアニメーションを一時停止し(やはり例のように)、アニメーションをプログラムで再開する場合は、全く違いはありません。私は実行中のアニメーションの下でこの計算された値を得ることは同じ結果を生み出すと言うでしょう。 –

+0

ステップロジックのストアドプロダクト、残存時間の計算値はライブリストと似ていませんが、値は最大正確な値に更新されません。そして、あなたがどこにいてもいつでもあなたが使っている "古い"計算だけではありません。理論的には精度を妨げるべきであるステップ関数であるこの情報格差の橋渡しを担う中間の人間がいます。しかし、あなたが残りの時間を知る必要があるときに、まったく同じ計算を正確に行うならば、正確ではないでしょうか?また、コードの可読性と処理オーバーヘッドの両方で安価です。 –

関連する問題