2013-08-01 5 views
12

私はこの問題を苦労しています。私が見つけることができるのは、高速であるがゆっくりと動作しているアニメーションです。私の質問は、長時間アニメーションをしたいが、やはりスムーズにしたいアニメーションに関するものです。遅いjQueryアニメーションが途切れているのはなぜですか?

私はこの問題を示すために、このjsfiddleを作成しました:http://jsfiddle.net/93Bqx/

私は要素がゆっくり時間をかけて別の位置に移動しようとしています。しかし、アニメーションは非常に不安定です。

基本的に、それはこのようなものに沸く:問題はアニメーションは、各ステップは、ピクセル未満であるので、それはそれらを丸めているように遅いことであるならば、私は思ったんだけど

$elem.animate({ 
     left: x, 
     top: y 
}, someLargeNumber); 

0または1のいずれかを指定すると、フレームをドロップしてからすべてを一度に移動するように見えます。しかし、私はこれをチェックしたり修正したりする方法を知らない。

スローアニメーションをスムーズにするためには、より良い方法がありますか?私は同様のものをCSS3で作成し、(x、y)を円滑に翻訳しましたが残念ながら私はCSSで得ることができるよりも柔軟性が必要です。

+2

トピックについてよく読んでください:http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/ – Yoshi

+0

@よし、ありがとう!正確に私が学ぶことに興味があったもの。私はそれを受け入れることができるように答えとして投稿できますか? –

答えて

5

を持っています。

代わりにCSSトランジションをテストするためにTransit jQuery pluginを追加しました。ほとんど同じです。マイナーな修正と

あなたのコード:http://jsfiddle.net/thirtydot/93Bqx/5/

同じコードが、トランジットでは、追加:http://jsfiddle.net/thirtydot/93Bqx/6/

これは、(ほとんどの)ブラウザがサブピクセルレンダリングをしないという事実の限界だと思います。あなたが言及したように、要素のxyは、アニメーションのすべてのステップの後で丸められ、見苦しい「ジグリング」効果を引き起こすのはこの丸めです。

CSSトランジションバージョンは、病理学的テストケースが少ないほど顕著に改善されています。詳細については、この記事をお読みください:http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/

+5

私はこれについて聞いたことがありませんでした。私はこのプラグインを調べなければならないでしょう。提案していただきありがとうございます!私はドキュメントを見て、トップとボトムのプロパティをアニメーション化してネイティブのx/yを使用するように変更しましたが、それはもっとスムーズです(しかし、ちょっとぎこちなく)http://jsfiddle.net/XSEd8/ –

+0

更新:私これは私の実際のコードで今働いて、それは素晴らしいです。 jquery.transitの+1。私が遭遇した問題はトランジションを止める方法ではなかったが、その機能を追加する[コードベースのフォーク](https://github.com/tblasv/jquery.transit)が見つかりました。 –

+0

お役立ち情報私は、おおまかに言うと、コンピュータの速度が遅いほど、CSSの移行バージョンが提供する改善点が増えると思います。また、あなたがまだ私の答えを受け入れるべきではないと思います。もう少し時間を与え、より良い答えが到着するかどうかを確認してください。 – thirtydot

7

アニメーションをプログラム的に行うのは避けられない交渉だと思います。 はたぶん、アニメーションに特化フレームワークのようにしてみてください:

http://www.greensock.com/gsap-js/

をが、CSSにアニメーションを適応することがベストです。

+3

ここでは、GreenSockのGSAPをtop/leftではなく、transformを使ったフォークにしています:http://jsfiddle.net/2LpgY/1/ Webkitははるかにスムーズですが、Firefoxは異なるようなアンチエイリアス手法を採用していますサブピクセルレンダリング。だから、場合によってはブラウザのことになってしまうのは間違いない。また、CSSアニメーションは、特にきついコントロールが必要な場合にはうまくいかないと主張しています。http://www.greensock.com/why-gsap/を参照してください。 – Jack

0

要素の移動頻度と関係があると思います。たとえば、1秒に1回オブジェクトを移動すると、不安定に見えます。各移動の間隔を短くすると同時に、移動の間隔を短くしてください。例はhttp://jsfiddle.net/2K9xP/を参照してください。

だから我々はそれも、CSSトランジションを使用してよりスムーズではありません...

var duration = Math.round(10 * distance); 

代わりに...

var duration = Math.round(1000 * distance); 
+4

ポイントはオブジェクトがゆっくりと動くことです。そのボックスは、エクスタシーのように動きます。 – thirtydot

+1

フレームあたりの移動量が十分に高い場合は、シームレスに移動できるという事実を実証することがさらにあります。 1秒に1ピクセルのオブジェクトを動かすと、目が細かく見えるので(私が推測するフレームレートに関係するもの)、ぼやけて見えます。 –

+0

また、より高精度の位置を求める高解像度のディスプレイがあれば、これは遅いアニメーションがよりシームレスに見えるようになります。 –