【问题标题】:How can I make the animations be run one by one?我怎样才能让动画一个一个地运行?
【发布时间】:2015-02-23 13:12:46
【问题描述】:

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>

我只是发现lis会一起消失。怎样才能让它们一个一个消失?

【问题讨论】:

    标签: jquery web jquery-animate


    【解决方案1】:

    很抱歉迟到了。

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

    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 中的结果将包含最后一个动画完成时的挂钩。这也支持聚合(等待所有 Promise 并行完成)等等。

    【讨论】:

      【解决方案2】:

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

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

      演示:http://jsfiddle.net/p2kdpxr3/

      【讨论】:

        【解决方案3】:

        使用delay()

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

        DEMO

        【讨论】:

          【解决方案4】:

          你可以使用delay()函数

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

          JS Fiddle

          【讨论】:

            【解决方案5】:

            您可以改为使用 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>

            -DEMO jsFiddle-

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多