当前位置:首页 > VUE

vue实现滑动切换路由

2026-02-22 06:44:06VUE

实现滑动切换路由的基本思路

在Vue中实现滑动切换路由,通常结合Vue Router和手势库(如hammer.js或touch事件)来完成。核心是通过监听触摸事件,判断滑动方向并触发路由跳转。

安装依赖

确保项目中已安装Vue Router。如需手势库支持,可安装hammer.js:

npm install hammerjs

基于原生touch事件的实现

通过监听touchstarttouchmovetouchend事件计算滑动方向:

<template>
  <div 
    @touchstart="handleTouchStart"
    @touchmove="handleTouchMove"
    @touchend="handleTouchEnd"
  >
    <router-view />
  </div>
</template>

<script>
export default {
  data() {
    return {
      startX: 0,
      endX: 0
    }
  },
  methods: {
    handleTouchStart(e) {
      this.startX = e.touches[0].clientX;
    },
    handleTouchMove(e) {
      this.endX = e.touches[0].clientX;
    },
    handleTouchEnd() {
      const threshold = 50; // 滑动阈值
      if (Math.abs(this.endX - this.startX) < threshold) return;

      if (this.endX < this.startX) {
        // 向左滑动,跳转下一个路由
        this.$router.push({ path: '/next-route' });
      } else {
        // 向右滑动,返回上一个路由
        this.$router.go(-1);
      }
    }
  }
}
</script>

使用hammer.js实现手势控制

hammer.js提供更丰富的手势识别:

<template>
  <div ref="swipeContainer">
    <router-view />
  </div>
</template>

<script>
import Hammer from 'hammerjs';

export default {
  mounted() {
    const hammer = new Hammer(this.$refs.swipeContainer);
    hammer.on('swipeleft', () => {
      this.$router.push('/next-route');
    });
    hammer.on('swiperight', () => {
      this.$router.go(-1);
    });
  }
}
</script>

添加过渡动画

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

<template>
  <div>
    <transition :name="transitionName">
      <router-view />
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      transitionName: 'slide-left'
    }
  },
  watch: {
    '$route'(to, from) {
      const toDepth = to.meta.index || 0;
      const fromDepth = from.meta.index || 0;
      this.transitionName = toDepth > fromDepth ? 'slide-left' : 'slide-right';
    }
  }
}
</script>

<style>
.slide-left-enter-active,
.slide-left-leave-active,
.slide-right-enter-active,
.slide-right-leave-active {
  transition: transform 0.5s ease;
  position: absolute;
  width: 100%;
}

.slide-left-enter {
  transform: translateX(100%);
}
.slide-left-leave-to {
  transform: translateX(-100%);
}

.slide-right-enter {
  transform: translateX(-100%);
}
.slide-right-leave-to {
  transform: translateX(100%);
}
</style>

路由配置示例

在路由配置中添加index元信息控制滑动方向:

vue实现滑动切换路由

const routes = [
  {
    path: '/',
    component: Home,
    meta: { index: 0 }
  },
  {
    path: '/about',
    component: About,
    meta: { index: 1 }
  }
]

注意事项

  • 移动端需确保视口设置正确:<meta name="viewport" content="width=device-width, initial-scale=1.0">
  • 过渡动画需要为路由视图设置定位(如absolute或fixed)
  • 滑动阈值可根据实际需求调整
  • 对于嵌套路由需要特殊处理滑动逻辑

标签: 路由vue
分享给朋友:

相关文章

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件: Vue.…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…

vue实现边框

vue实现边框

Vue 实现边框的方法 在 Vue 中实现边框效果可以通过多种方式完成,包括内联样式、CSS 类绑定、动态样式以及使用第三方 UI 库。以下是几种常见的实现方法。 内联样式绑定 使用 Vue 的 :…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <template>…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…