当前位置:首页 > VUE

vue实现上下循环滚动

2026-01-22 05:09:25VUE

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

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

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实现方案更简洁且性能更好:

vue实现上下循环滚动

<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等现成库快速实现:

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表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <tem…

vue如何实现放大缩小

vue如何实现放大缩小

Vue实现放大缩小功能的方法 在Vue中实现元素的放大缩小功能,可以通过CSS变换、第三方库或直接操作DOM样式来实现。以下是几种常见的方法: 使用CSS transform属性 通过绑定Vue的d…

用vue实现搜索查询

用vue实现搜索查询

实现搜索查询的基本思路 在Vue中实现搜索查询功能通常涉及以下几个核心部分:数据绑定、事件监听、过滤逻辑和UI反馈。以下是一个完整的实现方案。 数据绑定与输入框 创建一个Vue组件,包含一个输入框用…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…