当前位置:首页 > VUE

vue实现向右无缝滚动

2026-02-22 16:02:28VUE

实现无缝向右滚动的思路

无缝滚动通常通过动态调整内容位置或克隆节点实现。核心原理是当内容滚动到尽头时,快速重置位置并继续滚动,利用视觉暂留效应形成无缝效果。

基于CSS动画的实现

使用CSS的@keyframestransform属性实现动画效果,结合Vue的数据绑定控制滚动内容。

<template>
  <div class="scroll-container">
    <div class="scroll-content" :style="contentStyle">
      <span v-for="(item, index) in doubleList" :key="index">{{ item }}</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['内容1', '内容2', '内容3', '内容4'],
      scrollWidth: 0
    }
  },
  computed: {
    doubleList() {
      return [...this.list, ...this.list] // 克隆内容实现无缝衔接
    },
    contentStyle() {
      return {
        animation: `scroll ${this.list.length * 2}s linear infinite`,
        width: `${this.scrollWidth}px`
      }
    }
  },
  mounted() {
    this.calculateWidth()
  },
  methods: {
    calculateWidth() {
      const container = this.$el.querySelector('.scroll-content')
      this.scrollWidth = container.scrollWidth / 2
    }
  }
}
</script>

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

.scroll-content {
  display: inline-block;
}

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

基于JavaScript定时器的实现

通过定时器动态修改元素的scrollLeft属性实现滚动,适合需要精确控制滚动速度的场景。

<template>
  <div class="scroll-container" ref="container">
    <div class="scroll-content" ref="content">
      <span v-for="(item, index) in doubleList" :key="index">{{ item }}</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['内容1', '内容2', '内容3', '内容4'],
      scrollSpeed: 2,
      animationFrame: null
    }
  },
  computed: {
    doubleList() {
      return [...this.list, ...this.list]
    }
  },
  mounted() {
    this.startScroll()
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationFrame)
  },
  methods: {
    startScroll() {
      const container = this.$refs.container
      const content = this.$refs.content
      const totalWidth = content.scrollWidth / 2
      let scrollLeft = 0

      const scroll = () => {
        scrollLeft += this.scrollSpeed
        if (scrollLeft >= totalWidth) {
          scrollLeft = 0
        }
        container.scrollLeft = scrollLeft
        this.animationFrame = requestAnimationFrame(scroll)
      }
      this.animationFrame = requestAnimationFrame(scroll)
    }
  }
}
</script>

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

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

性能优化建议

克隆内容时确保原始内容宽度与容器宽度匹配,避免出现空白间隙。对于大量数据,考虑虚拟滚动技术减少DOM节点数量。

vue实现向右无缝滚动

CSS动画实现性能通常优于JavaScript定时器,但灵活性较低。根据实际需求选择合适方案,移动端设备注意兼容性和性能测试。

标签: vue
分享给朋友:

相关文章

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…