当前位置:首页 > 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 中实现静态查询通常指不依赖后端接口,直接在前端处理数据筛选或搜索功能。以下是几种常见实现方式: 使用计算属性过滤数据 通过计算属性对静态数据进行筛选,适合简单查询场…

vue tag实现

vue tag实现

Vue 标签实现方法 在 Vue 中实现标签功能可以通过多种方式完成,常见场景包括动态标签生成、标签输入框、标签管理等。以下是几种典型实现方案: 动态标签列表渲染 使用 v-for 指令渲染标签数组…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue 实现弹窗

vue 实现弹窗

Vue 实现弹窗的方法 在 Vue 中实现弹窗功能可以通过多种方式完成,以下是几种常见的方法: 使用组件和 v-if/v-show 控制显示 创建一个独立的弹窗组件,通过 v-if 或 v-show…