使用 jquery 创建迭代淡入淡出函数的最有效方法是什么
What is the most efficient way to create an iterative Fade-In-Out Function with jquery
我在 jquery 中编写了一个淡入淡出函数,它运行良好,但看起来好像有更优雅的方式来编写它。初始不透明度设置为空。这是我所拥有的:
$('span[data-i18n="text.about"]').click(function () {
$('#one').fadeTo(2000, 1, function() {
$('#one').fadeTo(2000, 0, function() {
$('#two').fadeTo(2000, 1, function() {
$('#two').fadeTo(2000, 0, function() {
$('#three').fadeTo(2000, 1, function() {
$('#three').fadeTo(2000, 0, function() {
$('#four').fadeTo(2000, 1, function() {
$('#four').fadeTo(2000, 0, function() {
$('#five').fadeTo(2000, 1, function() {
$('#five').fadeTo(2000, 0, function() {
$('#six').fadeTo(2000, 1, function() {
$('#six').fadeTo(2000, 0, function() {
$('#seven').fadeTo(2000, 1, function() {
$('#seven').fadeTo(2000, 0, function() {
$('#eight').fadeTo(2000, 1, function() {
$('#eight').fadeTo(2000, 0);
});
});
});
});
});
});
});
});
});
});
});
});
});
});
})
});
知道如何美化/缩短此功能吗?
由于所有元素都遵循相同的行为(即淡入两秒,然后淡出两秒),您可以将所有动画排成一个循环,在每个连续元素上迭代延迟四秒。
为了简化操作,您可以对它们全部应用通用的 class。像这样:
$('span[data-i18n="text.about"]').click(function() {
$('.fade-queue').each(function(i) {
$(this).delay(i * 4000).queue(function() {
$(this).fadeTo(2000, 1).dequeue();
}).queue(function() {
$(this).fadeTo(2000, 0).dequeue();
});
});
});
div {
opacity: 0;
position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span data-i18n="text.about">Click me</span>
<div class="fade-queue" id="one">One</div>
<div class="fade-queue" id="two">Two</div>
<div class="fade-queue" id="three">Three</div>
<div class="fade-queue" id="four">Four</div>
<div class="fade-queue" id="five">Five</div>
<div class="fade-queue" id="six">Six</div>
<div class="fade-queue" id="seven">Seven</div>
<div class="fade-queue" id="eight">Eight</div>
另请注意,此方法不再依赖于 id
属性。因此,它更易于维护和扩展,因为您只需向 HTML 添加更多 <div class="fade-queue">
元素,而无需更改任何 JS 代码。
我在 jquery 中编写了一个淡入淡出函数,它运行良好,但看起来好像有更优雅的方式来编写它。初始不透明度设置为空。这是我所拥有的:
$('span[data-i18n="text.about"]').click(function () {
$('#one').fadeTo(2000, 1, function() {
$('#one').fadeTo(2000, 0, function() {
$('#two').fadeTo(2000, 1, function() {
$('#two').fadeTo(2000, 0, function() {
$('#three').fadeTo(2000, 1, function() {
$('#three').fadeTo(2000, 0, function() {
$('#four').fadeTo(2000, 1, function() {
$('#four').fadeTo(2000, 0, function() {
$('#five').fadeTo(2000, 1, function() {
$('#five').fadeTo(2000, 0, function() {
$('#six').fadeTo(2000, 1, function() {
$('#six').fadeTo(2000, 0, function() {
$('#seven').fadeTo(2000, 1, function() {
$('#seven').fadeTo(2000, 0, function() {
$('#eight').fadeTo(2000, 1, function() {
$('#eight').fadeTo(2000, 0);
});
});
});
});
});
});
});
});
});
});
});
});
});
});
})
});
知道如何美化/缩短此功能吗?
由于所有元素都遵循相同的行为(即淡入两秒,然后淡出两秒),您可以将所有动画排成一个循环,在每个连续元素上迭代延迟四秒。
为了简化操作,您可以对它们全部应用通用的 class。像这样:
$('span[data-i18n="text.about"]').click(function() {
$('.fade-queue').each(function(i) {
$(this).delay(i * 4000).queue(function() {
$(this).fadeTo(2000, 1).dequeue();
}).queue(function() {
$(this).fadeTo(2000, 0).dequeue();
});
});
});
div {
opacity: 0;
position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span data-i18n="text.about">Click me</span>
<div class="fade-queue" id="one">One</div>
<div class="fade-queue" id="two">Two</div>
<div class="fade-queue" id="three">Three</div>
<div class="fade-queue" id="four">Four</div>
<div class="fade-queue" id="five">Five</div>
<div class="fade-queue" id="six">Six</div>
<div class="fade-queue" id="seven">Seven</div>
<div class="fade-queue" id="eight">Eight</div>
另请注意,此方法不再依赖于 id
属性。因此,它更易于维护和扩展,因为您只需向 HTML 添加更多 <div class="fade-queue">
元素,而无需更改任何 JS 代码。