-
App.vue (頁面)
<transition :name="pageAnimate" :duration="{ enter: 1000, leave: 1000 }"> <router-view/> </transition>
-
App.vue (CSS)
/***(過度開始)***/ .forward-enter, .forward-leave { transform: translateX(100%); } .back-enter, .back-leave { transform: translateX(-100%); } /***(過度進行中)***/ .forward-enter-active, .forward-leave-active, .back-enter-active, .back-leave-active, { transition: all 1s; } /***(過度結束)***/ .forward-enter-to { transform: translateX(0); } .forward-leave-to, { transform: translateX(-100%); } .back-enter-to { transform: translateX(0); } .back-leave-to { transform: translateX(100%); } //備注 每個頁面的容器必須設置定位(星星) .box{position: fixed; top: 0; bottom: 0; left: 0; right: 0;}
-
App.vue (監控路由)
export default { name: 'App', data(){ return { pageAnimate: 'back' } }, watch:{ $route(to,from,d){ // 路由切換翻頁效果 if(this.$store.state.historyRouter.includes(to.path)){ this.pageAnimate = 'back' }else { this.pageAnimate = 'forward' } //保存路由 let historyRouter = this.$store.state.historyRouter; let routerMaxLen = this.$store.state.routerMaxLen;//路由最大長度 if(!historyRouter.includes(to.path)){ historyRouter.push(to.path) } if(historyRouter.length > routerMaxLen){ historyRouter.splice(0,1) } this.$store.dispatch('changeState', {attr: 'historyRouter', params: historyRouter}) } }, }
-
VueX store.js(設置路由緩存)
export default new Vuex.Store({ state: { historyRouter: [],//所有訪問過的路由 routerMaxLen: 3,//路由最大長度 }, mutations: { //state改變 changeState(state,{ attr,params }){ state[attr] = params; } }, actions: { //state改變 changeState({ state },{ attr,params }) { state[attr] = params; }, }, getters: { }, modules: { } })
附: 翻頁動畫css
@keyframes fold-left-in {
0% {
transform: translate3d(100%, 0, 0);
}
100% {
transform: translate3d(0, 0, 0);
}
}
@keyframes fold-left-out {
0% {
transform: translate3d(0, 0, 0);
}
100% {
transform: translate3d(-100%, 0, 0);
}
}
/* 右進 */
@keyframes fold-right-in {
0% {
transform: translate3d(-100%, 0, 0);
}
100% {
transform: translate3d(0, 0, 0);
}
}
@keyframes fold-right-out {
0% {
transform: translate3d(0, 0, 0);
}
100% {
transform: translate3d(100%, 0, 0);
}
}