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 相关文章推荐
javascript中String类的subString()方法和slice()方法
May 24 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
JavaScript使用focus()设置焦点失败的解决方法
Sep 03 Javascript
JavaScript设计模式之装饰者模式介绍
Dec 28 Javascript
jQuery统计上传文件大小的方法
Jan 24 Javascript
js操作数组函数实例小结
Dec 10 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
浅谈JQ中mouseover和mouseenter的区别
Sep 13 Javascript
将angular.js项目整合到.net mvc中的方法详解
Jun 29 Javascript
使用vue-infinite-scroll实现无限滚动效果
Jun 22 Javascript
Vue从TodoList中学父子组件通信
Feb 05 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
Aug 09 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实现数组筛选奇数和偶数示例
2014/04/11 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
python实现广度优先搜索过程解析
2019/10/19 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
2015年学生会工作总结范文
2015/03/31 职场文书