Vue 解決路由過渡動(dòng)畫抖動(dòng)問題(實(shí)例詳解)
前言
Vue-Router 作為 Vue 的核心模塊,它為我們提供了基于組件的路由配置、路由參數(shù)等功能,讓單頁面應(yīng)用變得更易于管理。良好的路由管理尤為重要,比如路由攔截、路由懶加載、路由權(quán)限等都在開發(fā)中起著至關(guān)重要的作用。同時(shí)路由還支持視圖過渡效果,沒有添加過渡動(dòng)畫的路由切換會(huì)感覺很生硬,為了提高用戶體驗(yàn),路由過渡還是很有必要的。畢竟做出來,自己看著也舒服。
過渡動(dòng)效文檔:https://cn.vuejs.org/v2/guide/transitions.html
過渡動(dòng)畫抖動(dòng)
代碼片段
這里為路由添加一個(gè)淡入淡出的過渡效果
<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;
}
效果

圖中可以很明顯的看到,切換路由時(shí),頁面會(huì)發(fā)生抖動(dòng),而且抖動(dòng)的還不小,看著強(qiáng)迫癥都犯了。
那么問題來了,為什么會(huì)出現(xiàn)這種情況?
過程
發(fā)現(xiàn)問題
排除代碼問題后,想到的可能是布局問題引發(fā)的這種情況,于是在chrome的調(diào)試工具中,一邊切換路由一邊觀察布局的變化,終于找到了一點(diǎn)蹊蹺

仔細(xì)觀察html的結(jié)構(gòu),會(huì)發(fā)現(xiàn)在路由過渡的過程中是會(huì)同時(shí)存在兩個(gè)路由,一個(gè)是即將進(jìn)入的路由,一個(gè)是即將消失的路由,這時(shí)想到有沒有可能是其中一個(gè)路由占位導(dǎo)致抖動(dòng)?
印證猜想
為了方便觀察布局情況,將過渡的時(shí)間調(diào)大到30s,再次重復(fù)上面的操作

在緩慢的過渡,可以更加清晰的看到,在切換到下一個(gè)路由(fade-enter-to)時(shí),上一個(gè)路由(fade-leave-to)會(huì)占位使得下一個(gè)路由的位置下移,所以在快速過渡的情況才發(fā)生類似抖動(dòng)的效果
既然問題找到了,那就找辦法來解決它!
解決問題
只需要給fade-leave-to路由添加 display:none,讓其在消失時(shí)不占位就可以解決問題。當(dāng)然還可以使用定位來脫離文檔流來解決,但定位之后偏移量等都需要計(jì)算,不太推薦。
.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;
}
最后效果

總結(jié)
以上所述是小編給大家介紹的Vue 解決路由過渡動(dòng)畫抖動(dòng)問題,希望對(duì)大家有所幫助!
相關(guān)文章
詳解VUE 對(duì)element-ui中的ElTableColumn擴(kuò)展
本篇文章主要介紹了詳解VUE 對(duì)element-ui中的ElTableColumn擴(kuò)展,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
vue中的addEventListener和removeEventListener用法說明
這篇文章主要介紹了vue中的addEventListener和removeEventListener用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
在移動(dòng)端使用vue-router和keep-alive的方法示例
這篇文章主要介紹了在移動(dòng)端使用vue-router和keep-alive的方法示例,vue-router與keep-alive提供的路由體驗(yàn)與移動(dòng)端是有一定差別的,感興趣的小伙伴們可以參考一下2018-12-12
vue項(xiàng)目前端埋點(diǎn)的實(shí)現(xiàn)
這篇文章主要介紹了vue項(xiàng)目前端埋點(diǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Vue3中Provide?/?Inject的實(shí)現(xiàn)原理分享
provide和inject主要為高階插件/組件庫提供用例,這篇文章主要給大家介紹了關(guān)于Vue3中Provide?/?Inject的實(shí)現(xiàn)原理,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
基于vue+echarts數(shù)據(jù)可視化大屏展示的實(shí)現(xiàn)
這篇文章主要介紹了基于vue+echarts數(shù)據(jù)可視化大屏展示的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理
這篇文章主要介紹了詳解幾十行代碼實(shí)現(xiàn)一個(gè)vue的狀態(tài)管理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

