一部のブラウザはをサポートrequestAnimationFrame
しているので、それを使用してみませんか?結局のところ、それはグーグルクローム10以来サポートされています。それにもかかわらず、jQueryはそれを使用していないようです。それについてのバグレポートを見つけましたが、本当の説明はありませんでしたか?ただし、jQueryの人々には理由があると確信しています。
なぜ彼らはこの素晴らしいAPIを使用しないのでしょうか?
一部のブラウザはをサポートrequestAnimationFrame
しているので、それを使用してみませんか?結局のところ、それはグーグルクローム10以来サポートされています。それにもかかわらず、jQueryはそれを使用していないようです。それについてのバグレポートを見つけましたが、本当の説明はありませんでしたか?ただし、jQueryの人々には理由があると確信しています。
なぜ彼らはこの素晴らしいAPIを使用しないのでしょうか?
チケット#9381で、彼らがrequestionAnimationFrame
しばらくして使用をやめた理由を読むことができます。
要約すると、問題は、ウィンドウにフォーカスがない場合にアニメーションが実行されない(ブラウザがCPU負荷を軽減しようとする)ことでした。これは、ウィンドウが非表示の場合は問題ありませんが、ウィンドウが非表示の場合は問題があり、フォーカスが外れているだけです。さらに、アニメーションのキューが山積みになり、ウィンドウが再びフォーカスを取り戻した後、事態は悪化しました。これには、コードの醜い変更や、アニメーションキューへの追加方法の変更が必要になります。そのため、これを行うためのより良い方法が見つかるまで、サポートを削除することが決定されました。
ここで他の答えと反対意見を考えて、私はこれを簡単なスライドショーアニメーションでテストしたいと思いました。
2013年の時点で、ここでの他の回答の異議はもはや重要ではないようです。私は追加しました
私の既存のアニメーションコードに追加し、それがオンになっていて、使用中のフェードアニメーションに影響を与えていることを確認しました。Chrome 30、IE 11、FF 24のバックグラウンドウィンドウでも確実に動作します。Android2.3をテストすると、ポリフィルを使用しており、期待どおりに動作しているようです。
jQuery3.0はrequestAnimationFrameを統合します。基本的に、jQueryはそれをうまく処理できますが、一部のユーザーは.setInterval(function() { tag.animate(
それを台無しにして呼び出すでしょう。したがって、メジャーバージョンリリースへのパント。jQuery 3はIE8以下をサポートしておらず、今後もサポートしないため、IE8ユーザーがいる場合は、jQuery1.xを使用してください。
私のテストでは、CPU/バッテリー節約の主張requestAnimationFrame
は誤った約束です。たとえば、ロングフェードをオンにすると、CPU使用率が高くなります。CPU /バッテリーを節約するのはCSSトランジションです。おそらく、ブラウザー、特にモバイルブラウザーは、意図していることや他に何を求められているかについて、はるかに強力な仮定を立てることができ、ネイティブコードはJavascript+DOMよりも高速です。
したがって、CPU /バッテリーを本当に節約したい場合は、CSSトランジションが最適です。IE9以下ではそれらを処理できず、まだ多くのユーザーがいるため、ページの下部にあるjquery.transitとそのフォールバックを検討animate
してください。
v1.6.2のjQueryソースでは、requestAnimationFrame
存在する場合に使用されていることがわかります。コードを詳細に調べて、使用できるすべてのものに使用されていることを確認していませんが、コードの呼び出しではなく、コードのアニメーションセクションで使用されていますsetInterval()
。1.6.2のコードは次のとおりです。
// Start an animation from one number to another
custom: function( from, to, unit ) {
var self = this,
fx = jQuery.fx,
raf;
this.startTime = fxNow || createFxNow();
this.start = from;
this.end = to;
this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
this.now = this.start;
this.pos = this.state = 0;
function t( gotoEnd ) {
return self.step(gotoEnd);
}
t.elem = this.elem;
if ( t() && jQuery.timers.push(t) && !timerId ) {
// Use requestAnimationFrame instead of setInterval if available
if ( requestAnimationFrame ) {
timerId = true;
raf = function() {
// When timerId gets set to null at any point, this stops
if ( timerId ) {
requestAnimationFrame( raf );
fx.tick();
}
};
requestAnimationFrame( raf );
} else {
timerId = setInterval( fx.tick, fx.interval );
}
}
},
私はまだ1.6.4を使用していないので、そのバージョンについてはわかりません。そのバージョンにない場合は、いくつかの問題があったため、削除されました。
編集:
このブログ投稿を読むと、1.6.3から削除され、おそらく1.7に戻されるようです。削除された主な理由は、(おそらくそれは意見の問題ですが)。