当前位置:首页 > JavaScript

js实现无缝跑马灯效果

2026-03-01 11:39:43JavaScript

使用CSS动画实现无缝跑马灯

通过CSS的@keyframesanimation属性可以轻松实现无缝滚动效果。HTML结构需将内容复制一份以实现无缝衔接。

<div class="marquee">
  <div class="content">这里是需要滚动的内容,内容长度需超过容器宽度</div>
  <div class="content" aria-hidden="true">这里是需要滚动的内容,内容长度需超过容器宽度</div>
</div>
.marquee {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
  position: relative;
}

.content {
  display: inline-block;
  animation: scroll 10s linear infinite;
}

@keyframes scroll {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}

使用JavaScript实现动态控制

通过定时器动态修改元素的transform属性,可灵活控制速度和暂停。

js实现无缝跑马灯效果

const marquee = document.querySelector('.marquee');
const content = document.querySelector('.content');
let position = 0;
const speed = 1; // 像素/帧

function animate() {
  position -= speed;
  if (position <= -content.offsetWidth) {
    position = 0;
  }
  content.style.transform = `translateX(${position}px)`;
  requestAnimationFrame(animate);
}

animate();

// 暂停/恢复控制
marquee.addEventListener('mouseenter', () => {
  content.style.animationPlayState = 'paused';
});
marquee.addEventListener('mouseleave', () => {
  content.style.animationPlayState = 'running';
});

使用Web Components封装

创建一个可复用的自定义元素,支持参数配置。

js实现无缝跑马灯效果

class MarqueeElement extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.speed = parseInt(this.getAttribute('speed')) || 5;
  }

  connectedCallback() {
    this.shadowRoot.innerHTML = `
      <style>
        :host {
          display: block;
          overflow: hidden;
        }
        .wrapper {
          display: inline-flex;
          white-space: nowrap;
        }
      </style>
      <div class="wrapper">
        <slot></slot>
        <slot></slot>
      </div>
    `;
    this.startAnimation();
  }

  startAnimation() {
    const wrapper = this.shadowRoot.querySelector('.wrapper');
    let position = 0;
    const animate = () => {
      position -= this.speed;
      if (position <= -this.offsetWidth) {
        position = 0;
      }
      wrapper.style.transform = `translateX(${position}px)`;
      requestAnimationFrame(animate);
    };
    animate();
  }
}

customElements.define('marquee-element', MarqueeElement);

使用方式:

<marquee-element speed="3">
  <span>自定义跑马灯内容</span>
</marquee-element>

性能优化建议

避免使用left/top属性而采用transform,利用硬件加速提升性能。对于大量内容的跑马灯,建议使用Canvas渲染。

const canvas = document.getElementById('marqueeCanvas');
const ctx = canvas.getContext('2d');
let textPos = canvas.width;

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillText('Canvas实现的跑马灯', textPos, 20);
  textPos -= 2;
  if (textPos < -200) textPos = canvas.width;
  requestAnimationFrame(draw);
}

// 设置字体需在测量文本宽度前
ctx.font = '16px Arial';
draw();

以上方案可根据实际需求选择,CSS方案适合简单场景,JavaScript方案提供更多控制,Web Components方案适合组件化开发,Canvas方案适合高性能需求。

标签: 跑马灯效果
分享给朋友:

相关文章

css制作卷边效果

css制作卷边效果

使用伪元素和渐变实现卷边效果 通过CSS伪元素和线性渐变可以模拟纸张卷边的视觉效果。这种方法不需要额外元素,仅通过::before或::after伪元素实现。 .element { posit…

vue实现气泡效果

vue实现气泡效果

实现气泡效果的方法 在Vue中实现气泡效果可以通过CSS动画、第三方库或自定义组件完成。以下是几种常见方法: 使用纯CSS动画 通过CSS的@keyframes和transform属性创建气泡上升动…

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class…

vue实现tag效果

vue实现tag效果

实现基本标签结构 使用 Vue 的模板语法创建标签容器和单个标签元素。通过 v-for 动态渲染标签列表,结合 v-bind:key 确保渲染性能。 <template> &l…

h5页面滑动效果实现

h5页面滑动效果实现

实现H5页面滑动效果的方法 H5页面滑动效果可以通过多种方式实现,包括原生JavaScript、CSS动画或第三方库。以下是几种常见的方法: 使用CSS Scroll Snap CSS Scrol…

vue实现玻璃效果

vue实现玻璃效果

实现玻璃效果的方法 在Vue中实现玻璃效果(毛玻璃或磨砂玻璃)可以通过CSS的backdrop-filter属性结合Vue的动态样式绑定来实现。以下是具体步骤: 使用CSS backdrop-fil…