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 HashTable
Jan 22 Javascript
用javascript实现画板的代码
Sep 05 Javascript
Jquery 模板数据绑定插件的使用方法详解
Jul 08 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
Javascript闭包(Closure)详解
May 05 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
prototype.js常用函数详解
Jun 18 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
Mar 21 Javascript
小程序采集录音并上传到后台
Nov 22 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之第九天
2006/10/09 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
浅谈python多线程和队列管理shell程序
2015/08/04 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python关于调用函数外的变量实例
2019/12/26 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
Python类及获取对象属性方法解析
2020/06/15 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
刑事撤诉申请书
2015/05/18 职场文书
上班旷工检讨书
2015/08/15 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
vue如何清除浏览器历史栈
2022/05/25 Vue.js