App.vue
<template> <div id="app"> <transition :name="direction"> <router-view class="appView" /> </transition> <navbar /> </div></template><script>import navbar from '@/components/layout/navBar.vue'export default { name: 'App', components: { navbar }, data () { return { direction: 'fade' } }, watch: { $route (to, from) { this.$router.setTransition(this) // 设置页面切换方法 } }}</script><style scoped>.appView { position: absolute; width:100%; transition: all .3s cubic-bezier(.55,0,.1,1);}</style>
router/index.js
import Vue from 'vue'import Router from 'vue-router'// ===== 页面 切换动画 实现 ↓ ========Router.prototype.go = function () { // 增强原方法,好处是旧的业务模块不需要任何变动 this.isBack = true window.history.go(-1)}Router.prototype.setTransition = function (app) { if (this.isBack === undefined) { // 如果isBack为true时,证明是用户点击了回退,执行slide-right动画 app.direction = 'fade' } else if (this.isBack) { app.direction = 'slide-right' } else { app.direction = 'slide-left' } this.isBack = false // 做完回退动画后,要设置成前进动画,否则下次打开页面动画将还是回退}// tab 项目切换Router.prototype.switchTab = function (path) { this.isBack = undefined this.replace({ path: path })}// ===== 页面 切换动画 实现 ↑ ========Vue.use(Router)// 路由表export const routerMap = []let router = new Router({ routes: routerMap})// 监听浏览器的返回按钮window.addEventListener('popstate', () => { router.isBack = true}, false)export default router
css 过渡动画
/*fade 淡入淡出*/.fade-enter-active,.fade-leave-active { transition: opacity 0.28s;}.fade-enter,.fade-leave-active { opacity: 0;}/*fade-transform 窗体切换*/.slide-left-enter, .slide-right-leave-active { opacity: 0; -webkit-transform: translate(50px, 0); transform: translate(50px, 0);}.slide-left-leave-active, .slide-right-enter { opacity: 0; -webkit-transform: translate(-50px, 0); transform: translate(-50px, 0);}