当前位置:首页 > VUE

vue实现上下循环滚动

2026-01-22 05:09:25VUE

实现上下循环滚动的Vue组件

使用CSS动画和Vue的动态绑定实现无限循环滚动效果。以下是一个基础实现方案:

<template>
  <div class="scroll-container">
    <div class="scroll-content" :style="{ transform: `translateY(${scrollPosition}px)` }">
      <div v-for="(item, index) in items" :key="index">{{ item }}</div>
      <!-- 克隆元素实现无缝循环 -->
      <div v-for="(item, index) in items" :key="`clone-${index}`">{{ item }}</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['内容1', '内容2', '内容3', '内容4'],
      scrollPosition: 0,
      animationId: null
    }
  },
  mounted() {
    this.startScroll()
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationId)
  },
  methods: {
    startScroll() {
      const scroll = () => {
        this.scrollPosition -= 1
        if (-this.scrollPosition >= this.$el.querySelector('.scroll-content').scrollHeight / 2) {
          this.scrollPosition = 0
        }
        this.animationId = requestAnimationFrame(scroll)
      }
      scroll()
    }
  }
}
</script>

<style>
.scroll-container {
  height: 200px;
  overflow: hidden;
  position: relative;
}

.scroll-content {
  position: absolute;
  transition: transform 0.1s linear;
}
</style>

使用CSS动画的简化方案

纯CSS实现方案更简洁且性能更好:

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

<script>
export default {
  data() {
    return {
      items: ['内容1', '内容2', '内容3', '内容4']
    }
  }
}
</script>

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

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

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

动态高度适配方案

当内容高度不确定时,使用JavaScript计算动态高度:

methods: {
  updateScroll() {
    const content = this.$el.querySelector('.scroll-content')
    const clone = content.cloneNode(true)
    this.$el.appendChild(clone)

    const scrollHeight = content.scrollHeight
    const duration = scrollHeight / 50 * 1000 // 根据高度调整速度

    content.style.animation = `scroll ${duration}ms linear infinite`

    // 定义CSS动画
    const style = document.createElement('style')
    style.innerHTML = `
      @keyframes scroll {
        0% { transform: translateY(0); }
        100% { transform: translateY(-${scrollHeight}px); }
      }
    `
    document.head.appendChild(style)
  }
},
mounted() {
  this.$nextTick(() => {
    this.updateScroll()
  })
}

使用第三方库

考虑使用vue-seamless-scroll等现成库快速实现:

vue实现上下循环滚动

npm install vue-seamless-scroll
<template>
  <vue-seamless-scroll 
    :data="items" 
    :class-option="options" 
    class="seamless-wrap">
    <div v-for="(item, index) in items" :key="index">{{ item }}</div>
  </vue-seamless-scroll>
</template>

<script>
import vueSeamlessScroll from 'vue-seamless-scroll'
export default {
  components: { vueSeamlessScroll },
  data() {
    return {
      items: ['内容1', '内容2', '内容3', '内容4'],
      options: {
        direction: 2, // 1向上 2向下
        step: 0.5, // 步长
        limitMoveNum: 3 // 起始展示数量
      }
    }
  }
}
</script>

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

以上方案可根据实际需求选择,CSS方案性能最佳,JavaScript方案灵活性最高,第三方库方案开发效率最快。

标签: 上下vue
分享给朋友:

相关文章

vue tag实现

vue tag实现

Vue 标签实现方法 在 Vue 中实现标签功能可以通过多种方式完成,常见场景包括动态标签生成、标签输入框、标签管理等。以下是几种典型实现方案: 动态标签列表渲染 使用 v-for 指令渲染标签数组…

实现.vue文件

实现.vue文件

创建.vue文件的基本结构 一个标准的.vue文件包含三个部分:模板(template)、脚本(script)和样式(style)。这种结构允许开发者在一个文件中管理组件的HTML、JavaScrip…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue删除实现

vue删除实现

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 方法一:使用数组的 splice 方法 通过索引删除数组中的元素,适用于列表渲染的场景。 methods: {…