You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无限轮播组件hover加速时出现异常行为的问题排查

问题原因

直接通过JS修改元素的animationDuration会触发动画重新初始化,两个.first-row元素的动画重置时机存在细微差异,导致它们的滚动进度不同步,视觉上就像出现了两组速度不同的圆形。鼠标悬停/移出时,动画重置的问题会造成“一组消失、一组显示”的错觉。

解决方案

改用CSS变量统一控制动画时长,修改变量时不会触发动画重置,能保持两组元素滚动同步,实现平滑的加速/减速效果。

修改后的CSS

@keyframes slide {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-100%);
  }
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

/* 定义CSS变量,默认动画时长30s */
.moving-circles {
  --animation-duration: 30s;
  overflow: hidden;
  margin: 24px -128px;
  padding: 24px 0;
  white-space: nowrap;
  background: #fff;
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  width: 250px;
  height: 100%;
  background: linear-gradient(to left, rgba(255, 255, 255, 0), #f80606);
  z-index: 10;
}

.first-row {
  display: inline-block;
  /* 使用CSS变量作为动画时长 */
  animation: var(--animation-duration) slide infinite linear;
}

.first-row a {
  margin: 0 4px;
  text-decoration: none;
}

.first-row span {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  font-size: 40px;
  height: 120px;
  width: 120px;
  border-radius: 1000px;
  border: 1px solid #000;
  margin: 0 40px;
}

修改后的JS

var left = document.querySelector(".left");
var carousel = document.querySelector(".moving-circles");

left.addEventListener("mouseover", () => {
  // 修改CSS变量实现加速
  carousel.style.setProperty("--animation-duration", "10s");
})

left.addEventListener("mouseout", () => {
  // 恢复默认动画时长
  carousel.style.setProperty("--animation-duration", "30s");
})

HTML无需修改

保持原HTML结构即可。

关键改动说明
  • 在.moving-circles容器上定义CSS变量--animation-duration,统一控制两个轮播行的动画节奏
  • 动画属性使用变量替代固定值,修改变量时不会触发动画重置,确保两组元素滚动完全同步
  • JS中不再单独操作两个轮播行,而是通过修改容器的CSS变量实现全局控制,逻辑更简洁

内容的提问来源于stack exchange,提问作者Mister L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:55:00