Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 469|回复: 0

Vue - 解决路由过渡动画抖动问题

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-5-25 14:58:07 | 显示全部楼层 |阅读模式

    前言

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

    效果


    图中可以很明显的看到,切换路由时,页面会发生抖动,而且抖动的还不小,看着强迫症都犯了。
    那么问题来了,为什么会出现这种情况?

    过程

    发现问题

    排除代码问题后,想到的可能是布局问题引发的这种情况,于是在chrome的调试工具中,一边切换路由一边观察布局的变化,终于找到了一点蹊跷

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

    印证猜想

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

    在缓慢的过渡,可以更加清晰的看到,在切换到下一个路由(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;
    }
    

    最后效果

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 15:53 , Processed in 1.143272 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表