Vue 解决路由过渡动画抖动问题(实例详解)


Posted in Javascript onJanuary 05, 2020

前言

Vue-Router 作为 Vue 的核心模块,它为我们提供了基于组件的路由配置、路由参数等功能,让单页面应用变得更易于管理。良好的路由管理尤为重要,比如路由拦截、路由懒加载、路由权限等都在开发中起着至关重要的作用。同时路由还支持视图过渡效果,没有添加过渡动画的路由切换会感觉很生硬,为了提高用户体验,路由过渡还是很有必要的。毕竟做出来,自己看着也舒服。

过渡动效文档:https://cn.vuejs.org/v2/guide/transitions.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的调试工具中,一边切换路由一边观察布局的变化,终于找到了一点蹊跷

Vue 解决路由过渡动画抖动问题(实例详解)

仔细观察html的结构,会发现在路由过渡的过程中是会同时存在两个路由,一个是即将进入的路由,一个是即将消失的路由,这时想到有没有可能是其中一个路由占位导致抖动?

印证猜想

为了方便观察布局情况,将过渡的时间调大到30s,再次重复上面的操作

Vue 解决路由过渡动画抖动问题(实例详解)

在缓慢的过渡,可以更加清晰的看到,在切换到下一个路由(fade-enter-to)时,上一个路由(fade-leave-to)会占位使得下一个路由的位置下移,所以在快速过渡的情况才发生类似抖动的效果
既然问题找到了,那就找办法来解决它!

解决问题

只需要给fade-leave-to路由添加 display:none,让其在消失时不占位就可以解决问题。当然还可以使用定位来脱离文档流来解决,但定位之后偏移量等都需要计算,不太推荐。

.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;
}

最后效果

Vue 解决路由过渡动画抖动问题(实例详解)

总结

以上所述是小编给大家介绍的Vue 解决路由过渡动画抖动问题,希望对大家有所帮助!

Javascript 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
Apr 17 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
Sep 25 Javascript
JsRender实用入门教程
Oct 31 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
JS基于面向对象实现的拖拽库实例
Sep 24 Javascript
jsTree使用记录实例
Dec 01 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
Nov 21 Javascript
vue 进阶之实现父子组件间的传值
Apr 26 Javascript
对vuex中store和$store的区别说明
Jul 24 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 #Javascript
jQuery 选择器用法基础入门示例
Jan 04 #jQuery
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
Jan 04 #Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
Jan 04 #Javascript
Angular8 实现table表格表头固定效果
Jan 03 #Javascript
uni-app 支持多端第三方地图定位的方法
Jan 03 #Javascript
Vue 实现登录界面验证码功能
Jan 03 #Javascript
You might like
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
Django在Model保存前记录日志实例
2020/05/14 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
工作表现评语
2014/01/19 职场文书
食品安全检查制度
2014/02/03 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
投标保密承诺书
2014/05/19 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
药店营业员岗位职责
2015/04/14 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA