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

概念

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

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 被删除),在过渡/动画完成之后移除。

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

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;}
复制代码

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

这里要注意两点。

  • enter-active覆盖掉了enter的起点位置
  • 一共经过了两次过渡, 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%8Fz-index: 999;top: 0;left: 0;width: 100%;
}
.move-leave {transform: translate(0, 0);
}
.move-leave-active {animation: animationOut 0.2s;
}复制代码

效果

JavaScript 钩子

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

<transitionv-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还提供了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" appearv-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 // 每个元素插入之前, 透明度为0let index = el.dataset.index  每次可能插入多个元素,// 页面加载时先展示5个if (index < 5) {//设置动画延迟, 实现按续插入的效果el.style.animationDelay = el.dataset.index * 0.3 + 's'}},afterEnter: function (el) {el.style.opacity = 1console.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 巧用过渡效果相关推荐

  1. vue.js之过渡效果-css

    2019独角兽企业重金招聘Python工程师标准>>> vue.js之过渡效果-css 概述 vuejs的过渡效果可以让我们的页面元素在出现和消失时实现过渡.官方文档这样描述过渡效果 ...

  2. js写css3过渡前端,web前端vue之CSS过渡效果示例

    过渡效果在交互体验中的重要性不言而喻.以往我们使用js或Jquery添加或移除元素的类(class),搭配CSS中定义好的样式,再引用一些javascript库之后,可以做作出非常复杂,惊艳的动态效果 ...

  3. 取消button的点击效果_(Vue动效)6.Vue中列表过渡效果

    关键词:列表过渡<transition>过渡 一.实现:每点击一次按钮,就会增加一条数据 <body><div id="root"><di ...

  4. 如何在Vue中实现过渡效果

    Vue中有一个自带的transition组件,就是用来实现过渡效果的,具体怎么使用呢,很简单,其实就两个步骤: ①用transition组件,把要做过渡效果的元素包起来 ②写上相应的过渡效果的css ...

  5. vue css渐入渐出,vue中渐进过渡效果实现

    本文实例为大家分享了vue 渐进过渡效果,供大家参考,具体内容如下,供大家参考,具体内容如下 transition 与 v-for 一起用时可以创建渐近过渡.给过渡元素添加一个特性 stagger,e ...

  6. Vue基础进阶 之 过渡效果

    进入/离开过渡效果:Vue在插入.更新或移除DOM时,可以设置一些动画效果: 如何使用过渡效果:利用<transition></transition>组件将需要应用的过渡效果的 ...

  7. Vue 动画效果、过渡效果

    文章目录 动画效果 过渡效果 单个元素 多个元素 Animate.css 总结 todolist 增加动画效果 动画效果 新建 Test.vue <template><div> ...

  8. 全面掌握前端框架Vue.js

    整理自菜鸟教程 Vue.js简介 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽 ...

  9. Vue 组件学习总结

    本文主要是对 Vue 组件学习的总结和之后要写的内容的计划. 组件学习总结 组件库的本质是什么? 组件库其实就是一堆组件组成的一个项目,一般项目里会有组件和演示项目.当项目调试时 webpack 打包 ...

最新文章

  1. 使用BAPISDORDER_GETDETAILEDLIST创建S/4HANA的Outbound Delivery
  2. php 高效判断是否登录,php 判断用户是否登录
  3. Spring JSF集成教程
  4. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表
  5. 关于SOA您该知道却不愿知道的十件事
  6. 基于机器视觉的细小金属件表面污渍检测
  7. 卷积神经网络发展简史
  8. 基于 Intel 的 Mac,如何使用机构恢复密钥的技巧
  9. 2.NET Core设定数据库种子
  10. Race Condition是什么
  11. 太牛了!某大佬程序猿北漂16年,从睡天桥到身价数千万,衣锦还乡重庆住豪宅!...
  12. WSUS 3.0 的部署
  13. GNUPLOT绘图软件学习笔记(1)基本多数据作折线图与cpp调用及一种中文输入办法
  14. 算法导论 — 4.4 用递归树方法求解递归式
  15. JAVAEE工程师入门技术之第1课day01_Java基础语法HelloWorld
  16. 找到出问题的地方了啊
  17. winserver-记录共享文件夹操作日志
  18. python摄像头动作捕捉_OpenMMD:没有专业摄像设备也能动作捕捉!K帧动作设计苦手的福音~...
  19. BugKu:WEB——gam1
  20. SpringBoot整合knif4j Api文档

热门文章

  1. 《python 与数据挖掘 》一1.3 Python开发环境的搭建
  2. Error:No suitable device found: no device found for connection “System eth1″
  3. 量身定制规则引擎,适应多变业务场景
  4. AngularJs 键盘事件和鼠标事件
  5. 公司项目NODEJS实践0.3[ mongo / session ...]
  6. “超级课程表”余佳文:初生牛犊不怕虎
  7. LIB和DLL的区别与使用,非常详细
  8. symbol(s) not found for architexture i386 报错
  9. python日历提醒_Python之时间:calender模块(日历)
  10. 微服务接入oauth2_SpringCloud微服务实战系列(十九)Ouath2在真实场景中的应用之客户端接入(第一种写法)...