当前位置:首页 > VUE

vue实现横向无缝滚动

2026-02-23 04:12:17VUE

实现横向无缝滚动的思路

横向无缝滚动通常用于展示轮播图或横向列表,核心是通过CSS动画或JavaScript动态调整元素位置,实现循环滚动效果。以下是两种常见实现方式:

CSS动画实现

使用CSS的@keyframestransform属性实现动画效果,适合简单场景:

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

<style scoped>
.scroll-container {
  width: 100%;
  overflow: hidden;
}
.scroll-content {
  display: flex;
  animation: scroll 10s linear infinite;
  white-space: nowrap;
}
.item {
  flex-shrink: 0;
  padding: 0 20px;
}
@keyframes scroll {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}
</style>

JavaScript动态控制

通过定时器动态修改元素位置,适合需要精确控制的场景:

<template>
  <div ref="container" class="scroll-container" @mouseenter="pause" @mouseleave="resume">
    <div ref="content" class="scroll-content">
      <div v-for="(item, index) in doubledItems" :key="index" class="item">{{ item }}</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3', 'Item 4'],
      speed: 2,
      animationId: null
    }
  },
  computed: {
    doubledItems() {
      return [...this.items, ...this.items] // 克隆一份实现无缝衔接
    }
  },
  mounted() {
    this.startAnimation()
  },
  methods: {
    startAnimation() {
      const container = this.$refs.container
      const content = this.$refs.content
      let position = 0

      const animate = () => {
        position -= this.speed
        if (position <= -content.scrollWidth / 2) {
          position = 0
        }
        content.style.transform = `translateX(${position}px)`
        this.animationId = requestAnimationFrame(animate)
      }
      animate()
    },
    pause() {
      cancelAnimationFrame(this.animationId)
    },
    resume() {
      this.startAnimation()
    }
  },
  beforeDestroy() {
    cancelAnimationFrame(this.animationId)
  }
}
</script>

<style scoped>
.scroll-container {
  width: 100%;
  overflow: hidden;
}
.scroll-content {
  display: flex;
}
.item {
  flex-shrink: 0;
  padding: 0 20px;
}
</style>

性能优化建议

使用will-change属性提升动画性能:

.scroll-content {
  will-change: transform;
}

考虑使用CSS的scroll-snap-type实现分段滚动:

vue实现横向无缝滚动

.scroll-container {
  scroll-snap-type: x mandatory;
  overflow-x: auto;
}
.item {
  scroll-snap-align: start;
}

注意事项

  • 克隆元素时需确保原始数据不变
  • 移动端需添加触摸事件支持
  • 组件销毁时清除定时器或动画帧
  • 动态内容变化时需要重置滚动位置

标签: 横向vue
分享给朋友:

相关文章

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue 实现后退

vue 实现后退

实现后退功能的方法 在Vue中实现后退功能通常需要结合浏览器历史记录API或Vue Router的导航方法。以下是几种常见的实现方式: 使用Vue Router的go方法 this.$router…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…

vue实现反转

vue实现反转

实现数组反转 在Vue中反转数组可以通过多种方式实现,以下是几种常见方法: 使用JavaScript原生reverse方法 // 在methods中定义方法 methods: { revers…