Vue-Router
做为 Vue
的核心模块,它为咱们提供了基于组件的路由配置、路由参数等功能,让单页面应用变得更易于管理。良好的路由管理尤其重要,好比路由拦截、路由懒加载、路由权限等都在开发中起着相当重要的做用。同时路由还支持视图过渡效果,没有添加过渡动画的路由切换会感受很生硬,为了提升用户体验,路由过渡仍是颇有必要的。毕竟作出来,本身看着也舒服。
过渡动效文档:https://cn.vuejs.org/v2/guide/transitions.htmlcss
这里为路由添加一个淡入淡出的过渡效果html
<div id="app"> <main class="app-main"> <Topbar /> <transition name="fade"> <router-view /> </transition> </main> </div>
.fade-enter, .fade-leave-to{ visibility: hidden; opacity: 0; } .fade-enter-active, .fade-leave-active{ transition: opacity .2s ease; } .fade-enter-to, .fade-leave{ visibility: visible; opacity: 1; }
图中能够很明显的看到,切换路由时,页面会发生抖动,并且抖动的还不小,看着强迫症都犯了。
那么问题来了,为何会出现这种状况?vue
排除代码问题后,想到的多是布局问题引起的这种状况,因而在chrome的调试工具中,一边切换路由一边观察布局的变化,终于找到了一点蹊跷
仔细观察html的结构,会发如今路由过渡的过程当中是会同时存在两个路由,一个是即将进入的路由,一个是即将消失的路由,这时想到有没有多是其中一个路由占位致使抖动?chrome
为了方便观察布局状况,将过渡的时间调大到30s,再次重复上面的操做
在缓慢的过渡,能够更加清晰的看到,在切换到下一个路由(fade-enter-to)时,上一个路由(fade-leave-to)会占位使得下一个路由的位置下移,因此在快速过渡的状况才发生相似抖动的效果
既然问题找到了,那就找办法来解决它!app
只须要给fade-leave-to路由添加 display:none
,让其在消失时不占位就能够解决问题。固然还可使用定位来脱离文档流来解决,但定位以后偏移量等都须要计算,不太推荐。ide
.fade-enter{ visibility: hidden; opacity: 0; } .fade-leave-to{ display: none; } .fade-enter-active, .fade-leave-active{ transition: opacity .2s ease; } .fade-enter-to, .fade-leave{ visibility: visible; opacity: 1; }