VUE如何實現切換頁面時的過渡動畫?


最近再寫頁面的時候,感覺頁面之間的切換有點生硬,所以查了一下文檔看見了transition這個組建,很實用,故此在這里跟大家分享一下

---------------------------------------------------------

---------------------------------------------------------

---------------------------------------------------------

1、解決這個問題的難點就是如何來確定路由是前進還是后退的問題,下面是解決的方案

a) 我們需要給各個頁面定義層級,在切換路由時判斷用戶是進入哪一層頁面,如果用戶進入更高層級那么做前進動畫,如果用戶退到低層級那么做后退動畫.

router/index.js

  1 import VueRouter from 'vue-router'
  2 import Home from '../components/home/home'
  3 import User from '../components/user/user'
  4 var router = new VueRouter({
  5   routes:[{
  6     name:'test',
  7     path:'/',
  8     meta:{index:0}, // meta對象的index用來定義當前路由的層級,由小到大,由低到高
  9     component:{template:'<div>test</div>' }},
 10     {
 11       name:'home',
 12       path:'/home',
 13       meta:{index:1},
 14       component:Home
 15     },
 16     {
 17       name:'user',
 18       path:'/user/:id',
 19       meta:{index:2},
 20       component:User
 21     }]
 22   }
 23 });
 24 

監控路由跳轉,判斷切換頁面之間的層級關系,並以此來判斷路由前進或者后退.

  1 <template>
  2   <div id="app">
  3     <transition :name="transitionName">
  4       <router-view></router-view>
  5     </transition>
  6   </div>
  7 </template>
  8 <script>
  9 export default {
 10   name: 'App',
 11   data () {
 12     return {
 13       transitionName:''
 14     }
 15   },
 16   watch: {
 17     // 使用watch 監聽$router的變化
 18     $route (to, from) {
 19       // 如果to索引大於from索引,判斷為前進狀態,反之則為后退狀態 
 20       if (to.meta.index > from.meta.index){
 21         // 設置動畫名稱
 22         this.transitionName = 'slide-left';
 23       } else{
 24         this.transitionName = 'slide-right';
 25       }
 26     }
 27   }
 28 }
 29 </script>
 30 

編寫slide-left 和 slide-right 類的動畫

  1 .slide-right-enter-active,
  2 .slide-right-leave-active,
  3 .slide-left-enter-active,
  4 .slide-left-leave-active {
  5   will-change: transform;
  6   transition: all 500ms;
  7   position: absolute;
  8 }.slide-right-enter {
  9   opacity: 0;
 10   transform: translate3d(-100%, 0, 0);
 11 }.slide-right-leave-active {
 12   opacity: 0;
 13   transform: translate3d(100%, 0, 0);
 14 }.slide-left-enter {
 15   opacity: 0;
 16   transform: translate3d(100%, 0, 0);
 17 }.slide-left-leave-active {
 18   opacity: 0;
 19   transform: translate3d(-100%, 0, 0);
 20 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM