【问题标题】:Change class of elements in a list and loop更改列表和循环中的元素类别
【发布时间】:2016-10-03 13:28:30
【问题描述】:

我的脚本有点问题。我有基本的想法,但无法将其转化为代码。

这是它应该完成的任务:

我正在使用 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. 将 .fadeInLeft 替换为 .zoomOut;
  5. 再次隐藏元素;
  6. 重复列表中的下一项;

我设法找到一种方法来启用 FadeIn 动画,然后在它结束后,启用 FadeOut 并使 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>

但我找不到让它循环遍历列表项的方法。任何帮助将不胜感激

【问题讨论】:

  • 我不明白这个问题。您正在遍历列表项,正在发生的事情和尚未发生的事情是什么?你能创建一个 jsfiddle 示例吗?
  • @Aschab 或点击 SO 编辑器中的&lt;&gt;

标签: javascript jquery css list loops


【解决方案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>

【讨论】:

  • 太棒了!我发现的唯一问题是图像出现在另一个之下,即使前一个被隐藏了。另外,结束后如何再次触发?
  • 您可能需要浮动、显示:内联或绝对定位图像,我不确定哪个没有测试。至于结束时再次重复,您可以在if语句中设置idx = 0(当它跨越$items.length时)而不是返回。
  • 浮动、显示和定位成功了。然而,设置 idx=0 会循环两次,跳过动画并停止循环。我尽我所能弄乱了代码,但找不到原因。
猜你喜欢
  • 2016-07-21
  • 1970-01-01
  • 2020-01-12
  • 2022-07-20
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多