gpt4 book ai didi

javascript - jQuery 动画延迟问题与步骤的自排队循环

转载 作者:数据小太阳 更新时间:2023-10-29 03:57:27 25 4
gpt4 key购买 nike

我有一个 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();
});
}
}​

这里是时间线信息

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} }
]
}
};

下面是将时间轴放入上述动画函数的函数:

$.each(timeline, function(selector, obj) {
animateWithQueue($(selector), obj);
});

这是一个完整的例子。 http://jsfiddle.net/sprintstar/Tdads/

此代码似乎工作正常,可以单击动画循环和停止按钮来停止动画、清除队列等。但是,我们面临的问题可以通过点击停止并一遍又一遍地开始来触发(比如10倍)。然后注意延迟不再正常工作,并且形状移动得更快。

这是为什么,如何解决?

最佳答案

使用delay 时有些事情不太正常...

作为解决方法,我将其替换为 doTimeoutthis 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 都会被清除。

正如我所说,与其说是修复,不如说是解决方法,因为您还需要在停止时重置元素的位置。 (注意我已经从顶部/右侧定义中删除了 += 和 -=)

关于javascript - jQuery 动画延迟问题与步骤的自排队循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12300378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com