我有一个timeline
定义,列出了选择器以及要应用于该对象的延迟和动画列表。您可以指定循环特定对象的步骤。
以下是用于对动画进行排队的函数:
function animateWithQueue(e, obj) {
if ($.queue(e[0]).length == 0) {
e.queue(function doNext(next) {
$.each(obj.steps, function(i, step) {
e.delay(step.pause).animate(step.anim, step.options);
});
if (obj.loop) {
e.queue(doNext);
}
next();
});
}
}
以下是timeline
信息
var timeline = {
'.square': {
loop: true,
steps: [
{ pause: 800, anim: { right: '+=200' }, options: { duration: 400} },
{ pause: 1000, anim: { right: '-=200' }, options: { duration: 400} }
]
},
'.circle': {
loop: true,
steps: [
{ pause: 1200, anim: { top: '+=200' }, options: { duration: 400} },
{ pause: 1200, anim: { top: '-=200' }, options: { duration: 400} }
]
}
};
这是将timeline
置于上述动画函数中的函数:
$.each(timeline, function(selector, obj) {
animateWithQueue($(selector), obj);
});
这是一个完整的例子。 http://jsfiddle.net/sprintstar/Tdads/
此代码似乎工作正常,可以单击动画循环和停止按钮来停止动画,清除队列等。但是我们面临的问题可以通过点击停止并重复开始来触发(比如说10倍)。然后注意延迟不再正常工作,并且形状移动得更快。
为什么会这样,以及如何解决?
答案 0 :(得分:1)
使用delay
...
作为一种解决方法,我已将其替换为doTimeout
中的this fiddle,因此以下内容:
e.delay(step.pause).animate(step.anim, step.options);
成为:
var timerName = e[0].className + $.now();
timeouts.push(timerName);
e.queue(function(next) {
e.doTimeout(timerName, step.pause, function() {
this.animate(step.anim, step.options);
next();
});
});
timeouts
是一组唯一的超时ID - 当按下停止按钮时,每个超时ID都被清除。
正如我所说,更多的是解决方法而不是修复,因为您还需要重置停止元素的位置。 (注意我已从顶部/右侧定义中删除了+ =和 - =)
答案 1 :(得分:0)
看着你的停止处理程序,我怀疑.stop()被错过了。 我会将它定位在.circle和.square而不是持有div。
因为元素的移动速度越来越快,越来越快,并且结果表明动画正在堆积在自己身上。
api.jquery.com/clearQueue/和http://api.jquery.com/stop/可能有用