Sorry for joining the party late.
The existing answers have issues when a timer blocks and rely on the accuracy of timers, moreover they require an actual delay.
jQuery actually provides a generic way to perform animations sequentially with promises:
$(document).ready(function() {
var lis = $("li");
var queue = $.Deferred().resolve(); // create an empty queue
lis.get().forEach(function(li){
queue = queue.then(function(){
return $(li).animate({opacity: 0}, 1000).promise();
})
});
});
Fiddle
Note that this will work even if you assign them different animation durations or different animations, the result in queue
will contain a hook on when the last animation finished. This also supports aggregations (waiting for all promises to finish in parallel) and more.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…