如何使动画依次运行?

13

HTML代码:

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

这段js代码:

<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>

我刚刚发现列表一起消失了,有什么方法可以让它们一个接一个地消失吗?

5个回答

11

抱歉晚来参加聚会。

现有的答案在计时器阻塞时存在问题,并且依赖计时器的准确性,此外它们需要实际延迟。

jQuery实际上提供了一种通用的方式来使用promise按顺序执行动画:

$(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

请注意,即使您为它们分配不同的动画持续时间或不同的动画,queue 中的结果都将包含最后一个动画完成时的钩子。这还支持聚合(并行等待所有承诺完成)等更多功能。


8

每个元素都有自己的动画队列,因此它们会同时进行动画,而不是等待前一个元素完成。您可以为每个元素添加延迟:

$(lis[i]).delay(i*1000).animate({opacity: 0}, 1000);
// ------^^^^^^^^^^^^^^

Demo: http://jsfiddle.net/p2kdpxr3/


5

使用delay()

函数

$(lis[i]).delay(i * 500).animate({opacity: 0}, 1000);

DEMO


1

你可以使用delay()函数

for (var i = 0; i < lis.length; i++) {
    $(lis[i]).delay(i * 400).animate({opacity: 0}, 1000);
              ^^^^^^^^^^^^^^
}

JS Fiddle


1

您可以使用CSS的animation/transition和相应的transitionEnd事件来实现以下逻辑:

$(function() {
  var events = [
    "webkitTransitionEnd",
    "oTransitionEnd",
    "otransitionend",
    "MSTransitionEnd",
    "transitionend"
  ];


  $("li").on(events.join(" "), function(e) {
    $(this).next().addClass('animated');
  }).first().addClass('animated');
});
li {
  opacity: 1;
  -webkit-transition: opacity 1s;
  -moz-transition: opacity 1s;
  -ms-transition: opacity 1s;
  -o-transition: opacity 1s;
  transition: opacity 1s;
}
li.animated {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

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

-演示 jsFiddle-


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接