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

如何创建无间隙无卡顿的Marquee?求助解决滚动动画异常问题

解决Marquee滚动时的间隙、空白与卡顿问题

问题说明

Marquee横向滚动切换时出现间隙和空白,复制段落还会产生卡顿,尝试过复制段落、匹配动画时长等方法均无效。

原代码

.marquee {
  width: 100vw;
  height: 50px;
  display: inline-block;
  position: relative;
  overflow: hidden;
}

.marquee p {
  display: inline-block;
  font-family: monospace;
  font-weight: 900;
  text-transform: uppercase;
  font-size: 20px;
  white-space: nowrap;
}

.marquee-in {
  width: 100vw;
  -webkit-animation: trans 5s linear infinite;
  animation: trans 5s linear infinite;
  overflow: hidden;
  width: auto;
  height: auto;
  display: inline-flex;
  white-space: nowrap;
  overflow: hidden;
  position: relative;
}

@-webkit-keyframes trans {
  0% {
    left: 0%;
  }
  100% {
    left: -100%;
  }
}

问题分析与修复方案

  1. 间隙空白原因:原动画left: -100%仅移动容器自身宽度,未匹配复制后内容的总宽度,导致滚动到终点时无法衔接。
  2. 卡顿原因:left属性动画依赖CPU计算布局,易引发卡顿;inline-flex布局可能触发不必要的重绘。
  3. 冗余样式:marquee-in重复设置overflow: hidden和width,需清理。

修复后的代码

.marquee {
  width: 100vw;
  height: 50px;
  position: relative;
  overflow: hidden;
}

.marquee-content {
  display: flex;
  position: absolute;
  top: 0;
  left: 0;
  animation: marquee-scroll 10s linear infinite;
}

.marquee p {
  font-family: monospace;
  font-weight: 900;
  text-transform: uppercase;
  font-size: 20px;
  white-space: nowrap;
  margin: 0;
  /* 给复制内容添加容器宽度的间距,确保衔接无间隙 */
  padding-right: 100vw;
}

@keyframes marquee-scroll {
  0% {
    transform: translateX(0);
  }
  100% {
    /* 移动单个文本块的宽度,实现无缝循环 */
    transform: translateX(-100%);
  }
}

配套HTML结构

需复制一次文本内容,保证滚动首尾衔接:

<div class="marquee">
  <div class="marquee-content">
    <p>你的滚动文本内容 你的滚动文本内容</p>
    <p>你的滚动文本内容 你的滚动文本内容</p>
  </div>
</div>

关键优化点

  • 用transform: translateX()替代left,利用GPU加速减少卡顿。
  • 给复制的文本块添加padding-right: 100vw,避免滚动间隙。
  • 根据文本长度调整动画时长,保证滚动速度均匀自然。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:22:49