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 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
angularJS中$apply()方法详解
Jan 07 Javascript
jQuery简单实现日历的方法
May 04 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
浅析JavaScript函数的调用模式
Aug 10 Javascript
webpack实现热加载自动刷新的方法
Jul 30 Javascript
vue与bootstrap实现时间选择器的示例代码
Aug 26 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
JS实现换肤功能的方法实例详解
Jan 30 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
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的博客ping服务代码
2012/02/04 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
浅析php单例模式
2014/11/25 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
python自定义线程池控制线程数量的示例
2019/02/22 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
运动会广播稿30字
2014/01/21 职场文书
酒店节能减排方案
2014/05/26 职场文书
计划生育标语
2014/06/23 职场文书
倡议书格式
2014/08/30 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
详解Laravel制作API接口
2021/05/31 PHP
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers