zoom in
またはzoom out
ボタンをクリックしてズームできるタイムラインがあります。このタイムラインは一度にすべてが画面に収まらないため、スクロール可能な div になっています。ユーザーがクリックしてズームすると、タイムライン内の位置が同じになるようにするscrollTop
ため、スクロール可能な div の新しい値を計算します。これが私がやっていることの簡略化されたバージョンです:
var self = this;
...
this.zoomIn = function() {
var offset = $("#scrollable").scrollTop();
self.increaseZoomLevel(); // Assume this sets the correct zoom level
var newOffset = offset * self.zoomLevel();
$("#scrollable").scrollTop(newOffset);
};
これはうまくいきます。次に、スクロールをアニメーション化したいと思います。これはほとんど機能します:
var self = this;
...
this.zoomIn = function() {
var offset = $("#scrollable").scrollTop();
self.increaseZoomLevel(); // Assume this sets the correct zoom level
var newOffset = offset * self.zoomLevel();
$("#scrollable").animate({ scrollTop: newOffset });
};
1回クリックすると機能します。ただし、アニメーションがまだ実行されている間に の 2 番目の呼び出しがzoomIn
発生した場合、アニメーションがまだそれを操作してnewOffset
いるため、オフセットが正しいscrollTop()
前に設定されているため、計算が間違っています。scrollTop()
この計算を最初に行うために、jQuery のキューをさまざまな方法で使用しようとしましたが、時々うまくいくようです。
var self = this;
...
this.zoomIn = function() {
$("#scrollable").queue(function(next) {
var offset = $("#scrollable").scrollTop();
self.increaseZoomLevel(); // Assume this sets the correct zoom level
var newOffset = offset * self.zoomLevel();
next();
}).animate({ scrollTop: newOffset });
};
正しく理解できていないだけだと思いqueue
ます。zoomIn が繰り返しすばやく呼び出された場合でも、すべてを整理するにはどうすればよいですか? 私が欲しい:
zoomIn
×2クリック
私に与える為に:
計算 1 -> アニメーション 1 開始 -> アニメーション 1 終了 -> 計算 2 -> アニメーション 2 開始 -> アニメーション 2 終了
そしてそうではない
計算 1 -> アニメーション 1 開始 -> 計算 2 -> アニメーション 1 終了 -> アニメーション 2 開始 -> アニメーション 2 終了
animate 2 は間違った計算に基づいているためです。
ありがとう!