一、单个元素/ 组件过渡动画(自带)

过渡动画简单而言就是定义前后两帧; Vue 提供了 <transition> 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡: 1️⃣ 条件渲染(使用 v-if )条件展示(使用 v-show) 2️⃣ 动态组件 3️⃣ 组件根节点
 
 
原理
当插入或删除包含在 <transition> 组件中的元素时,Vue 将会做以下处理: 1、自动嗅探目标元素是否应用了CSS过渡或者动画,如果有,那么在恰当的时机添加/删除CSS类名; 2、如果transition 组件提供了JavaScript钩子函数,这些钩子函数将在恰当的时机被调用; 3、如果没有找到JavaScript钩子并且也没有检测到CSS过渡/动画,DOM插入、删除操作将会立即执行;
 
其中控制动画的 class 属性如下:(v-是默认前缀,如果transition有 name 属性则使用其值)
v-enter-from:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
v-enter-to:定义进入过渡的结束状态。在元素被插入之后下一帧生效(与此同时v-enter-from 被移除),在过渡/动画完成之后移除。
v-leave-from:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
v-leave-to:离开过渡的结束状态。在离开过渡被触发之后下一帧生效(与此同时v-leave-from 被删除),在过渡 / 动画完成之后移除。
notion image
⭐ 需要注意的是:我们 transition 组件有一个 type 属性,我们可以设置为 transition / animation,建议 animationtransition 不要共用,且两个动画同时存在的时候,使用最长时间动画所对应的属性(但是仍有动画冲突的可能);如果只有一个属性的话,Vue能自动识别。
此外,我们可以用 duration 属性设置过渡时间。1️⃣ number类型:同时设置进入和离开的时间 :duration="1000";2️⃣ object类型:分别设置进入和离开的过渡时间 :duration="{enter: 800, leave: 1000}"
 

Mode

常见于两元素进行切换的时候,是如果我们不希望同时执行进入和离开动画,那么我们需要设置transition的过渡模式:
1️⃣ in-out: 新元素先进行过渡,完成之后当前元素过渡离开;
2️⃣ out-in: 当前元素先进行过渡,完成之后新元素过渡进入;
 

Appear

初次渲染是否渲染动画,默认不渲染。如需渲染:<transition name="why" appear>...</transition>
 

二、第三方库

Animate.css

安装 npm install animate.css --save
使用 import "animate.css"
 
使用一:
基本使用name属性对应样式 name属性-enter-active
 
使用二: 依赖自定义过渡class
 

gasp

transition中包含部分生命周期函数,我们可以在不同生命周期调用js动画库。
 
 

案例

数字变化时跳动动画
 

三、列表过渡

以上,过渡动画我们只要是针对单个元素或者组件的:
  • 要么是单个节点;
  • 要么是同一时间渲染多个节点中的一个;
那么如果希望渲染的是一个列表,并且该列表中添加删除数据也希望有动画执行呢?
  • 这个时候我们要使用 <transition-group> 组件来完成;
使用 <transition-group> 有如下的特点:
  • 默认情况下,它不会渲染一个元素的包裹器(即默认不包含一个根元素包裹),但是可以指定一个元素并以tag attribute 进行渲染;
  • 过渡模式不可用,因为我们不再相互切换特有的元素;
  • 内部元素总是需要提供唯一的key attribute 值;
  • CSS 过渡的类将会应用在内部的元素中,而不是这个组/容器本身;
 
案例一
 
案例二
交替过渡动画
 
 
 
notion image

 
Vue3组件化开发Composition API
Loading...
😈Zabanya
😈Zabanya
一名喜欢瞎折腾选手
公告
 
部分教程类文章篇幅过大,可能会导致加载时间稍微偏长,非常感谢您的耐心等待 ~ 🎉