vue 巧用过渡效果(小结)


Posted in Javascript onSeptember 22, 2018

vue提供的了transition组件来实现组件的过渡和路由的过渡,合理使用这个组建可以让我们的页面更加的灵活,提高用户体验。

概念

在进入/离开的过渡中, 会有6个class的切换, 抄一张官方的图

vue 巧用过渡效果(小结)

  • v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  • v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  • v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  • v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  • v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

看起来还是有有点乱,先来捋一下。

vue 巧用过渡效果(小结)

enter 定义开始的状态, active定义过程, enter定义结束, 但是在实际进行的时候是有交叉的。 通过断点可以发现,

  • 添加v-enter
  • 添加v-enter-active,
  • 卸载v-enter
  • 添加v-ernter-to
  • 卸载v-enter-to和v-enter-active
// transition: all 2s; 
 .move-enter {
  margin-left: 0;
 }
 .move-enter-active {
  margin-left: 100px;
 }
 .move-enter-to {
  margin-left: 200px;
 }

例如在上面这种情况下, 过渡动画会怎么进行呢?

vue 巧用过渡效果(小结)

这里要注意两点。

  1. enter-active覆盖掉了enter的起点位置
  2. 一共经过了两次过渡, enter-to是在active结束之后开始的, 所以第四秒, 才回到dom元素本身的位置。

所以官方文档之, 也是使用v-enter定义起点位置, 在enter-active中控制效果。

利用class实现过渡效果

在这6个class之上, 利用transition或者动画, 都可以实现我们需要的效果。 举个栗子, 这里我们直接将所有的路由改变都定义一个过渡效果,

appear属性表示页面初次加载的时候也适用于动画

<transition appear name="move">
  <router-view></router-view>
 </transition>
@keyframes animationIn {
 0% {
 transform: translate(-100%, 0);
 }
 100% {
 transform: translate(0, 0);
 }
}
@keyframes animationOut {
 0% {
 transform: translate(0, 0);
 }
 100% {
 transform: translate(100%, 0);
 }
}

.move-enter {
 transform: translate(-100%, 0);
 position: absolute!important;
 z-index: 999;
 top: 0;
 left: 0;
 width: 100%;
}
.move-enter-active {
 animation: animationIn 0.2s;
 position: absolute!important; // 进入的组件要覆盖掉移除的组件,参考 //https://cn.vuejs.org/v2/guide/transitions.html#%E8%BF%87%E6%B8%A1%E6%A8%A1%E5%BC%8F
 z-index: 999;
 top: 0;
 left: 0;
 width: 100%;
}
.move-leave {
 transform: translate(0, 0);
}
.move-leave-active {
 animation: animationOut 0.2s;
}

效果

vue 巧用过渡效果(小结)

JavaScript 钩子

这些钩子函数可以结合 CSS transitions/animations 使用

<transition
 v-on:before-enter="beforeEnter"
 v-on:enter="enter"
 v-on:after-enter="afterEnter"
 v-on:enter-cancelled="enterCancelled"

 v-on:before-leave="beforeLeave"
 v-on:leave="leave"
 v-on:after-leave="afterLeave"
 v-on:leave-cancelled="leaveCancelled"
>
 <!-- ... -->
</transition>

在这些钩子中, 可以使用其他第三方库,回调中的el将是真实的dom元素 举个栗子, 这里使用了官方推荐的Velocity.js作为动画库

<div class="main">
  <transition name="showRect" appear
     @before-enter="handleBeforeEnter"
     @enter="handleEnter"
     @after-enter="handleAfterEnter"
     @before-leave="handleBeforeLeave"
     @leave="handleLeave"
     @after-leave="handleAfterLeave"
     :css="false">
  <div class="box" v-if="show"></div>
  </transition>
 </div>
 <button @click="start">切换</button>
methods: {
  start() {
  this.show = !this.show
  },
  handleBeforeEnter: function (el) {
  el.style.opacity = 0;
  console.log('方块显示动画即将执行');
  },
  handleEnter: function (el, done) {
  Velocity(el, 'stop');
  Velocity(el, {
   backgroundColor: '#0085eb',
   opacity: 1,
   translateX: 260,
   rotateZ: ['360deg', 0]
  }, {
   duration: 1000,
   easing: [ 0.4, 0.01, 0.165, 0.99 ],
   complete: done
  });
  console.log('方块显示动画执行中...');
  },
  handleAfterEnter: function (el) {
  console.log('方块显示动画结束');
  },
  handleBeforeLeave: function (el) {
  console.log('方块隐藏动画即将执行');
  },
  handleLeave: function (el, done) {
  Velocity(el, 'stop');
  Velocity(el, {
   backgroundColor: '#4dd0e1',
   opacity: 0,
   translateX: 0,
   rotateZ: [0, '360deg']
  }, {
   duration: 1000,
   easing: [ 0.4, 0.01, 0.165, 0.99 ],
   complete: done
  });
  console.log('方块隐藏动画执行中...');
  },
  handleAfterLeave: function (el) {
  console.log('方块隐藏动画结束');
  }
 }

vue 巧用过渡效果(小结)

列表过渡

vue还提供了transition-group组件, 作为列表过渡的容器

不同于 ,它会以一个真实元素呈现:默认为一个 。你也可以通过 tag 特性更换为其他元素

transition-group 拥特别的v-move属性,它会在元素的改变定位的过程中应用, 效果可参见官网。

其他的就不抄官网了

列表过渡中, 可以结合js钩子, 实现一些特殊的效果

举个栗子

<template>
 <div>
 <div class="btn" @click="addItem">添加</div>
 <div class="btn" @click="sort">排序</div>
 <div class="box">
  <div class="item-bar">
  <transition-group name="fade" tag="p" appear
  v-on:before-enter="beforeEnter"
  v-on:after-enter="afterEnter">
  // 这里的data-index 是一个识别标识, 便于在js钩子中获得当前元素的序号
   <div class="item" v-for="(i, index) in list" :key="i" :data-index="index">{{i}}</div>
  </transition-group>
  </div>
 </div>
 </div>
</template>
<script lang="ts">
 import Vue from "vue";
 export default Vue.extend({
 name: "home",
 data() {
  return {
  show: true,
  list: [5,4,3,2,1],
  nextNum: 6
  };
 },
 methods: {
  showDom() {
  this.show = !this.show
  },
  beforeEnter: function (el: any) {
  el.style.opacity = 0 // 每个元素插入之前, 透明度为0
  let index = el.dataset.index 每次可能插入多个元素,
  // 页面加载时先展示5个
  if (index < 5) {
   //设置动画延迟, 实现按续插入的效果
   el.style.animationDelay = el.dataset.index * 0.3 + 's'
  }
  },
  afterEnter: function (el) {
  el.style.opacity = 1
  console.log('afterEnter')
  },
  addItem() {
  this.list.push(this.nextNum++)
  },
  sort() {
  this.list = this.list.sort((a, b) => a -b)
  }
 }
 });
</script>
@keyframes animat {
 0% {
  margin-left: 300px;
  opacity: 0;
 }
 100% {
  margin-left: 0;
  opacity: 1;
 }
 }
 .fade-enter {
 opacity: 0;
 margin-left: 300px;
 }
 .fade-enter-active {
 opacity: 0;
 animation: animat 1s;
 }
 .fade-enter-to {
 opacity: 1;
 margin-left: 0;
 }

 .fade-move {
 transition: all 0.3s;
 }
 .fade-leave {
 left: 10px;
 }
 .fade-leave-active {
 transition: all 2s ease-out;
 }
 .fade-leave-to {
 left: -100%;
 }

效果

vue 巧用过渡效果(小结)

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

Javascript 相关文章推荐
JavaScript对象模型-执行模型
Apr 28 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
Mar 05 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
Mar 23 Javascript
javascript闭包的理解和实例
Aug 12 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
js绘制圆形和矩形的方法
Aug 05 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
Nov 20 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
javascript实现随机抽奖功能
Dec 30 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 #Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 #Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 #Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
Sep 21 #Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 #Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 #Javascript
vue 弹框产生的滚动穿透问题的解决
Sep 21 #Javascript
You might like
PHP 文件扩展名 获取函数
2009/06/03 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
Javascript的闭包详解
2014/12/26 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue实现微信分享功能
2018/11/28 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
vue 组件基础知识总结
2021/01/26 Vue.js
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
Python实现感知器模型、两层神经网络
2017/12/19 Python
多个应用共存的Django配置方法
2018/05/30 Python
详解Python中的type和object
2018/08/15 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
开办饭店创业计划书
2013/12/28 职场文书
村干部培训方案
2014/05/02 职场文书
2015年大学生实习评语
2015/03/25 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书