过渡
Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果. 包括以下工具:
- 在 CSS 过渡和动画中自动应用 class
- 可以配合使用第三方 CSS 动画库,如 Animate.css
- 在过渡钩子函数中使用 JavaScript 直接操作 DOM
- 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
注: 后面两种工具涉及到太多 js 的操作,一般来说很消耗内存,故不太多使用.
单元素/组件的过渡
Vue 封装了 transition 的封装组件,可以为任何元素和组件添加进入/离开过渡
- 条件渲染(v-if)
- 条件展示(v-show)
- 动态组件
- 组件根节点
使用方法: template 部分:
<template lang="html">
<div class="">
<button type="button" name="button" v-on:click="showHide">过渡</button>
<transition name="fade">
<p v-show="show">哈哈</p>
</transition>
</div>
</template>
script 部分:
<script>
export default {
name:"anim",
data(){
return {
show:true
}
},
methods:{
showHide(){
this.show=!this.show;
}
}
}
</script>
style 部分:
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition: opacity .5s;
}
.fade-enter-to{
opacity: 1;
}
.fade-leave-enter{
opacity: 1;
}
.fade-leave-active{
transition: opacity .5s;
}
.fade-leave-to{
opacity: 0;
}
总结:将元素放置在 transition 标签下,为 transition 标签赋值一个 name 属性,然后在样式表里面实现动画. 形如:
<transition name="my transition">
过渡的类名
当插入或删除包含在 transition 组件中的元素时,Vue 将会自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名. 在进入/离开的过渡中,有 6 个 class 切换:
- v-enter:定义进入过渡的开始状态
- v-enter-active:执行过程中
- v-enter-to:结束动画
- v-leave:定义离开过渡的开始状态
- v-leave-active:离开过程
- v-leave-to:离开结束
过渡总共有 6 个状态,进入有 3 个,退出有 3 个. 在使用时 6 个都应使用,形如:
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition: opacity .5s;
}
.fade-enter-to{
opacity: 1;
}
.fade-leave-enter{
opacity: 1;
}
.fade-leave-active{
transition: opacity .5s;
}
.fade-leave-to{
opacity: 0;
}
css 动画
CSS 动画用法同 CSS 过渡,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。 在使用动画时,通常只需要控制 enter-active 和 leave-active 两个过程即可. 例如: template 部分:
<template lang="html">
<div class="">
<button type="button" name="button" v-on:click="showHideAnim">动画</button>
<transition name="hello">
<p v-show="showAnim">嘿嘿</p>
</transition>
</div>
</template>
script 部分:
<script>
export default {
name:"anim",
data(){
return {
show:true
}
},
methods:{
showHideAnim(){
this.showAnim=!this.showAnim;
}
}
}
</script>
style 部分:
.hello-enter-active{
animation: bounce-in 1s ease;
}
.hello-leave-active{
animation: bounce-in 1s ease reverse;
}
@keyframes bounce-in {
0% {
transform: scale(0);
}
50% {
transform: scale(1.5);
}
100% {
transform: scale(1);
}
}
引入第三方 css 动画库
可以在 index.html 引入外部 css 动画库,如Animate.
<link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
然后在组件中可以直接使用:
<transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight">
<p v-show="libs">呵呵</p>
</transition>