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 相关文章推荐
Mootools 1.2教程 定时器和哈希简介
Sep 15 Javascript
javascript new一个对象的实质
Jan 07 Javascript
JavaScript的单例模式 (singleton in Javascript)
Jun 11 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
Feb 07 Javascript
详解vue-router 初始化时做了什么
Jun 11 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 Javascript
Element Rate 评分的使用方法
Jul 27 Javascript
vue-video-player 断点续播的实现
Feb 01 Vue.js
分享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实现框架(二)
2006/10/09 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
php实现cookie加密的方法
2015/03/10 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
农历与西历对照
2006/09/06 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
Python如何判断数独是否合法
2016/09/08 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
平民服装店创业计划书
2014/01/17 职场文书
阿德的梦教学反思
2014/02/06 职场文书
经济贸易系求职信
2014/08/04 职场文书
公司领导班子对照材料
2014/08/18 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python
Python自动化实战之接口请求的实现
2022/05/30 Python