VUE过渡和动画
过渡
Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件。
语法格式
<transition name = "nameoftransition">
<div></div>
</transition>
实现条件:
在需要有过渡效果的标签外面添加<transition></transition>。也就是说vue中被<transition></transition>包裹的元素才能实现过渡效果。
类名的说明:
<transition>,则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter。opacity的说明:
在过渡动画的显示和隐藏会用opacity属性来表征。opacity:1 不透明(显示)| opacity:0 透明(不显示)
原理
vue在加了<transition>标签的元素提供了三个进入过渡的类,和三个离开过渡的类。
| 进入过渡 | 离开过渡 |
|---|---|
.v-enter:定义进入过渡的开始状态
|
.v-leave:定义离开过渡的开始状态
|
.v-enter-to:定义进入过渡的结束状态
|
.v-leave-to:定义离开过渡的结束状态
|
.v-enter-active:定义进入过渡生效时的状态
|
.v-leave-active:定义离开过渡生效时的状态
|
这6个类的生效时间
对于进入动画来说:
| .v-enter | . v-enter-to | . v-enter-active |
|---|---|---|
| 定义开始过渡的开始状态 | 定义开始过渡的结束状态 | 定义过渡生效时的状态 |
| 插入之前生效 | 插入之后下一帧生效(同时 v-enter 被移除) | 动画整个过程生效 |
| 下一帧被移除 | 动画完成之后移除 | 动画整个过程生效 |
对于离开动画来说:
| .v-leave | .v-leave-to | .v-leave-active |
|---|---|---|
| 定义离开过渡的开始状态 | 定义离开过渡的结束状态 | 定义过渡生效时的状态 |
| 离开过渡被触发时立刻生效 | 触发之后下一帧生效 (与此同时 v-leave 被删除) | 整个离开过渡的阶段中应用 |
| 下一帧被移除 | 动画完成之后移除 | 整个离开过渡的阶段中应用 |
原理图
vue的过渡跟元素插入,离开有关,得绑定v-if,v-show之类改变display的指令。插入的时候触发enter,离开时触发leave,过渡原理就是给transition绑定的元素添加class,class里面添加样式和过渡

过渡例子
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <style> /* 可以设置不同的进入和离开动画 */ /* 设置持续时间和动画函数 */ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);//cubic-bezier从开始到过渡,不同的速度过渡 } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active 用于 2.1.8 以下版本 */ { transform: translateX(10px); opacity: 0; } </style> </head> <body> <div id = "databinding"> <button v-on:click = "show = !show">点我</button> <transition name="slide-fade"> <p v-if="show">菜鸟教程</p> </transition> </div> <script type = "text/javascript"> new Vue({ el: '#databinding', data: { show: true } }) </script> </body> </html>
动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <style> .bounce-enter-active { animation: bounce-in .5s; } .bounce-leave-active { animation: bounce-in .5s reverse; //reverse设置了动画触发反着来 从100%到0% } @keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.5); } 100% { transform: scale(1); } } </style> </head> <body> <div id = "databinding"> <button v-on:click = "show = !show">点我</button> <transition name="bounce"> <p v-if="show">菜鸟教程 -- 学的不仅是技术,更是梦想!!!</p> </transition> </div> <script type = "text/javascript"> new Vue({ el: '#databinding', data: { show: true } }) </script> </body> </html>
CSS 动画用法类似 CSS 过渡,但是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。
自定义过渡类名
enter-classenter-active-classenter-to-class(2.1.8+)leave-classleave-active-classleave-to-class(2.1.8+)
我们可以通过自定义过渡的类名,这样他们的类名优先级会高于普通的类名
比如
<transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" > <p v-if="show">菜鸟教程 -- 学的不仅是技术,更是梦想!!!</p> </transition>
同时使用过渡和动画
Vue 为了知道过渡的完成,必须设置相应的事件监听器。它可以是 transitionend 或 animationend ,这取决于给元素应用的 CSS 规则。如果你使用其中任何一种,Vue 能自动识别类型并设置监听。
但是,在一些场景中,你需要给同一个元素同时设置两种过渡动效,比如 animation 很快的被触发并完成了,而 transition 效果还没结束。在这种情况中,你就需要使用 type 特性并设置 animation 或 transition 来明确声明你需要 Vue 监听的类型。
显性的过渡持续时间
在很多情况下,Vue 可以自动得出过渡效果的完成时机。默认情况下,Vue 会等待其在过渡效果的根元素的第一个 transitionend 或 animationend 事件。然而也可以不这样设定——比如,我们可以拥有一个精心编排的一系列过渡效果,其中一些嵌套的内部元素相比于过渡效果的根元素有延迟的或更长的过渡效果。
在这种情况下你可以用 <transition> 组件上的 duration 属性定制一个显性的过渡持续时间 (以毫秒计):
<transition :duration="1000">...</transition>
你也可以定制进入和移出的持续时间:
<transition :duration="{ enter: 500, leave: 800 }">...</transition>
和js钩子配合
日后补充
多个元素过渡
日后补充
个人总结
在需要过渡的标签外添加<transition>标签,
vue的过渡跟元素插入,离开有关,得绑定v-if,v-show之类改变display的指令。插入的时候触发enter,离开时触发leave,过渡原理就是给transition绑定的元素添加class,class里面添加样式和过渡,在进入离开过渡中有6个class切换
v-enter(一帧) 到 v-enter-to(动画完成后移除) v-enter-active设置进入的持续时间和动画函数 v-leave(一帧)到v-leave-to(动画完成后移除) v-leave-active设置离开的持续时间和动画函数
动画 类似css过渡,在v-enter-active v-leave-active那设置 animation:<动画名> <其他设置> 再由@keyframes <动画名>{ 变化 }

浙公网安备 33010602011771号