jQuery动画延迟问题与自行循环的步骤

时间:2012-09-06 12:42:16

标签: javascript jquery jquery-animate

我有一个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倍)。然后注意延迟不再正常工作,并且形状移动得更快。

为什么会这样,以及如何解决?

2 个答案:

答案 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/可能有用