废话不多说 实现过程在下方:
1. 在路由文件下 router/index.js
每个路由增加位置坐标 index 例如
{ path: "/", name: "Home", component: () => import("@/views/home/index.vue"), meta: {index: 1}, }, { path: "/info", name: "Info", component: () => import("@/views/info/index.vue"), meta: {index: 2}, }, ...
2. 在App.vue文件下增加如下code:
<template>
<router-view v-slot="{ Component }">
<transition :name="state.transitionName" mode="out-in">
<keep-alive>
<div :key="route.name">
<component :is="Component"></component>
</div>
</keep-alive>
</transition>
</router-view>
</template>
<script setup> import { useRouter } from 'vue-router' const router = useRouter() const state = reactive({ transitionName: 'slide-left' }) router.beforeEach((to, from) => { if (to.meta.index > from.meta.index) { state.transitionName = 'slide-left' // 向左滑动 } else if (to.meta.index < from.meta.index) { // 由次级到主级 state.transitionName = 'slide-right' } else { state.transitionName = '' // 同级无过渡效果 } }) </script> <style lang="less"> .router-view{ width: 100%; height: auto; position: absolute; top: 0; bottom: 0; margin: 0 auto; -webkit-overflow-scrolling: touch; } .slide-right-enter-active, .slide-right-leave-active, .slide-left-enter-active, .slide-left-leave-active{ height: 100%; will-change: transform; transition: all 500ms; position: absolute; backface-visibility: hidden; } .slide-right-enter{ opacity: 0; transform: translate3d(-100%, 0, 0); } .slide-right-leave-active{ opacity: 0; transform: translate3d(100%, 0, 0); } .slide-left-enter{ opacity: 0; transform: translate3d(100%, 0, 0); } .slide-left-leave-active{ opacity: 0; transform: translate3d(-100%, 0, 0); } </style>
结束
posted on
浙公网安备 33010602011771号