如何将类依次添加到列表中的每个元素?

6
我想在列表中的每个元素(特别是列表项中的<a>)中添加一个类,但一次只添加一个。我这样做是因为<a>上有CSS过渡效果,我希望它们逐个动画。所以item1动画,然后item2动画,然后item3动画... 这是我目前尝试的代码。
HTML:
<ul>
    <li><a>item1</a></li>
    <li><a>item2</a></li>
    <li><a>item3</a></li>
    </ul>

jQuery/js:

animateItems();
function animateItems(){
       $('ul li a').each(function() {
          $(this).addClass('animate'); //This doesn't run one at a time
       });
    }

我感觉这似乎涉及到递归,但是并不确定。

更新:我刚刚意识到这可能比我想象的要难,因为jQuery需要知道css过渡时间,不是吗? 是否有一种方法可以使用setTimeout()添加类,直到开始下一个addClass()?每个()创建一个可以迭代的数组或jQuery对象吗?


1
您可以使用JS读取transition属性,以相应地调整延迟。 - Alex
@mvp 我不知道这可以做到。谢谢! - chasethesunnn
4个回答

10

你可以使用 setTimeout 函数:

$('ul li a').each(function(i, el) {
   setTimeout(function() {
      $(el).addClass('...');
   }, i * 1000);
});

以上代码假定CSS动画持续时间为1秒。您可以相应地进行更改!

注意:在setTimeout回调函数的上下文中,this不是指当前元素。您应该缓存each回调的this对象或使用each回调的第二个参数,该参数指向集合中的当前元素。


1
党,你以微弱的优势赢了我。 - shennan
@vohuman 所以只是为了理解而言;i是类似于each()创建的类数组对象的索引,而el类似于this?我知道el ≠ this,但它们相似吗? - chasethesunnn
@NilsR each 回调函数中的 elthis 值都指向同一个元素。 - Ram

3
为什么不将动画持续时间放入变量中,并使用 setTimeout?
var animationDuration = 2000; // 2000 millieseconds

function animateItems(){
   $('ul li a').each(function(i, item) {
      setTimeout(function(){
        $(item).addClass('animate');
      }, i * animationDuration); // this multiplies the index by the duration so the handler is fired in sequence
   });
}

另一种选择是使用JavaScript动画事件

1
@RickHitchcock 刚刚注意到那 :-) - shennan

2
在JavaScript中,当你想要安排代码在未来运行时,通常会使用setTimeout和setInterval函数,但是没有像"Thread.Sleep"这样的阻塞指令。
animateItems();
function animateItems(){
   $('ul li a').each(function(i) {

       setTimeout(function(){
           console.log(i);
           $(this).addClass('animate'); //This doesn't run one at a time
       }, i * 1000);

   });
}

请注意,在此上下文中,“this”指的是窗口。 - Rick Hitchcock

1

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