JQuery 动画和效果适用于 $.when() 和 then() 的几个元素

JQuery animation and effects apply for several elements with $.when() and then()

我有 html 这样的元素,

<div class="row h-100 p-3 justify-content-center align-items-center m-0">
        <h1 class="col-12 text-center position-absolute welcome-line-1 d-none-edited" id="welcome-line-1">TEXT 01</h1>
        <h3 class="col-12 text-center position-absolute welcome-line-2 d-none-edited" id="welcome-line-2">TEXT 02</h3>
        <h2 class="col-12 text-center position-absolute welcome-line-3 d-none-edited" id="welcome-line-3">TEXT 03</h2>
    </div>

我想使用 jQuery.This 为这些文本元素设置动画是我的一个元素的 jquery 代码。

var line_1_anim = function(){
            return $('#welcome-line-1')
                .css('opacity', 0)
                .slideDown('slow')
                .animate(
                    { opacity: 1 },
                    { queue: false, duration: 'slow' }
                )
                .delay(1000)
                .slideUp('slow');
        }

假设我有三个元素,我使用这种方法使用 $.when() 和 then()

一个一个地为每个元素设置动画
$.when(line_1_anim())
   .then(line_2_anim)

我正在努力降低代码复杂性并实现这一目标。我的功能已经可以工作了,但我想做更多。因为如果我想再添加 10 个元素,我必须重复相同的代码 10 次。所以我写了这样的东西。

var line_animation = function(selector,delay){
            return selector
                .css('opacity', 0)
                .slideDown('slow')
                .animate(
                    { opacity: 1 },
                    { queue: false, duration: 'slow' }
                )
                .delay(delay)
                .slideUp('slow');
        }

        $.when(line_animation(line_1,1000))
        .then(line_animation(line_2,2000))
        .then(line_animation(line_3,3000));

我只是打算多次更改选择器和延迟 运行 相同的方法。但这并不像我想要的那样工作。所有功能同时工作,而不是一个接一个地工作。

知道我的方法有什么问题吗?我该如何实现。

希望我已经解释了我的问题并且一切都清楚了。

jQuery promise example 你可以重写所有类似的(即:line_animation 应该 return 一个承诺而不是 jQuery 对象):

var line_animation = function (selector, delay) {
    var dfd = jQuery.Deferred();
    selector.css('opacity', 0)
            .slideDown('slow')
            .animate({opacity: 1}, {queue: false, duration: 'slow'})
            .delay(delay)
            .slideUp('slow', function () {
                dfd.resolve("hurray");
            });
    return dfd.promise();  // return a promise....
}

$.when(line_animation($('#welcome-line-1'), 1000)).then(function () {
    line_animation($('#welcome-line-2'), 2000).then(function () {
        line_animation($('#welcome-line-3'), 3000);
    });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div class="row h-100 p-3 justify-content-center align-items-center m-0">
    <h1 class="col-12 text-center position-absolute welcome-line-1 d-none-edited" id="welcome-line-1">TEXT 01</h1>

    <h3 class="col-12 text-center position-absolute welcome-line-2 d-none-edited" id="welcome-line-2">TEXT 02</h3>

    <h2 class="col-12 text-center position-absolute welcome-line-3 d-none-edited" id="welcome-line-3">TEXT 03</h2>
</div>