当前位置:首页 > 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等现成库快速实现:

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 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const route…

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <t…

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncCom…

vue实现一个标签选择

vue实现一个标签选择

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

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…

vue交互实现

vue交互实现

Vue 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态渲染等。以下是常见的交互实现方法: 事件处理 通过 v-on 或 @ 指令绑定事件,触发方法或直接执行表达…