【问题标题】:JavaScript: animate list item sequentially one at a time repeatedlyJavaScript:一次一个地重复地为列表项设置动画
【发布时间】:2021-03-20 12:46:06
【问题描述】:

我正在尝试一次一个地重复地为列表项设置动画。我有一个包含一些列表项的列表。我想要做的是使用 javascript 一次为每个列表项设置一个动画。当动画下一个项目时,我还必须从上一个项目中删除动画。问题是我不习惯 setIntervals 或 setTimeout 函数。我是 javascript 的初学者。

  const ThumbnailSlider = document.querySelectorAll('.thumbnail-slider li');

    setInterval(() => {
      ThumbnailSlider.forEach( (item, i) => {
      const ms = (i+1) * 2000;
      setTimeout(() => {
        item.classList.add('active')
      }, ms);
    });
    }, 2000);
  .thumbnail-slider {
     position: relative;
     height: 100%;
     width: 100%;
     }
    .thumbnail-slider li {
     position: relative;
     height: 100%;
     width: 100%;
     }
     .thumbnail-slider li.active {
     background: cyan;
     }
    <ul class="thumbnail-slider">
            <li>list item one</li>
            <li>list item two</li>
    </ul>



  



  

我知道这个 javascript 是不够的,因为我没有使用 .classList.remove 在任何地方删除活动类。我也知道切换。

【问题讨论】:

  • setTimeout & setInterval 是异步函数。例如 item.classList.add('active') ,项目肯定是未定义的。

标签: javascript html css settimeout setinterval


【解决方案1】:

您可以尝试以下方法:-

setTimeout 就足够了。我们将为当前元素添加新类并删除上一个元素的类。

const ThumbnailSlider = document.querySelectorAll('.thumbnail-slider li');

let previousItem;
function animate(){
  ThumbnailSlider.forEach( (item, i) => {
  const ms = (i+1) * 2000;
  setTimeout(() => {
    previousItem?.classList.remove('active');
    item.classList.add('active')
    previousItem = item;
    if(i===ThumbnailSlider.length-1){
    animate();
    }
  }, ms);
});
}

animate();
.thumbnail-slider {
 position: relative;
 height: 100%;
 width: 100%;
 }
.thumbnail-slider li {
 position: relative;
 height: 100%;
 width: 100%;
 }
 .thumbnail-slider li.active {
 background: cyan;
 }
<ul class="thumbnail-slider">
        <li>list item one</li>
        <li>list item two</li>
        <li>list item third</li>
        <li>list item fourth</li>
        <li>list item fifth</li>
</ul>

【讨论】:

  • 哇,真快。谢谢你!但是如果我想反复这样做呢?我将不得不使用 setInterval 对吗?因为这只是一次性动画。我希望这种情况无限发生。
  • 你可以通过递归来实现。在答案中更新。我认为setInterval 也有可能的答案。
  • 它正在工作!谢谢。我从中学到了很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多