javascript - setInterval() 方法创建奇怪的重叠

标签 javascript html css setinterval

当我尝试构建一个简单的文本轮播时,我遇到了一个我很难理解的问题。
布局很简单。我有一个包装器和我希望轮播循环通过的文本。
然而,据我所知,我遇到的问题似乎来自 setInterval 方法。动画循环遍历所有文本并返回到开头后,显示的第一个和第二个文本之间出现了奇怪的重叠。第一个文本将设置动画,但随后将返回以临时替换第二个文本。
任何帮助理解导致此错误以这种方式呈现的原因将不胜感激。

let animateSlide = setInterval(moveSlide, 1200);

function moveSlide() {
  let carousel = document.getElementById("wordCarousel");
  let firstSlide = carousel.children[0];
  let createID = document.createAttribute("id");

  createID.value = "active";

  firstSlide.setAttributeNode(createID);

  carousel.appendChild(carousel.firstChild);

  carousel.children[carousel.children.length - 1].removeAttribute("id");
}
/* Carousel Styles */

#wordCarousel {
  height: 36px;
  overflow: hidden;
}

  .carouselSlide {
    color: #555;
    font-size: 36px;
  }

#active {
  margin-top: 0px;
  animation-name: example;
  animation-duration: 1.2s;
  animation-timing-function: ease;
}

@keyframes example {
  from {
    margin-top: 0px;
  }
  to {
    margin-top: -40px;
  }
}
<div id="wordCarousel">
  <div class="carouselSlide">
    Item 1
  </div>
  <div class="carouselSlide">
    Item 2
  </div>
  <div class="carouselSlide">
    Item 3
  </div>
  <div class="carouselSlide">
    Item 4
  </div>

</div>

最佳答案

不要依赖 setInterval在处理 CSS 动画时。你永远不会有完美的同步。最好考虑像 animationiteration 这样的事件/animationend/animationstart这是一个更好的主意,将更少的代码更容易处理。

let carousel = document.querySelector('#wordCarousel div');

carousel.addEventListener('animationiteration', () => {
  carousel.appendChild(carousel.children[0]);
});
#wordCarousel {
  height: 36px;
  overflow: hidden;
}

.carouselSlide {
  color: #555;
  font-size: 36px;
  line-height:100%; /* line-height will make sure the height is equal to 36px, font-size alone isn't enough  */
}

#wordCarousel > div {
  height:100%;
  animation: example 1s infinite;
}

@keyframes example {
  to {
    transform: translateY(-100%);
  }
}
<div id="wordCarousel">
  <div>
    <div class="carouselSlide">
      Item 1
    </div>
    <div class="carouselSlide">
      Item 2
    </div>
    <div class="carouselSlide">
      Item 3
    </div>
    <div class="carouselSlide">
      Item 4
    </div>
  </div>
</div>

关于javascript - setInterval() 方法创建奇怪的重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64843371/

相关文章:

javascript - 尝试将 Controller 与 angularjs 一起使用,从 app.js 获取 Controller 代码并将其放入 Controller 文件时出错

html - 使用具有偏移量的背景图像填充 SVG 元素

jquery - 如何在标题中获取仅图标的控制组?

javascript - 使用另存为对话框将 HTML 表格数据导出到 Excel (JQuery)

css - 我网站右侧出现意外的边距/填充

html - CSS 选择性问题

css - Bootstrap 不同高度的正方形

javascript - 如何删除元素内的跨度?

javascript - 添加按钮到 select2-drop 和 select2-no-results 后如何调用 Select2 中的点击事件?

javascript - jquery 两个输入值的总和