当前位置:首页 > JavaScript

js实现跑马灯效果

2026-01-31 08:48:56JavaScript

使用CSS动画实现跑马灯

通过CSS的@keyframesanimation属性实现文字横向滚动效果,适用于简单场景:

<div class="marquee">
  <span>这里是需要滚动的文字内容...</span>
</div>

<style>
.marquee {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
}
.marquee span {
  display: inline-block;
  animation: marquee 10s linear infinite;
}
@keyframes marquee {
  0% { transform: translateX(100%); }
  100% { transform: translateX(-100%); }
}
</style>

使用JavaScript动态计算

通过定时器动态修改元素位置,实现更灵活的控制:

js实现跑马灯效果

function startMarquee(element, speed = 1) {
  const container = element.parentNode;
  const containerWidth = container.offsetWidth;
  let position = containerWidth;

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

  animate();
}

// 使用示例
const marqueeText = document.querySelector('.marquee span');
startMarquee(marqueeText, 2);

无缝循环跑马灯

克隆内容元素实现无缝滚动效果:

js实现跑马灯效果

<div class="marquee-container">
  <div class="marquee-content">需要循环滚动的内容</div>
</div>

<script>
function createSeamlessMarquee() {
  const container = document.querySelector('.marquee-container');
  const content = document.querySelector('.marquee-content');
  const clone = content.cloneNode(true);
  container.appendChild(clone);

  let position = 0;
  const speed = 1;
  const contentWidth = content.scrollWidth;

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

  animate();
}
</script>

响应式跑马灯

结合ResizeObserver实现窗口大小变化时的自适应:

class Marquee {
  constructor(element) {
    this.element = element;
    this.content = element.querySelector('.marquee-content');
    this.clone = this.content.cloneNode(true);
    this.element.appendChild(this.clone);
    this.observer = new ResizeObserver(this.update.bind(this));
    this.observer.observe(this.element);
    this.animate();
  }

  update() {
    this.contentWidth = this.content.scrollWidth;
    this.position = 0;
  }

  animate() {
    this.position -= 1;
    if (this.position <= -this.contentWidth) {
      this.position = 0;
    }
    this.element.style.transform = `translateX(${this.position}px)`;
    requestAnimationFrame(this.animate.bind(this));
  }
}

new Marquee(document.querySelector('.marquee-container'));

带暂停控制的跑马灯

添加鼠标交互控制功能:

class InteractiveMarquee {
  constructor(element) {
    this.element = element;
    this.content = element.innerHTML;
    this.speed = 2;
    this.isPaused = false;
    this.position = element.offsetWidth;
    this.element.innerHTML = this.content + this.content;

    element.addEventListener('mouseenter', () => this.isPaused = true);
    element.addEventListener('mouseleave', () => this.isPaused = false);

    this.animate();
  }

  animate() {
    if (!this.isPaused) {
      this.position -= this.speed;
      if (this.position <= -this.element.scrollWidth/2) {
        this.position = 0;
      }
      this.element.style.transform = `translateX(${this.position}px)`;
    }
    requestAnimationFrame(this.animate.bind(this));
  }
}

new InteractiveMarquee(document.querySelector('.marquee'));

每种实现方式适用于不同场景,CSS动画方案性能最佳但控制灵活性较低,JavaScript方案可以实现更复杂的交互效果。无缝循环方案适合内容长度不固定的场景,响应式方案能更好地适应不同屏幕尺寸。

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

相关文章

vue实现基金效果

vue实现基金效果

Vue 实现基金效果 在 Vue 中实现基金效果,通常指的是模拟基金的增长、波动或可视化展示。以下是几种常见的实现方式: 数据绑定与动态更新 通过 Vue 的数据绑定特性,可以动态展示基金净值的变化…

vue实现过渡效果

vue实现过渡效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。以…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…

vue实现多选效果

vue实现多选效果

Vue 实现多选效果的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选效果。适用于复选框组(checkbox)或下拉多选(select multi…

vue实现gif效果

vue实现gif效果

Vue 中实现 GIF 效果的方法 在 Vue 中实现 GIF 效果可以通过多种方式完成,以下是几种常见的方法: 直接使用 GIF 图片 将 GIF 图片作为静态资源引入,直接在 Vue 模板中使用…