Better route transitions
This commit is contained in:
		
							parent
							
								
									5029d1da9c
								
							
						
					
					
						commit
						65406a222d
					
				| 
						 | 
				
			
			@ -8,7 +8,7 @@ import AppHeader from './components/AppHeader.vue'
 | 
			
		|||
    <!-- keep relative for transition -->
 | 
			
		||||
    <div class="relative">
 | 
			
		||||
      <RouterView v-slot="{ Component, route }">
 | 
			
		||||
        <Transition name="route">
 | 
			
		||||
        <Transition :name="route.meta.transition">
 | 
			
		||||
          <Component
 | 
			
		||||
            :is="Component"
 | 
			
		||||
            :key="route.path" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,6 +67,30 @@
 | 
			
		|||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ROUTE TRANSITION - BACK */
 | 
			
		||||
 | 
			
		||||
.route_back-move,
 | 
			
		||||
.route_back-enter-active,
 | 
			
		||||
.route_back-leave-active {
 | 
			
		||||
  transition: all .8s ease;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.route_back-enter-from {
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
  transform: translateX(-100vw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.route_back-leave-to {
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
  transform: translateX(100vw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.route_back-leave-active {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* SLIDE LEFT */
 | 
			
		||||
 | 
			
		||||
.slide_left-move,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,18 +9,36 @@ const router = createRouter({
 | 
			
		|||
      path: '/',
 | 
			
		||||
      name: 'home',
 | 
			
		||||
      component: HomeView,
 | 
			
		||||
      meta: { transition: '' },
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/daily',
 | 
			
		||||
      name: 'daily',
 | 
			
		||||
      component: () => import('../views/GameView.vue'),
 | 
			
		||||
      meta: { transition: 'route' },
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/random',
 | 
			
		||||
      name: 'random',
 | 
			
		||||
      component: () => import('../views/GameView.vue'),
 | 
			
		||||
      meta: { transition: 'route' },
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
router.afterEach((to, from) => {
 | 
			
		||||
  // No transition when direct access
 | 
			
		||||
  if (!from.name) {
 | 
			
		||||
    to.meta.transition = ''
 | 
			
		||||
  }
 | 
			
		||||
  // Back animation when going back to home
 | 
			
		||||
  else if (to.path === '/') {
 | 
			
		||||
    to.meta.transition = 'route_back'
 | 
			
		||||
  }
 | 
			
		||||
  // Normal forward animation
 | 
			
		||||
  else {
 | 
			
		||||
    to.meta.transition = 'route'
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export default router
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user