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

CSS卡片内Marquee文本滚动异常求助:需实现无限无截断滚动

卡片内动态文本无限滚动的无缝实现方案

你的问题出在原方案用伪元素复制文本,但动画滚动到-100%时,原文本和伪元素内容会一起移出容器,导致出现空白截断;同时动态内容的伪元素同步也容易出问题。下面是能实现类似旧<marquee>标签流畅无限滚动的方案:

核心思路

通过直接复制一份文本节点,让两个相同文本并排显示,滚动时第一个文本完全移出容器后,第二个文本刚好衔接上来,配合滚动距离为单份文本宽度的动画,实现无缝循环。

修改后的代码

CSS

.card{
  width: 50%;
  padding: 100px 20px;
  background: gray;
  color: white;
  margin-bottom: 20px;
}
.marquee {
  white-space: nowrap;
  overflow: hidden;
  pointer-events: none;
  width: 100%;
  box-sizing: border-box;
}
.marquee-content {
  display: flex;
  animation: marquee 5s linear infinite;
  will-change: transform;
}
.marquee-content > * {
  flex-shrink: 0;
  margin-right: 50px; /* 控制两份文本之间的间距 */
}
@keyframes marquee {
  to {
    transform: translateX(-50%);
  }
}

HTML

<div class="card">
  <div class="marquee">
    <div class="marquee-content">
      <p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
      <p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
    </div>
  </div>
</div>

<div class="card">
  <div class="marquee">
    <div class="marquee-content">
      <p>Lorem ipsum dolor sit  amet consec</p>
      <p>Lorem ipsum dolor sit  amet consec</p>
    </div>
  </div>
</div>

动态内容适配

如果文本是动态更新的,需要同步更新两份文本节点,还可以根据文本长度调整动画时长,保持滚动速度一致:

// 更新滚动文本的工具函数
function updateMarqueeText(marqueeEl, newText) {
  const contentContainer = marqueeEl.querySelector('.marquee-content');
  // 清空原有内容
  contentContainer.innerHTML = '';
  
  // 创建两份相同的文本节点
  const textNode1 = document.createElement('p');
  textNode1.textContent = newText;
  const textNode2 = document.createElement('p');
  textNode2.textContent = newText;
  
  contentContainer.appendChild(textNode1);
  contentContainer.appendChild(textNode2);
  
  // 可选:根据文本长度计算动画时长,保持滚动速度统一
  const singleTextWidth = textNode1.offsetWidth;
  const scrollSpeed = 120; // 每秒滚动120像素,可按需调整
  const totalScrollDistance = singleTextWidth + 50; // 50是两份文本的间距
  const animationDuration = totalScrollDistance / scrollSpeed;
  
  contentContainer.style.animationDuration = `${animationDuration}s`;
}

// 使用示例:更新第一个卡片的滚动文本
const targetMarquee = document.querySelectorAll('.marquee')[0];
updateMarqueeText(targetMarquee, '这是更新后的动态滚动文本');

方案优势

  • 完全避免截断和空白问题,滚动衔接自然流畅
  • 动态内容更新时只需同步两份文本节点,逻辑简单
  • 可通过调整动画时长保持不同长度文本的滚动速度一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:10:49