持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
写在前面
前面通过两篇文章介绍了数字孪生应用相关的技术,对于二维的数字孪生可视化应用来说,由于相对于三维,会显得比较朴实无华,那么,他主要强调的就应该是更加好看,更加顺畅的体验效果,而站在一个使用者的角度来说,在页面间的切换过程中过渡动画是否自然,过渡时间是否合适成了非常重要的评判标准。那么今天就用这一篇文章,简单介绍下数字孪生可视化产品中主要如何做到页面切换的过渡更加自然!
切换动画分析
如上图所示,我们大致的排版是分为左右两个板块,那么动画该做成什么效果呢?应该是左边的图表由左边进入和退出,而右边的图表由右边进入和退出。也就是说,当我们切换路由时,我们需要先让表格从两边退出,然后加入新页面后,新页面的表格从两边进入。
动画实现 1.0
分析完了需求,那现在就要发挥我们的技能了,该怎么做呢,在 vue 中,那首选肯定是 <transition>
了。我们可以给每个表格加上<transition>
然后通过在 mounted 中控制对应的变量,实现<transition>
动画。
// 页面结构
<template>
<div class="Overview-container">
// 左边表格
<div class="left-box">
<transition name="left-fade" >
<div class="inner-box" v-if="show"></div>
</transition>
// 3个表格相同,略
</div>
// 右边表格与左边相同,略
</div>
</template>
// transition 动画
<style>
.left-fade-enter, .left-fade-leave-to {
transform: translate(-150%, 0)
}
.left-fade-enter-active,
.left-fade-leave-active {
transition: all .3s ease-out;
}
</style>
// 控制函数
enter(){
setTimeout(() => {
this.show = true
}, 500);
}
从上图可以看出进入的效果是有了,可是退出的效果并没有出来,为什么呢?答案很明显,当我们点击了 header 中的 navItem 时,页面进行了路由跳转,直接替换了 route-view 的内容,导致了我们无法看到退出的 transion 动画,那么,该怎么做呢?看看接下来 2.0 的实现方案
动画实现 2.0
为了避开 1.0 的坑,这里我们采取一个路由跳转延迟的方案。当点击 navItem 时立刻更新 store 的 routeChange 值,并延迟执行路由跳转,然后页面通过监听 routeChange 的变化,执行退出函数实现退出动画,这样,就避免了动画还没运行,页面就已经被销毁的尴尬局面
// store
export default new Vuex.Store({
state: {
routeChange: ''
},
mutations: {
// 更新
update(state,param){
state.routeChange = param
}
},
})
// 监听
computed: {
routeChange(){
return this.$store.state.routeChange
}
},
watch: {
routeChange(){
this.leave()
}
},
// 退出函数
methods: {
leave(){
this.show = false
}
}
// navItem 点击触发函数
goto(item){
this.active = item
// 更新 routeChange
this.$store.commit('update', item.path)
// 路由跳转
setTimeout(() => {
this.$router.push({path: item.path});
}, 1000);
}
终于,退出动画已经如愿加上,可如果你是一个产品使用者,你能够接受这个产品吗?在我看来,还是显得有些僵硬,僵硬的点在于,一方面是速度,一方面是我觉得还有更加好看的效果,什么效果呢,我想要三个表格分开进入与分开退出(咱就是说一定要这样给自己加需求吗!!!!),接下来,看 3.0 最终版实现!
动画实现 3.0
想要做到分开进入,那最直接的办法就是3个表格分开三个参数控制,然后通过 settimeout 控制时间,就可以轻松实现表格进入时机的自由把控,那么具体怎么写呢,看代码演示
// 修改页面结构
<div class="left-box">
<transition name="left-fade" >
<div class="inner-box" v-if="showList[0]"></div>
</transition>
<transition name="left-fade">
<div class="inner-box" v-if="showList[1]"></div>
</transition>
<transition name="left-fade">
<div class="inner-box" v-if="showList[2]"></div>
</transition>
</div>
// 右表格类似,略
// 标志位
data() {
return {
showList: [false,false,false]
}
},
// 控制函数
enter(){
this.showList.forEach((item,i) => {
setTimeout(() => {
this.$set(this.showList, i, true)
}, 100+70*i);
});
},
leave(){
this.showList.forEach((item,i) => {
setTimeout(() => {
this.$set(this.showList, 2-i, false)
}, 70*i);
});
}
完美!到这里,我们今天的目标就已经完美实现了,与前两种实现方式对比,效果非常明显,通过优化,3.0 版本的用户体验感就显得更加的舒服,更加的自然。
总结
动画的实现非常简单,而如何用好动画,如何将动画融入产品设计开发中,才是我们值得学习的东西。作为开发者,当我们熟悉了开发流程、开发技术,实现业务需求已经没啥问题后,那么我们应该 Push 自己,拔高一层,更多地站在产品设计者的角度看待问题,找到更加贴合使用者的解决方案,创造出用户体验感更强的好产品。
站在产品设计者的角度来看,通过过渡动画的优化,与完全不加过渡动画相比,不仅使得用户体验感提升了一个档次,而且还有一个很重要的好处 是,在这样较长的过渡动画执行过程中,用户不再会产生排斥感,也能够遮盖掉部分数据加载延迟的问题,让用户感受不到数据未加载完成的尴尬状态,为数据加载争取了更多的时间!
往期好文推荐
面试官:说说从输入 URL 到页面显示到底经历了什么,体现一下你的知识广度
面试官:HTTPS 采用的是对称加密还是非对称加密?具体说说其加密过程
面试官:你就只会 npm run build 吗?(Webpack 配置 Vue+Ts)
面试官:连VuePress都没搭过还说开发过组件库?(VuePress 搭建)
面试官: 连 Vue 视图更新都不会写?(Vue视图更新原理【一】)
面试官: 能不能手写 Vue 响应式?(Vue2 响应式原理【完整版】)
面试官:能不能手写 Vue3 响应式(Vue3 原理解析之响应系统的实现)
面试官:说一下这个Loading动画实现思路 (CSS3 实现 Loading 动画)
面试官:你确定你说的防抖不是节流吗?( 面试题梳理系列 (二))
面试官:除了 HTTP,你还用过什么通信协议?(Websocket 在数字孪生中的应用)
面试官:你真的理解 Event Loop 吗?( JS 事件循环 )
面试官:v-for 中 key 为什么不能用 index,从原理层面聊聊?
面试官:vue-router 的 hash 与 history 哪个模式会刷新页面?
面试官:说说你平时用过的自适应方案(数字孪生可视化自适应方案)
写在最后
博主接下来将持续更新好文,欢迎关注博主哟!!
如果文章对您有帮助麻烦亲点赞、收藏 + 关注和博主一起成长哟!!❤️❤️❤️