Javascript 在动画回调完成之前触发jquery循环进行迭代?

Javascript 在动画回调完成之前触发jquery循环进行迭代?,javascript,jquery,animation,fadein,sequential,Javascript,Jquery,Animation,Fadein,Sequential,我试图制作一个连续的动画,循环在元素列表.post中迭代,然后缓慢地淡入淡出。困难的部分是让下一个迭代在最后一个迭代结束之前开始淡入。到目前为止,我所拥有的只是一个简单的顺序动画,一个接一个地淡出它们 $(".post").hide(); var posts = $(".post"), i = 0; (function() { $(posts[i++]).fadeIn('slow', arguments.callee); })(); 有人知道我怎样才能在上一个元素完成之前将其更改为

我试图制作一个连续的动画,循环在元素列表
.post
中迭代,然后缓慢地淡入淡出。困难的部分是让下一个迭代在最后一个迭代结束之前开始淡入。到目前为止,我所拥有的只是一个简单的顺序动画,一个接一个地淡出它们

$(".post").hide();
var posts = $(".post"),
    i = 0;
(function() {
  $(posts[i++]).fadeIn('slow', arguments.callee);
})();

有人知道我怎样才能在上一个元素完成之前将其更改为允许
.post
到fadeIn()。

使用
each()
对它们进行迭代,并对每个元素使用
setTimeout()
,将动画的持续时间乘以每个元素中当前的
索引

var posts = $(".post").hide();

  // Holds reference to the index of the current iteration
  // ------------------v
posts.each(function( index ) {
    var $th = $(this);
    setTimeout(function() {
        $th.fadeIn('slow');   // Removed arguments.callee
    }, index * 300);
});
因此,每个
setTimeout()
的持续时间都将为
n*600
,这将为您提供所需的效果

顺便说一下,如果您不需要将
posts
变量用于任何其他用途,您可以消除它并将
.each()
链接到
.hide()
之后,如
$(.post”).hide().each(func…


编辑:我出错了。我在具有不同值的
setTimeout()
中使用了
this
。编辑以传入正确的值


编辑:误读了问题。将
setTimeout()
的持续时间更改为
300
,以在动画中提供部分重叠。

类似于patrick的解决方案,但在我看来更干净一些

(function() {
  $(".post").hide().each(function(index){
    $(this).delay(index * 300).fadeIn('slow');
  });
})();

,则
300
是延迟的持续时间,其中
的'slow'
是衰减的持续时间

请原谅我的愚蠢。我对jquery并不例外。但这会返回“太多递归”。我甚至不知道从哪里开始破译how@Trip-不知道你为什么会收到,但请查看我的更新。我在代码中有一个错误。@Trip-另外,如果代码比问题中显示的多,请确保您还没有在循环中。我不确定
参数.callee的目的是什么。你可能想把它去掉。太棒了,它很管用,我只是傻了(和往常一样)。为了让它更明显,我修改了fadeIn(1500)和索引*300@Trip-这里有一个例子,说明了它的作用。我需要更多地查看您的代码,看看哪里出了问题。我不知道你说的“在最后一个完成之前”是什么意思。我以为你想让它们循序渐进。你是说你想让它们同时发生?或者部分重叠?啊,是的,它确实有效,我意识到在改变参数使其成为更明显的二者之间。