JQuery ожидание анимации

У меня есть несколько анимаций, которые я хочу выполнять на разных объектах в dom.

Я хочу, чтобы они произошли в порядке.

Я не хочу делать это так:

$('#first').show(800, function () 
{ $('#second').show(800, function () {...etc...});

Я хочу добавить все мои анимации (и интенсивные функции процессора) в какой-то объект очереди, который будет выполнять их последовательно.

Ответ 1

Я не уверен, почему вы не хотите использовать описанный вами метод. Если его чисто с организационной точки зрения вам не нужно использовать анонимные функции

function showFirst() {
  $('#first').show(800, showSecond);
}

function showSecond() {
  $('#second').show(800, showThird);
}

function showThird() {
  $('#third').show(800);
}

function startAnimation() {
  showFirst();
}

Ответ 2

Просмотрите документацию для jQuery Effects. Материал о queueing должен делать то, что вам нужно.

Ответ 3

Я только что использовал этот плагин, http://plugins.jquery.com/project/timers, на днях, чтобы сделать аналогичную вещь. Вы в основном итерации через все совпадающие элементы dom, а затем выполняете анимацию каждый, когда индекс * ваш миллисекунда считается.

Код был примерно таким:

HTML:

<div id="wrapper">
   <div>These</div>
   <div>Show</div>
   <div>In</div>
   <div>Order</div>
</div>

JQuery

$("#wrapper div").foreach( function(i) {
    i = i + 1;
    $(this).oneTime(800 * i, "show", function()  {
        $(this).show();
    });
});

Ответ 4

Это также сработает.

            $('#first').show(800);
            setTimeout("$('#second').show(800)", 800);
            setTimeout("$('#third').show(800)", 1600);
            setTimeout("$('#forth').show(800)", 2400);

Я знаю, что это не чисто последовательный, но я нахожу, что он упрощает чтение и позволяет настраивать анимацию с большей гибкостью.

Примечание: вам нужно процитировать код, который вы хотите выполнить. Я не использовал двойные кавычки в предыдущем коде, но если бы вы это сделали, вы бы избежали их следующим образом.

            $('#first').animate({"width":"100px"}, 500);
            setTimeout("$('#second').animate({\"width\":\"100px\"}, 500)", 800);
            setTimeout("$('#third').animate({\"width\":\"100px\"}, 500)", 1600);
            setTimeout("$('#forth').animate({\"width\":\"100px\"}, 500)", 2400);

Обычно вы можете избежать этого, чередуя кавычки, которые вы используете, но хотя это было достойное упоминания.

UPDATE: вот еще один вариант, и стоит также проверить jquery promises здесь

            $('#first').show(800);
            $('#second').delay(800).show(800);
            $('#third').delay(1600).show(800);
            $('#forth').delay(2400).show(800);