我有一个时间线,可以通过单击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 });
};
如果单击一次,它将起作用。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
x 2 次点击
给我:
计算 1 -> 动画 1 开始 -> 动画 1 完成 -> 计算 2 -> 动画 2 开始 -> 动画 2 完成
并不是
计算 1 -> 动画 1 开始 -> 计算 2 -> 动画 1 完成 -> 动画 2 开始 -> 动画 2 完成
因为那么 animate 2 是基于不正确的计算。
谢谢!