当前位置:首页 > 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表单实现搜索

vue表单实现搜索

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

vue实现摘要

vue实现摘要

Vue 实现摘要的方法 在 Vue 中实现文本摘要功能通常涉及截取文本的前部分内容并添加省略号。可以通过计算属性、过滤器或自定义指令来实现。 计算属性实现 在 Vue 组件中定义一个计算属性,用于截…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue实现active

vue实现active

Vue 实现 active 状态的方法 在 Vue 中实现 active 状态可以通过以下几种方式实现,具体取决于使用场景和需求。 使用 v-bind:class 动态绑定类名 通过 v-bind:…