JavaScriptのすべてのタイマーは、ネイティブのプレーンな古い学校のJavaScript関数setInterval()
またはに基づいていますsetTimeout()
。jQueryでさえこれを内部的に使用します。
タイマーを同期する秘訣setInterval()
は、呼び出されるタイマーが1つだけであることを確認することです。そのため、自分で何かを作成します。
アニメーションは次のように設計できます。
これで、関数がによって呼び出されるたびに、setInterval()
すべてのDOM要素を一度に正しい位置に設定できます。各アニメーションフレームのどこに要素を配置するかを見つけるには、次を使用します。
var diff = ( to - from );
var stepValue = from + diff * percentage;
jQueryイージング関数は直接呼び出すことができ、最終的なステートメントは次のようになります。
var stepValue = jQuery.easing[ easingMethod ]( percentage, 0, from, diff );
私はこれをクラスに変えました:
/**
* Animation timeline, with a callback.
*/
function AnimationTimeline( params, onstep )
{
// Copy values.
// Required:
this.from = params.from || 0; // e.g. 0%
this.to = params.to || 1; // e.g. 100%
this.onstep = onstep || params.onstep; // pass the callback.
// Optional
this.steps = params.steps || 10;
this.duration = params.duration || 300;
this.easing = params.easing || "linear";
// Internal
this._diff = 0;
this._step = 1;
this._timer = 0;
}
jQuery.extend( AnimationTimeline.prototype, {
start: function()
{
if( this.from == this.to )
return;
if( this._timer > 0 )
{
self.console && console.error("DOUBLE START!");
return;
}
var myself = this;
this._diff = ( this.to - this.from );
this._timer = setInterval( function() { myself.doStep() }, this.duration / this.steps );
}
, stop: function()
{
clearInterval( this._timer );
this._timer = -1;
this._queue = [];
}
, doStep: function()
{
// jQuery version of: stepValue = from + diff * percentage;
var percentage = ( this._step / this.steps );
var stepValue = jQuery.easing[ this.easing ]( percentage, 0, this.from, this._diff );
// Next step
var props = { animationId: this._timer + 10
, percentage: percentage
, from: this.from, to: this.to
, step: this._step, steps: this.steps
};
if( ++this._step > this.steps )
{
stepValue = this.to; // avoid rounding errors.
this.stop();
}
// Callback
if( this.onstep( stepValue, props ) === false ) {
this.stop();
}
}
});
そして今、あなたは使うことができます:
var el1 = $("#element1");
var el2 = $("#element2");
var animation = new AnimationTimeline( {
easing: "swing"
, onstep: function( stepValue, animprops )
{
// This is called for every animation frame. Set the elements:
el1.css( { left: ..., top: ... } );
el2.css( { left: ..., top: ... } );
}
});
// And start it.
animation.start();
一時停止/履歴書を追加することは、読者にとっての演習です。