当前位置:首页 > VUE

用vue实现无缝滚动

2026-01-21 18:49:21VUE

实现无缝滚动的思路

无缝滚动的核心在于当内容滚动到末尾时,能够平滑地回到起始位置,形成循环效果。在Vue中可以通过动态更新数据或CSS动画实现。

基于CSS动画的实现

使用CSS的@keyframesanimation属性实现无缝滚动,适合静态内容或简单场景。

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

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

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

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

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

基于JavaScript的动态更新实现

通过定时器动态更新内容位置,适合动态内容或需要更复杂控制的场景。

<template>
  <div class="scroll-wrapper" ref="wrapper">
    <div class="scroll-content" :style="{ transform: `translateX(${offset}px)` }">
      {{ content }}{{ content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: "需要滚动的内容 ",
      offset: 0,
      speed: 1,
      requestId: null
    }
  },
  mounted() {
    this.startScroll()
  },
  beforeDestroy() {
    cancelAnimationFrame(this.requestId)
  },
  methods: {
    startScroll() {
      const wrapperWidth = this.$refs.wrapper.offsetWidth
      const contentWidth = this.$refs.wrapper.firstChild.offsetWidth / 2

      const animate = () => {
        this.offset -= this.speed
        if (Math.abs(this.offset) >= contentWidth) {
          this.offset = 0
        }
        this.requestId = requestAnimationFrame(animate)
      }
      animate()
    }
  }
}
</script>

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

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

使用第三方库vue-seamless-scroll

对于更复杂的需求,可以使用专门的无缝滚动库简化实现。

安装依赖:

npm install vue-seamless-scroll

使用示例:

<template>
  <vue-seamless-scroll
    :data="list"
    :class-option="option"
    class="seamless-wrap"
  >
    <ul>
      <li v-for="(item, index) in list" :key="index">
        {{ item.title }}
      </li>
    </ul>
  </vue-seamless-scroll>
</template>

<script>
import vueSeamlessScroll from 'vue-seamless-scroll'
export default {
  components: {
    vueSeamlessScroll
  },
  data() {
    return {
      list: [
        { title: '内容1' },
        { title: '内容2' },
        { title: '内容3' }
      ],
      option: {
        direction: 1,
        limitMoveNum: 3,
        step: 1,
        hoverStop: true,
        singleHeight: 30,
        waitTime: 1000
      }
    }
  }
}
</script>

<style>
.seamless-wrap {
  height: 200px;
  overflow: hidden;
}
</style>

垂直无缝滚动实现

调整CSS或配置可实现垂直方向的无缝滚动。

CSS实现:

.scroll-container {
  height: 200px;
  overflow: hidden;
}

.scroll-content {
  animation: scroll-vertical 10s linear infinite;
}

@keyframes scroll-vertical {
  0% { transform: translateY(0); }
  100% { transform: translateY(-100%); }
}

使用vue-seamless-scroll时修改配置:

用vue实现无缝滚动

option: {
  direction: 2,  // 2表示垂直方向
  singleHeight: 30,
  step: 1
}

性能优化建议

对于长列表,建议使用虚拟滚动技术避免渲染所有DOM节点。可通过动态加载数据或使用第三方虚拟滚动库如vue-virtual-scroller实现更好的性能表现。

标签: vue
分享给朋友:

相关文章

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue实现定时

vue实现定时

Vue 实现定时功能的方法 使用 setInterval 和 clearInterval 在 Vue 中可以通过 setInterval 和 clearInterval 实现定时功能。在组件的 mou…

vue实现刷卡

vue实现刷卡

Vue 实现刷卡效果 在 Vue 中实现刷卡效果可以通过 CSS 动画和 Vue 的过渡系统结合完成。以下是一种常见的实现方式: 基础实现方法 安装 Vue 过渡依赖(如果尚未安装): npm i…