当前位置:首页 > VUE

vue实现无缝marquee

2026-02-18 07:19:55VUE

Vue 实现无缝 Marquee 效果

在 Vue 中实现无缝 Marquee(跑马灯)效果可以通过多种方式完成,以下是几种常见的方法:

使用 CSS 动画实现

通过 CSS 的 @keyframesanimation 属性可以实现简单的无缝滚动效果。这种方法性能较好,适合纯文本或简单内容的滚动。

<template>
  <div class="marquee-container">
    <div class="marquee-content">
      {{ text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      text: '这是一段需要无缝滚动的文本内容。'
    }
  }
}
</script>

<style>
.marquee-container {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
}

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

@keyframes marquee {
  0% { transform: translateX(100%); }
  100% { transform: translateX(-100%); }
}
</style>

使用 JavaScript 动态更新内容

对于更复杂的内容或需要动态更新的情况,可以使用 JavaScript 动态计算和更新内容位置。

<template>
  <div class="marquee-container" ref="container">
    <div class="marquee-content" ref="content">
      {{ text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      text: '这是一段需要无缝滚动的文本内容。',
      position: 0,
      animationId: null
    }
  },
  mounted() {
    this.startAnimation()
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationId)
  },
  methods: {
    startAnimation() {
      const containerWidth = this.$refs.container.offsetWidth
      const contentWidth = this.$refs.content.offsetWidth

      const animate = () => {
        this.position -= 1
        if (this.position <= -contentWidth) {
          this.position = containerWidth
        }
        this.$refs.content.style.transform = `translateX(${this.position}px)`
        this.animationId = requestAnimationFrame(animate)
      }
      animate()
    }
  }
}
</script>

<style>
.marquee-container {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
}

.marquee-content {
  display: inline-block;
}
</style>

使用第三方库

如果需要更复杂的功能或更好的性能,可以考虑使用第三方库如 vue-marquee-text-component

安装:

npm install vue-marquee-text-component

使用:

<template>
  <marquee-text :duration="10" :repeat="Infinity">
    {{ text }}
  </marquee-text>
</template>

<script>
import MarqueeText from 'vue-marquee-text-component'

export default {
  components: {
    MarqueeText
  },
  data() {
    return {
      text: '这是一段需要无缝滚动的文本内容。'
    }
  }
}
</script>

实现双向无缝滚动

如果需要内容在容器内双向无缝滚动,可以通过复制内容并交替显示实现。

vue实现无缝marquee

<template>
  <div class="marquee-container">
    <div class="marquee-content" :style="{ transform: `translateX(${position}px)` }">
      {{ text }} {{ text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      text: '这是一段需要无缝滚动的文本内容。',
      position: 0,
      animationId: null
    }
  },
  mounted() {
    this.startAnimation()
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationId)
  },
  methods: {
    startAnimation() {
      const animate = () => {
        this.position -= 1
        if (this.position <= -this.$el.offsetWidth) {
          this.position = 0
        }
        this.animationId = requestAnimationFrame(animate)
      }
      animate()
    }
  }
}
</script>

<style>
.marquee-container {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
}

.marquee-content {
  display: inline-block;
}
</style>

以上方法可以根据具体需求选择适合的实现方式。CSS 动画适合简单场景,JavaScript 实现更灵活,第三方库则提供更多功能。

标签: vuemarquee
分享给朋友:

相关文章

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{…

vue实现分发

vue实现分发

Vue 实现分发的方法 在 Vue 中,分发(Distribution)通常指的是将内容从父组件传递到子组件,或者通过插槽(Slots)机制让父组件控制子组件的部分渲染内容。以下是几种常见的实现分发的…

vue实现gridlayout

vue实现gridlayout

Vue 实现 Grid Layout 使用 CSS Grid 布局 CSS Grid 是一种强大的布局系统,可以直接在 Vue 组件的样式中使用。通过定义网格容器和网格项,可以快速实现复杂的布局结构。…

vue实现回复

vue实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及前端表单交互、数据绑定和后端通信。以下是实现回复功能的详细步骤: 数据绑定与表单设计 使用 Vue 的 v-model 绑定回复框的输入内容,…

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template>…

vue实现spa

vue实现spa

Vue 实现 SPA(单页应用)的步骤 创建 Vue 项目 使用 Vue CLI 快速初始化一个 Vue 项目,确保安装了 Vue Router 作为路由管理工具。运行以下命令创建项目: vue c…