当前位置:首页 > VUE

vue实现左右滑动效果

2026-01-23 03:36:20VUE

使用 Vue 实现左右滑动效果

基于 touch 事件实现

监听 touchstarttouchmovetouchend 事件来实现滑动效果。通过计算触摸点的位移判断滑动方向。

<template>
  <div 
    @touchstart="handleTouchStart"
    @touchmove="handleTouchMove"
    @touchend="handleTouchEnd"
    class="slider-container"
  >
    <div class="slider-content" :style="{ transform: `translateX(${offsetX}px)` }">
      <!-- 滑动内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startX: 0,
      offsetX: 0,
      isDragging: false
    }
  },
  methods: {
    handleTouchStart(e) {
      this.startX = e.touches[0].clientX
      this.isDragging = true
    },
    handleTouchMove(e) {
      if (!this.isDragging) return
      const currentX = e.touches[0].clientX
      this.offsetX = currentX - this.startX
    },
    handleTouchEnd() {
      this.isDragging = false
      // 添加滑动结束后的逻辑,如复位或切换页面
    }
  }
}
</script>

<style>
.slider-container {
  overflow: hidden;
  position: relative;
}
.slider-content {
  transition: transform 0.3s ease;
  will-change: transform;
}
</style>

使用 CSS Scroll Snap

利用 CSS 的 scroll-snap 属性实现原生滑动效果,无需复杂 JavaScript 逻辑。

vue实现左右滑动效果

<template>
  <div class="scroll-container">
    <div class="scroll-content">
      <div class="slide-item">Slide 1</div>
      <div class="slide-item">Slide 2</div>
      <div class="slide-item">Slide 3</div>
    </div>
  </div>
</template>

<style>
.scroll-container {
  width: 100%;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
}
.scroll-content {
  display: flex;
  width: max-content;
}
.slide-item {
  scroll-snap-align: start;
  width: 100vw;
  flex-shrink: 0;
}
</style>

使用第三方库(如 Swiper.js)

对于更复杂的滑动需求,可以使用成熟的滑动库 Swiper.js。

安装 Swiper:

vue实现左右滑动效果

npm install swiper

Vue 组件中使用:

<template>
  <swiper
    :slides-per-view="1"
    :space-between="50"
    @swiper="onSwiper"
    @slideChange="onSlideChange"
  >
    <swiper-slide>Slide 1</swiper-slide>
    <swiper-slide>Slide 2</swiper-slide>
    <swiper-slide>Slide 3</swiper-slide>
  </swiper>
</template>

<script>
import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/swiper-bundle.css'

export default {
  components: {
    Swiper,
    SwiperSlide
  },
  methods: {
    onSwiper(swiper) {
      console.log(swiper)
    },
    onSlideChange() {
      console.log('slide change')
    }
  }
}
</script>

使用 Vue Transition 实现动画

结合 Vue 的过渡系统实现滑动动画效果。

<template>
  <div class="slider-wrapper">
    <transition :name="transitionName">
      <div :key="currentIndex" class="slide">
        {{ items[currentIndex] }}
      </div>
    </transition>
    <button @click="prev">Prev</button>
    <button @click="next">Next</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      currentIndex: 0,
      transitionName: 'slide-next'
    }
  },
  methods: {
    next() {
      this.transitionName = 'slide-next'
      this.currentIndex = (this.currentIndex + 1) % this.items.length
    },
    prev() {
      this.transitionName = 'slide-prev'
      this.currentIndex = (this.currentIndex - 1 + this.items.length) % this.items.length
    }
  }
}
</script>

<style>
.slide {
  position: absolute;
  width: 100%;
}
.slide-next-enter-active,
.slide-next-leave-active,
.slide-prev-enter-active,
.slide-prev-leave-active {
  transition: transform 0.5s ease;
}
.slide-next-enter-from {
  transform: translateX(100%);
}
.slide-next-leave-to {
  transform: translateX(-100%);
}
.slide-prev-enter-from {
  transform: translateX(-100%);
}
.slide-prev-leave-to {
  transform: translateX(100%);
}
</style>

每种方法适用于不同场景,原生实现适合简单需求,CSS Scroll Snap 提供较好性能,Swiper.js 适合复杂轮播需求,Vue Transition 适合需要自定义动画的场景。

标签: 效果vue
分享给朋友:

相关文章

vue实现密码框的包

vue实现密码框的包

Vue 密码框实现方案 在 Vue 中实现密码框功能,可以通过原生 HTML 结合 Vue 指令或使用第三方组件库完成。以下是几种常见方案: 原生 HTML + Vue 双向绑定 <t…

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-model…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Desi…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础…