Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make the animations be run one by one?

The HTML code:

<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
</ul>

The js code:

<script type="text/javascript">
$(document).ready(function() {
    var lis = $("li");
    for (var i = 0; i < lis.length; i++) {
        $(lis[i]).animate({opacity: 0}, 1000);
    }
});
</script>

I just find that the lis will disappear together. How can I do that they will disappear one by one?

like image 706
user3077147 Avatar asked Dec 26 '14 06:12

user3077147


People also ask

How do you animate multiple objects at once?

Hold down the Ctrl key and click all the objects that you want to animate together. They don't have to be touching each other, and it's all right if they're mixed in with things that you don't want to animate.


Video Answer


1 Answers

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.

like image 114
Benjamin Gruenbaum Avatar answered Sep 30 '22 19:09

Benjamin Gruenbaum