前言

现如今移动端APP对用户体验方面的要求越来越高了,最近致力于用户体验优化,因为需要实现类似APP页面切换的动画效果,百度google搜索资料不是很全,所以自己写文档,在实现效果的基础上,顺便恶补一波VueRouter及CSS过渡动画的知识点,欢迎有兴趣的朋友多多指教。

简单demo图预览

写在前面的思考

  • 如何匹配到相应需要跳转的页面?
  • 如何判断是“前进”还是“后退”而后使用不同的动画方式?
  • 如何对不同的跳转设置动画效果?

实现过程

一、vue路由匹配

创建vue实例,匹配路由。
用Vue.js + Vue Router创建单页应用,是非常简单的。使用Vue.js,我们可以通过组合组件来组成应用程序,将Vue Router 添加进来之后,我们需要做的是,将组件(components)映射到路由(routes),然后告诉Vue Router 在哪里渲染它们。

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
//如果使用模块化机制编程,导入Vue和VueRouter,就需要调用Vue.use(Router)
复制代码

接下来就可以进行路由组件的映射:
(路由)组件的定义可以自行定义,当然,为了践行模块化组件化思想,多是从其他文件import进来。以下以简单的“登录->主页->点单->结算”四个页面的交互为例:

import Login from '@/components/login'
import Index from '@/components/index'
import PointList from '@/components/pointList/pointList'
import SettLement from '@/components/pointList/settlement' //创建router实例,然后传入‘routes’配置
export default new Router({//routes配置可以直接传入,也可以先定义后使用//每个路由都应该映射一个组件,其中component可以是通过Vue.extend()创建的组件构造器,或者只是一个组件配饰对象。(今天暂时不考虑嵌套路由的情况)routes: [{path: '/', // 登录name: 'Login',component: Login},{path: '/index', // 主页name: 'Index',component: Index},{path: '/pointList', // 点单name: 'PointList',component: PointList},{path: '/settLement', // 结算name: 'SettLement',component: SettLement}
]
})
复制代码

二、路由跳转 $router

组件路由除了使用全局组件 router-link 来实现点击跳转(相当于按钮)外,还可以使用组件本身
具有的一个实例对象$router及其一些属性来达到目标。
$router 是VueRouter的一个实例对象,相当于一个全局的路由器对象。在Vue实例内部,你可以
通过$router访问路由实例,里面含有很多属性和子对象,例如history对象,经常用到的跳转链
接就可以调用this.$router.push,this.$router.push会往history栈中添加一个新记录。
复制代码
声明式 编程式
<router-link :to="..." router.push(...)

点击 等同于调用 router.push(...)
(...)该方法的参数可以是一个字符串,或者一个描述地址的对象:

// 字符串
router.push('home')
// 对象
router.push({ path: 'home' })
// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
复制代码

组件路由跳转实例:
1.

<router-link :to="{name:'PointList', params: { userId: 123 }}"><i class="icon"><img src="../assets/point.png" alt=""></i><span>点单</span>
</router-link>
复制代码
<footer class="version" @click="goPage('Author')">v 1.0</footer>
//Js:
methods: {goPage(url, param) {this.$router.push({ name: url });}
}
复制代码

三、vue路由对象$route(只读)

在使用了vue-router的应用中,路由对象会被注入每个组件中,赋值为this.$route,并且当路由切换时,路由对象会被更新。所以route相当于当前正在跳转的路由对象,可以从里面获取name,path,params,query等,即包含了当前URL解析得到的信息,还有URL匹配到的路由记录。
路由对象暴露了以下属性(常见):

  1. $route.path
字符串(string)。等于当前路由对象的路径,会被解析为绝对路径,
如:http://example.com/#/login?name=aa,this.$route.path
,输出“/login”,即对应上面1中路由匹配时routes配置中的“path”;
复制代码
  1. $route.name
    字符串(string)。有时候,通过一个名称来标识一个路由显得更加方便,特别是在链接一个路由,或者是执行一些跳转的时候。同样,这里的name也对应了routes配置中给某个路由设置名称的name值:
    要链接到一个命名路由,可以给router-link的to属性传一个对象:
<router-link :to="{name:'Order', params: { userId: 123 }}">
</router-link>
复制代码

用在调用router.push()中也是一回事:

this.$router.push({ name: 'Order', params: { userId: 123 }})
复制代码
  1. $route.params
    对象(object)。路由跳转携带参数:
this.$router.push({ name: 'Order', params: { userId: 123 }})
console.log(this.$route.params.userId); //123
复制代码
  1. $route.query
    对象(object)。可访问携带的查询参数:
this.$router.push({name: 'login', query:{name: 'userName'}});
this.$route.query.name;    //you
//此时路由为:"http://example.com/#/login?name=userName。"
复制代码
  1. $route.redirectedFrom
    字符串(string)。重定向来源:
如:{ path: '*',redirect: {name: 'hello'}}此时访问不存在的路由http://example.com/#/a会重定向到hello,
在hello访问this.$route.redirectedFrom; 输出“/a”。
复制代码
  1. $route.matched
    数组(array)。当前路由下路由声明的所有信息,从父路由(如果有)到当前路由为止。
  2. $route.hash
    字符串(string)。当前路径的hash值。

四、vue监听$route的方式

watch:{‘$route’ (to, from) {}}
复制代码

route 的变化。watch中监听的对象默认回调函数中的参数值就是newVal,oldVal。作为 $route 属性来说当然也就是 to 和 from 的概念了。
Vue用router.push(传参)跳转页面,参数改变,在跳转后的路由观察路由变化,进行页面刷新,可对“from->to”的过程设置动画效果。
该功能的难点就在于怎样获取“上一页”和“下一页”,即怎样分辨是“前进”还是“后退”?
例:

// watch $route 决定使用哪种过渡
watch:{'$route' (to, from) {//此时假设从index页面跳转到pointList页面console.log(to); // "/pointList"console.log(from); // “/index”const routeDeep = ['/', '/index','/pointList', '/settLement'];const toDepth = routeDeep.indexOf(to.path)const fromDepth = routeDeep.indexOf(from.path)this.transitionName = toDepth > fromDepth ? 'fold-left' : 'fold-right'}},
复制代码

to、from是最基本的路由对象,分别表示从(from)某个页面跳转到(to)另一个页面,to.path(表示要跳转到的路由地址),from.path同理。
定义routeDeep数组,将路由目录按层级依次排序(暂不考虑嵌套路由的情况),复杂单页应用里,同一层级(如同一页面上的多个导航按钮)顺序随意,然后依次排列每个导航的下一页、下下页…即保证每个“上一页”在“下一页”前面。
总结下来就是:按照routeDeep数组里定义的路由目录的顺序,“toDepth > fromDepth”表示“上一页”跳转到“下一页”,同理可由此判断是“前进”还是“后退”。

五、Vue2.0中transition组件的使用

<transition :name="transitionName"><router-view class="view app-view"></router-view>
</transition>
复制代码
  • transition中有name属性用于替换vue钩子函数中的类名。
  • transition中只能有一个子元素并且该子元素需要有v-show或者v-if来控制是否显示。

过渡CSS类名

transition中的name属性用于 替换 vue钩子函数中的类名transitionName-

  • transitionName-enter: 定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除。
  • transitionName-enter-active: 定义进入过渡的结束状态。在元素被插入时生效,在transition/animation完成之后移除。
  • transitionName-leave:定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除。
  • transitionName-leave-active: 定义离开过渡的结束状态。在离开过渡被触发时生效,在transition/animation完成之后移除。
this.transitionName = toDepth > fromDepth ? 'fold-left' : 'fold-right'
复制代码

在“watch $route”中,判断页面跳转的“前进”和“后退”时,决定用不同的过渡效果(fold-left还是fold-right)。

六、animation、transform动画效果实现

在上一个主题中,判断页面跳转路径之后,为两种跳转的transition设置不同的类名“fold-left”、“fold-right”。
然后在CSS中,为两种类名设置不同的动画效果(这里以“左滑动”和“右滑动”为例):

.fold-left-enter-active {animation-name: fold-left-in;animation-duration: .3s;}.fold-left-leave-active {animation-name: fold-left-out;animation-duration: .3s;}
.fold-right-enter-active {animation-name: fold-right-in;animation-duration: .3s;}.fold-right-leave-active {animation-name: fold-right-out;animation-duration: .3s;}
复制代码

animation 属性是一个简写属性,用于设置六个动画属性:

描述
animation-name 规定需要绑定到选择器的 keyframe 名称。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function 规定动画的速度曲线。
animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。
@keyframes fold-left-in {0% {transform: translate3d(100%, 0, 0);}100% {transform: translate3d(0, 0, 0);}}@keyframes fold-left-out {0% {transform: translate3d(0, 0, 0);}100% {transform: translate3d(-100%, 0, 0);}}
复制代码

根据CSS3 @keyframes规则,创建动画。创建动画的原理即将一套CSS样式逐渐变化为另一套样式。在动画过程中,能够多次改变这套CSS样式。可以“百分比”来规定改变发生的时间,或者通过关键词“from”和“to”,等价于“0%”(动画的开始时间)和“100%”(动画的结束时间)。一般为了获得最佳的浏览器支持,应该始终定义0%和100%选择器。
transform属性向元素应用2D或3D转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。translate3d(x,y,z)定义3D转换,如transform:translate3d(100%, 0, 0)只改变了x的值,即代表横向左滑动,同理可相应推出其他情况。

七、写在后面的坑 -- 页面切换时空白闪屏的问题

优化前:

每次切换的时候,由于原页面占着主页面的位置,其余页面,由于页面div本身是block元素,所以其他block元素会另起一行,所以每次切换页面时相当于从下面调出新页面,所以会有一瞬的空白是从下面调出下一页到主页面的平行页的过程,再执行动画过渡命令。

解决:

给页面CSS添加设置“position:absolute;”,此时页面脱离文档流,不占空间,这样就不会把下一页挤下去,完成平滑过渡。 优化后:

暂时只用到了这个方法解决,可能也存在一定的弊端,如果有更好的方法,欢迎大家交流噢。

最后附上demo的代码地址:vue页面跳转动画效果demo

总结

以上就是vue页面跳转动画效果功能实现的6个步骤,即这个功能中所含括的6个大知识点,当然其中还包括许多扩展的知识点,学无止境,需慢慢深入挖掘…

作者:mosa
链接:https://juejin.im/post/5ba358a56fb9a05d2068401d
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Vue页面跳转动画效果实现相关推荐

  1. vue移动端过渡动画_Vue仿微信app页面跳转动画效果

    10:14:11独立开发者在开发移动端产品时,为了更高效,通常会使用Web技术来开发移动端项目,可以同时适配Android.iOS.H5,稍加改动还可适配微信小程序. 在使用Vue.js开发移动端页面 ...

  2. 鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题

    鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题 文章目录 鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题 前 ...

  3. 真是好东西!一组动感的页面加载动画效果

    如果您曾经访问过 Nicolas Zezuka 和 Active Theory 的出色的设计网站,你可能已经注意到在显示新内容之前动感的页面加载动画了.这种风格的动画效果最近非常流行,因此这篇文章想给 ...

  4. vue页面跳转后返回原页面初始位置

    vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?首先我们应该在跳出页面时候记录下跳出的scrollY,返回原页面的时候在设置返回位置为记录下的 ...

  5. Vue页面跳转后不显示问题

    Vue页面跳转后不显示问题 必须要添加 path前面要有/

  6. 前端进阶必备技能:Vue中如何定制动画效果

    作为前端程序员,前端火起来的短短几年里技术更新迭代特别快,不仅是新的框架繁多,Vue,React,Angular轮番上场,各种工具,插件,库也是琳琅满目,就连基础的JavaScript语法的更新也是年 ...

  7. vue页面跳转数据传递

    vue页面跳转数据传递 方法一: 第一页跳转赋值: toParameter:function(row) { this.$router.push({   path:'cardParameter',   ...

  8. VUE实现折叠展开动画效果

    VUE实现折叠展开动画效果 第一种情况:从中间向两边展开效果(水平缩放) .input-search {position: absolute;bottom: 8px;right: 0px;width: ...

  9. Vue 页面跳转到指定位置

    Vue 页面跳转到指定位置 页面跳转 页面 script style 进阶版:随着页面滚动变换导航菜单样式 监听页面滚动方法 销毁滚动 页面跳转 页面 <template><div ...

  10. vue里面怎么实现页面跳转_vue页面跳转如何实现 vue页面跳转实现代码

    vue页面跳转如何实现?本篇文章小编给大家分享一下vue页面跳转实现代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.this.$router. ...

最新文章

  1. 用python阐释工作量证明(proof of work)
  2. mysql中去重的用法_mysql中去重 distinct 用法
  3. mysql截取字符串中的部分内容_Mysql字符串截取及获取指定字符串中的数据
  4. 计算机图形学E2——OpenGL Bresenham算法画直线
  5. 枚举算法:最小连续n个合数。试求出最小的连续n个合数(其中n是键盘输入的任意正整数)。
  6. 【Java】Java8 LocalDate日期时间用法总结
  7. oracle安装 插件的执行方法失败_解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题...
  8. smtplib python_python模块:smtplib模块
  9. Lungo 保持 Mac 屏幕唤醒的方便工具
  10. LexYacc 编译原理课设
  11. 超详细的Python安装和环境搭建教程
  12. optim优化器的使用
  13. 基于MK802的应用开发和相关的工具
  14. amd支持服务器内存,amd专用内存和普通的内存有什么区别?
  15. va start linux头文件,va_start/va_end函数-linux
  16. ubuntu计算机名用户名,修改ubuntu的用户名(注意用户名和主机名的区别)
  17. 我有博客了,泪流满面
  18. 高级远程办公解决方案 ETX ,用于桌面虚拟化和远程访问图形要求苛刻的应用程序
  19. STM32CUBE+自平衡车-前言
  20. 800行Python代码实现京东自动登录抢购商品,坐等付款就好了

热门文章

  1. 反垃圾邮件黑名单申诉工作相关步骤说明
  2. DNN常见激活函数与其求导公式及来源
  3. 寻声定位 matlab,春天里的小情趣
  4. C++——球的表面积和体积
  5. kibana本地安装
  6. [Erlang 0075] Bad value on output port 'tcp_inet'
  7. Day-26 多线程和多进程
  8. xss.haozi.me解题记录
  9. kali安装磊科NW392教程
  10. 火车头怎么采集php的,火车采集器采集入库教程