2016-10-03 34 views
1

我对脚本有点麻烦。我有基本的想法,但不能将它翻译成代码。更改列表和循环中元素的类

下面是它应该做到:

我使用Animate.CSS,我有以下列表:

<ul class="display" id="imagens-home"> 
    <li class="invisivel"><img src="img/teste/lanche-1.jpg/></li> 
    <li class="invisivel"><img src="img/teste/lanche-2.jpg/></li> 
    <li class="invisivel"><img src="img/teste/lanche-3.jpg/></li> 
    <li class="invisivel"><img src="img/teste/lanche-4.jpg/></li>  
</ul> 

我想打一个脚本,将:

  1. 删除项目中的.invisivel(display:none)类;
  2. 将.fadeInLeft类添加到它;
  3. 保持可见约三秒;
  4. 用.zoomOut替换.fadeInLeft;
  5. 使元素再次隐藏;
  6. 重复列表中的下一项;

我设法找到一种方法,使淡入动画,然后它结束后,使淡出,并再次进行DIV看不见,用下面的代码:

$(document).ready(function() { 
 
    var animationIn = 'animated fadeInLeft'; 
 
    var animationOut = 'animated zoomOut'; 
 
    var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; 
 

 
    $('#imagens-home>li').each(function(){ 
 
    $(this).removeClass('invisivel').addClass(animationIn).on(animationEnd, function(){ 
 
     $(this).removeClass(animationIn).addClass(animationOut).on(animationEnd, function(){ 
 
     $(this).removeClass(animationOut).addClass('invisivel') 
 
     }); 
 
    }); 
 
    }); 
 
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" rel="stylesheet"/> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class="display" id="imagens-home"> 
 
    <li class="invisivel">0</li> 
 
    <li class="invisivel">1</li> 
 
    <li class="invisivel">2</li> 
 
    <li class="invisivel">3</li>  
 
</ul>

但是我找不到一种方法让它遍历列表项。任何帮助,将不胜感激

+3

我不明白这个问题。您正在循环列表项目,正在发生的事情以及尚未发生的事情?你能创建一个jsfiddle的例子吗? – Aschab

+2

@Aschab或点击编辑器中的<<>' – mplungjan

回答

1

如果我的理解是否正确,希望每个元素完全动画,下一个动画开始之前。

而不是使用一个循环,它将基本上并行地启动所有的动画,当前一个动画完成动画时,可以使用递归函数遍历元素。

var animationIn = 'animated fadeInLeft'; 
 
var animationOut = 'animated zoomOut'; 
 
var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; 
 

 
function animate($items, idx) { 
 
    if (idx >= $items.length) return; // no more items, stop animating 
 

 
    var $current = $items.eq(idx); 
 
    $current.removeClass('invisivel').addClass(animationIn).on(animationEnd, function() { 
 
    $current.removeClass(animationIn).addClass(animationOut).on(animationEnd, function() { 
 
     $current.removeClass(animationOut).addClass('invisivel'); 
 
     animate($items, idx + 1); // try animating the next item 
 
    }); 
 
    }); 
 
} 
 

 
$(document).ready(function() { 
 
    animate($('#imagens-home>li'), 0); 
 
});
.invisivel { 
 
    display: none; 
 
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" rel="stylesheet" /> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class="display" id="imagens-home"> 
 
    <li class="invisivel">0</li> 
 
    <li class="invisivel">1</li> 
 
    <li class="invisivel">2</li> 
 
    <li class="invisivel">3</li> 
 
</ul>

+0

太棒了!我发现的唯一问题是,即使前一个图像被隐藏,图像也会出现在另一个下面。另外,一旦它结束,我怎么能再次触发它? –

+0

您可能需要浮动,显示:内联或绝对放置图像,我不确定哪些没有测试。只要在结束时再次重复,就可以在'if'语句中设置'idx = 0'(当它跨越'$ items.length'时)而不是返回。 – nem035

+0

浮动,显示和位置的伎俩。然而,设置idx = 0会循环两次,跳过动画并停止循环。尽我所能,但我找不到原因。 –