vue页面切换项目实现转场动画的方法


Posted in Javascript onNovember 12, 2019

前言

移动端, 使用vue为了良好的用户体验, 会需要实现APP形式的切换页面的左滑和右滑效果

实现原理, vue的过渡 & 动画

技术栈: vue + vue-router

解决思路

区分前进 和 后退的路由

网上搜索的资料, 找到了两种

监听popstate事件

window.addEventListener('popstate', function (e) {
  // 用来判断是否是后退, 在判断后需要在其他地方重置
  router.isBack = true
},false)

在注册路由的时, 添加 meta对象 ( 路由元信息)中添加索引, 这样做就需要注意索引的大小(这里使用这一种方式)

{
   path: "/login",
   component: resolve => require(["@/pages/login"], resolve),
   meta: {
    title: "登录",
    keepAlive: false,
    index: 1
   }
  },
  {
   path: "/forward",
   name: "Forward",
   component: resolve => require(["@/pages/forward"], resolve),
   meta: {
    title: "前进",
    keepAlive: true,
    index: 2
   }
  },

根据切换方向设置不同的动画效果(通过给transtion内置组件不同的name选项)

方案

路由注册

{
   path: "/login",
   component: resolve => require(["@/pages/login"], resolve),
   meta: {
    title: "登录",
    keepAlive: false, // 用来判断是否缓存, 当判断为缓存时, 则路由信息的name和组件的name选项需一致
    index: 1, // 通过比较不同的索引, 来判断是前进动画还是后退动画
   }
  },
  {
   path: "/forward",
   name: "Forward",
   component: resolve => require(["@/pages/forward"], resolve),
   meta: {
    title: "前进",
    keepAlive: true,
    index: 2
   }
  },

在App.vue(根组件)中, 判断动画方向

<template>
 <div id="project">
   <!-- 
   <keep-alive>
       <router-view v-if="$route.meta.keepAlive"></router-view>
   </keep-alive>
   <router-view v-if="!$route.meta.keepAlive"></router-view>
   这种情况下, 
   :include: 因为若是使用transition包裹两个keep-alive, vue会出现报错
        用两个transition分别包裹keep-alive, 会让transition的动画name出现问题
 --> 
  <transition :name="transitionName">
   <keep-alive :include="cachedViews">
    <router-view :key="1"></router-view>
   </keep-alive>
  </transition>
 </div>
</template>

<script>
export default {
 name: "App",
 data() {
  return {
   transitionName: "slide-right", // 初始过渡动画方向
   cachedViews: [] // 缓存组件
  };
 },
 components: {},
 created() {},
 watch: {
  $route(to, from) {
   if (to.meta.keepAlive && !this.cachedViews.includes(to.name)) {
    // 将需要缓存的组件信息, 添加进其中, 其中to.name的值应该和匹配组件的name选项一致
    this.cachedViews.push(to.name);
   }
   //如果to索引大于from索引,判断为前进状态,反之则为后退状态
   if (to.meta.index > from.meta.index) {
    //设置动画名称
    this.transitionName = "slide-left";
   } else {
    this.transitionName = "slide-right";
   }
  }
 },
 methods: {}
};
</script>


<style lang="scss" scoped>
.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active {
 will-change: transform;
 transition: all 0.5s;
 <!-- 
  这个是必须的, 是为了让页面脱离文档流, 不然的话, 后进入的页面会从页面底部出来
  这个定位会直接添加到路由匹配的组件根元素上, 所以页面根组件最好设定其宽度为100vw
 -->
 width: 100vw;
 position: absolute;
}
.slide-right-enter {
 opacity: 0;
 transform: translate3d(-100%, 0, 0);
}
.slide-right-leave-active {
 opacity: 0;
 transform: translate3d(100%, 0, 0);
}
.slide-left-enter {
 opacity: 0;
 transform: translate3d(100%, 0, 0);
}
.slide-left-leave-active {
 opacity: 0;
 transform: translate3d(-100%, 0, 0);
}
</style>

待解决问题

  • 子路由问题

子路由还没有考虑到

  • 缓存组件问题

使用上述方式, 缓存组件需要注意组件的name选项要和路由的name选项一致, 容易疏忽填写组件的name选项问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 1.2教程(21)——类(二)
Sep 15 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
JavaScript数据类型详解
Apr 01 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
May 18 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
史上最全JavaScript常用的简写技巧(推荐)
Aug 17 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
jQuery实现简单弹幕制作
Dec 10 jQuery
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 #Javascript
vue transition 在子组件中失效的解决
Nov 12 #Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 #Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 #Javascript
Vue退出登录时清空缓存的实现
Nov 12 #Javascript
解决vue admin element noCache设置无效的问题
Nov 12 #Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 #Javascript
You might like
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
Python单链表的简单实现方法
2014/09/23 Python
Python中的各种装饰器详解
2015/04/11 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
使用matplotlib画散点图的方法
2018/05/25 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
详解python配置虚拟环境
2019/04/08 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
竞聘演讲稿
2014/04/24 职场文书
追悼会家属答谢词
2015/09/29 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL