App.vue
<template>
<div>
<!-- vue3.0配置 -->
<router-view v-slot="{ Component, route }">
<transition :name="route.meta.transitionName">
<keep-alive>
<component :is="Component" v-if="$route.meta.keepAlive" />
</keep-alive>
<component :is="Component" v-if="!$route.meta.keepAlive" />
</transition>
</router-view>
</div>
</template>
<script>
import { defineComponent } from "vue";
export default defineComponent({
watch: {
$route(to, from) {
if (to.meta.level > from.meta.level) {
to.meta.transitionName = "slide-left";
} else {
to.meta.transitionName = "slide-right";
}
},
},
});
</script>
<style lang="scss">
/*
动画样式
will-change: transform 优化渲染速度
*/
.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active {
will-change: transform;
transition: all 0.5s;
width: 100%;
position: absolute;
z-index: 99;
}
.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>
router/index.js
import {
createRouter,
createWebHashHistory
} from 'vue-router'
import Home from '../views/Home.vue'
const routes = [{
path: '/',
name: 'Home',
component: Home,
meta: {
keepAlive: true,
level: 1,
transitionName: ""
}
},
{
path: '/detail',
name: 'Detail',
component: () => import('../views/Detail.vue'),
meta: {
keepAlive: true,
level: 2,
transitionName: ""
}
},
{
path: '/city',
name: 'City',
component: () => import('../views/City.vue'),
meta: {
keepAlive: true,
level: 0,
transitionName: ""
}
}
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
个人记录仅供参考,有不严谨的地方欢迎指正
本文介绍如何在Vue3中实现基于路由变化的过渡动画效果,包括如何利用watch监听路由变化来动态设置过渡名称,以及如何通过CSS定义具体的动画细节。
1249





