4-2 自定义指令与过渡-过渡(动画)
目录:
- 简介
- 基本用法
- 钩子函数
- 结合第三方动画库 Animate.css 一起使用(实际项目中使用)
一、简介
Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。官方使用文档:过渡 & 动画
本质上还是使用css3动画:transition、animation
包括工具如下:
- 在 CSS 过渡和动画中自动应用 class
- 可以配合使用第三方 CSS 动画库,如 Animate.css
- 在过渡钩子函数中使用 JavaScript 直接操作 DOM
- 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
二、基本用法
2.1、基本定义
使用 transition 组件,将要执行动画的元素包含在该组件内。Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡。
<transition name="fade"> //name的值可以自定义,但是必须要有,不然光有组件是没用的
运动的元素
</transition>
2.2、过渡的类名
在进入/离开的过渡中,会有 6 个 class 切换。v-enter 其实就是 名字-动画动作 。
1.v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。(进入动画) 2.v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。 3.v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。 4.v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。(离开动画) 5.v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。 6.v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
如图:

以下代码示例可以显示:
<head>
<meta charset="UTF-8">
<title>动画</title>
<style>
p{
width: 300px;
height: 300px;
background-color: red;
}
/* 设置持续时间和动画函数 */
.fade-enter-active,.fade-leave-active{
transition:all 1s ease;
}
.fade-enter-active{
opacity: 1;
width: 300px;
height: 300px;
}
.fade-leave-active{
opacity: 0;
width: 0px;
height: 0px;
}
/*必须要定义初始化进入状态,不然进入动画,不显示动画效果,且fade-enter需要放在fade-enter-active后面*/
.fade-enter{
opacity: 0;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="box">
<button @click="flag=!flag">点我啊</button>
<hr>
<!--只用transition是没用的,必须要有name,name的值是随便定义-->
<transition name="fade">
<!--显示叫进入动画,隐藏叫离开动画-->
<p v-show="flag">高哥哥真帅啊!!!</p>
</transition>
</div>
<script type="text/javascript" src="../vue.js"></script>
<script>
let vm = new Vue({
el: "#box",
data:{
flag: false
}
});
</script>
</body>
三、钩子函数
可以在属性中声明 JavaScript 钩子,钩子函数一共有8个。官方文档:JavaScript 钩子
<transition @before-enter="beforeEnter" //动画进去之前 @enter="enter" //动画进入 @after-enter="afterEnter" //动画进入之后 @enter-cancelled="enterCancelled" //进入动画过程中可以去掉进入动画 @before-leave="beforeLeave" //动画即将离开之前 @leave="leave" //动画离开 @after-leave="afterLeave" //动画离开之后 @leave-cancelled="leaveCancelled" //动画离开过程中可以取消离开动画 > <!-- ... --> </transition>
用法:
// ...
methods: {
// --------
// 进入中
// --------
beforeEnter(el) { //钩子函数是有参数的,el:表示你运动的元素
// ...
},
// 当与 CSS 结合使用时
// 回调函数 done 是可选的
enter(el, done) {
// ...
done()
},
afterEnter(el) {
// ...
},
enterCancelled(el) {
// ...
},
// --------
// 离开时
// --------
beforeLeave(el) {
// ...
},
// 当与 CSS 结合使用时
// 回调函数 done 是可选的
leave(el, done) {
// ...
done()
},
afterLeave(el) {
// ...
},
// leaveCancelled 只用于 v-show 中
leaveCancelled(el) {
// ...
}
}
完整的代码例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动画</title>
<style>
p{
width: 300px;
height: 300px;
background-color: red;
}
/* 设置持续时间和动画函数 */
.fade-enter-active,.fade-leave-active{
transition:all 1s ease;
}
.fade-enter-active{
opacity: 1;
width: 300px;
height: 300px;
}
.fade-leave-active{
opacity: 0;
width: 0px;
height: 0px;
}
/*必须要定义初始化进入状态,不然进入动画,不显示动画效果,且fade-enter需要放在fade-enter-active后面*/
.fade-enter{
opacity: 0;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="box">
<button @click="flag=!flag">点我啊</button>
<hr>
<!--只用transition是没用的,必须要有name,name的值是随便定义-->
<transition name="fade"
@before-enter="beforeEnter" //调用js钩子函数
@enter="enter"
@after-enter="afterEnter"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave">
<!--显示叫进入动画,隐藏叫离开动画-->
<p v-show="flag">高哥哥真帅啊!!!</p>
</transition>
</div>
<script type="text/javascript" src="../vue.js"></script>
<script>
let vm = new Vue({
el: "#box",
data:{
flag: false
},
methods:{ //js钩子函数
beforeEnter(el){
//alert("动画进入之前");
},
enter(){
//alert("动画进入");
},
afterEnter(el){
//alert("动画进入之后");
el.style.backgroundColor = "blue";
},
beforeLeave(){
//alert("动画离开之前");
},
leave(){
//alert("动画离开");
},
afterLeave(el){
//alert("动画离开之后");
el.style.backgroundColor = "red";
}
}
});
</script>
</body>
</html>
四、结合第三方动画库 Animate.css 一起使用
可以配合使用第三方 CSS 动画库,如 Animate.css,在实例的项目中,其实是用Animate.css的。下载Animate.css。如果发生变化,请在百度中搜索Animate.css。
结合Animate.css,需要自定义过渡类名,Vue官网:自定义过渡的类名
其实我们只需要用以下两个就可以了:
enter-active-class leave-active-class
基本使用:
bounceInLeft和bounceOouRight必须是Animate.css中有的,animated是基础样式,必须要有
<!--animated是基础样式,必须要有-->
<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight">
<p v-show="flag">高哥哥真帅啊!!!</p>
</transition>
示例:
<head>
<meta charset="UTF-8">
<!--引入animate.css-->
<link rel="stylesheet" href="css/animate.css">
<title>动画</title>
<style>
p{
width: 300px;
height: 300px;
background-color: red;
margin: 0 auto;
}
</style>
</head>
<body>
<div id="box">
<button @click="flag=!flag">点我啊</button>
<hr>
<!--animated是基础样式,必须要有-->
<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight">
<p v-show="flag">高哥哥真帅啊!!!</p>
</transition>
</div>
<script type="text/javascript" src="../vue.js"></script>
<script>
let vm = new Vue({
el: "#box",
data:{
flag: false
}
})
</script>
</body>

浙公网安备 33010602011771号