【问题标题】:jQuery chained animation without plugin没有插件的jQuery链式动画
【发布时间】:2011-06-02 15:19:58
【问题描述】:

在使用 jQuery 之前,我可以制作一个带有延迟的链式动画,如下所示:

$("#element").delay(45).animate({ }, 45)
             .delay(45).animate({ }, 45)
             .delay(45).animate({ }, 45);

现在自从更新到 v1.6.1 后,它不再像以前那样做,现在它会跳到最后一个动画。忽略前面的说法。我知道我可以为每个动画做一个完整的回调,但这会变得很混乱:

$("#element").delay(45).animate({ }, 45, function(){
    $("#element").delay(45).animate({ }, 45, function(){
        $("#element").delay(45).animate({ }, 45);
    })
}) 

有谁知道我如何以简单干净的方式完成此任务?

【问题讨论】:

  • +1 很乐意看到我为此简单干净
  • 等等,是什么导致了这个?
  • 不确定。它工作得很好,我更新了 jQuery 版本,但它不再工作了,所以我不得不改变我的代码来处理回调。

标签: jquery animation chaining


【解决方案1】:

编辑:添加了Fiddle 供你玩

这段代码是我前段时间写的,也许对你有用? (抱歉缩进凌乱)

/**
 * Queue.js
 *
 * @author Arend van Waart
 *
 *  This will allow for events to be queued by timestamp
 *
 * @example
 *  queue({
 *  1000: function () {
 *       // element a na 10ms uitfaden, en daar 100ms over doen
 *       $('#menu').fadeOut(2000);
 *  },
 *  500: function () {
 *    // na 50 ms element b en c inzoemen
 *    $('#content').slideUp(2000);
 * }
 * });
 */

var queue = function(queue){
    var self = this;
    // queue
    this.queue = queue;
    // time passed is 0
    this.timePassed = 0;
    // time in ms to sleep between checks.
    this.sleep = 100;

    var time = new Date();
    this.lastTime = time.getTime();
    this.iterate = function(){
        var total = 0;
        var time = new Date();

        // how much time has passed since we slept?
        self.timePassed = self.timePassed + (time.getTime() - self.lastTime);
        self.lastTime = time.getTime();
        for (var t in self.queue){
            if (t <= self.timePassed){
                self.queue[t]();
                delete(self.queue[t]);
            }
            total++;
        }

        if (total == 0){
            return;
        }else{
            setTimeout(self.iterate, self.sleep);
        }
    }
    this.iterate();
}

【讨论】:

  • 有趣的似乎它可能非常有用。作为一个 jQuery 插件会很棒。
  • 感谢您清理 mcgrailm!
  • 感谢您将其添加到 jsFiddle。效果很好,而且很轻
  • 这样做会很棒,所以添加的时间是绝对的或相对的。这意味着您可以传递 1000 或“+1000”,然后将其添加为相对于最后一个项目的时间而不是从 0。这有意义吗?我知道 TweenMax for AS3 可以做到这一点。
  • 嗯,是的,这是有道理的,但我不确定普通对象是否是这样订购的。我明天可以试一试。
【解决方案2】:

这是根据要求的第二种方式。我将它发布在另一个答案中,因为它更复杂,而且可能不那么漂亮。要玩它,请参阅:http://jsfiddle.net/LMptt/1/

用法:使用带有 + 或 - 的字符串来表示相对时间戳。顺序对于相对时间戳很重要(相对于之前的操作)。使用“+0”或“-0”表示与前一个相同的时间戳。绝对时间戳(整数)可以放在列表中的任何位置。

$(document).ready(function ()
{
    queue([
        [2000, function () {  $('.two').slideUp(); }],
        ['-1000', function () {  $('.one').slideUp(); }],
        [3000, function () {  $('.three').slideUp(); }],
        ['+1000', function () {  $('.four').slideUp(); }]
    ]);

});

/**
 * Queue.js
 *
 * @author Arend van Waart
 *
 *  This will allow for events to be queued by (relative) timestamp
 */

 function queue (queue){
    var self = this;
    // queue
    this.queue = queue;
    // time passed is 0
    this.timePassed = 0;
    // time in ms to sleep between checks.
    this.sleep = 100;

    var time = new Date();
    this.lastTime = time.getTime();
    this.iterate = function(){
        var total = 0;
        var time = new Date();

        // how much time has passed since we slept?
        self.timePassed = self.timePassed + (time.getTime() - self.lastTime);
        self.lastTime = time.getTime();

        for (var i in self.queue) {
            if (self.queue[i][0] <= self.timePassed){
                self.queue[i][1]();
                self.queue.splice(i,1);
            } else {
                // added sorting now, so we don't have to evaluate the rest.
                break;
            }
        }

        if (self.queue.length == 0){
            return;
        }else{
            setTimeout(self.iterate, self.sleep);
        }
    }


    this.parseRelative = function ()
    {
        var absoluteQueue = [];
        var lastAbsolute = 0;
        for (var i in queue)
        {
           var absolute;
           var firstChar = String(queue[i][0]).charAt(0);
           if (firstChar == "+" ||  firstChar == "-")
           {
              absolute = lastAbsolute + parseInt(queue[i][0]);
           } else {
              absolute = parseInt(queue[i][0]);
           }
           lastAbsolute = absolute;
           absoluteQueue.push([absolute, queue[i][1]]);
        }
        this.queue = absoluteQueue;
    }
    this.sort = function (a,b)
    {
        return a[0] - b[0];
    }

    this.parseRelative();
    this.queue.sort(this.sort);
    this.iterate();
}   

【讨论】:

  • 再次+1 以获得双重答案!不知道你说什么,这个看起来很干净。
  • 太棒了!甚至没有意识到你发布了这个更新的。伟大的工作
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多