当前位置:首页 > JavaScript

js实现跑马灯效果

2026-03-02 00:00:22JavaScript

使用CSS动画实现跑马灯

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

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

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

使用JavaScript动态计算位置

通过定时器动态修改元素位置,适合需要精确控制滚动速度和暂停等复杂交互的场景。

function createMarquee(element, speed = 50) {
  const container = document.querySelector(element);
  const content = container.innerHTML;
  container.innerHTML = `<div class="marquee-inner">${content}</div>`;
  const inner = container.querySelector('.marquee-inner');

  let position = 0;
  const timer = setInterval(() => {
    position--;
    if (-position >= inner.offsetWidth) {
      position = container.offsetWidth;
    }
    inner.style.transform = `translateX(${position}px)`;
  }, speed);

  return {
    stop: () => clearInterval(timer)
  };
}

// 使用示例
const marquee = createMarquee('.marquee-container');
// marquee.stop(); 停止滚动

双向循环滚动实现

实现内容首尾相接的无限循环效果,视觉效果更流畅。

js实现跑马灯效果

function createInfiniteMarquee(selector) {
  const container = document.querySelector(selector);
  const content = container.innerHTML;
  container.innerHTML = `<div class="marquee-wrapper">${content}${content}</div>`;
  const wrapper = container.querySelector('.marquee-wrapper');

  let animationId;
  let position = 0;
  const step = () => {
    position -= 1;
    if (-position >= wrapper.scrollWidth/2) {
      position = 0;
    }
    wrapper.style.transform = `translateX(${position}px)`;
    animationId = requestAnimationFrame(step);
  };
  animationId = requestAnimationFrame(step);

  return {
    stop: () => cancelAnimationFrame(animationId)
  };
}

响应式跑马灯组件

封装成可复用的Vue组件,支持动态内容和响应式尺寸。

Vue.component('marquee', {
  template: `
    <div class="marquee-container" ref="container">
      <div class="marquee-content" :style="contentStyle">
        <slot></slot>
      </div>
    </div>
  `,
  props: {
    speed: { type: Number, default: 1 },
    direction: { type: String, default: 'left' }
  },
  data() {
    return {
      position: 0,
      animationId: null,
      containerWidth: 0,
      contentWidth: 0
    };
  },
  computed: {
    contentStyle() {
      return {
        transform: `translateX(${this.position}px)`
      };
    }
  },
  mounted() {
    this.initSize();
    window.addEventListener('resize', this.initSize);
    this.startAnimation();
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.initSize);
    cancelAnimationFrame(this.animationId);
  },
  methods: {
    initSize() {
      this.containerWidth = this.$refs.container.offsetWidth;
      this.contentWidth = this.$refs.container.querySelector('.marquee-content').scrollWidth;
    },
    startAnimation() {
      const step = () => {
        this.position -= this.speed;
        if (-this.position >= this.contentWidth) {
          this.position = this.containerWidth;
        }
        this.animationId = requestAnimationFrame(step);
      };
      this.animationId = requestAnimationFrame(step);
    }
  }
});

性能优化建议

使用transform代替left/top定位,触发GPU加速提升性能

js实现跑马灯效果

对于大量内容的跑马灯,考虑使用Canvas渲染替代DOM操作

监听页面可见性变化,当页面不可见时暂停动画节省资源

document.addEventListener('visibilitychange', () => {
  if (document.hidden) {
    cancelAnimationFrame(animationId);
  } else {
    animationId = requestAnimationFrame(step);
  }
});

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

相关文章

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

vue实现气泡效果

vue实现气泡效果

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

h5实现左右滚动效果

h5实现左右滚动效果

使用CSS实现横向滚动 在HTML5中实现左右滚动效果,可以通过CSS的overflow-x属性配合white-space或flex布局实现。以下是一个基础示例: <div class="sc…

vue实现钟表效果

vue实现钟表效果

Vue 实现钟表效果 创建基础结构 在 Vue 项目中创建一个组件,用于显示钟表。组件的模板部分包含钟表的外观,如时针、分针、秒针和钟面。 <template> <div cl…

vue实现点击效果

vue实现点击效果

实现点击效果的方法 在Vue中实现点击效果可以通过多种方式完成,以下是几种常见的实现方法: 使用v-on或@click绑定事件 通过v-on:click或简写@click绑定点击事件,触发方法或直…

vue实现卡片效果

vue实现卡片效果

Vue实现卡片效果的方法 使用Vue实现卡片效果可以通过多种方式完成,包括使用原生CSS、UI框架或自定义组件。以下是几种常见方法: 使用原生CSS和Vue组件 创建一个简单的卡片组件,结合CSS实…