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