vue动画
https://cn.vuejs.org/v2/guide/transitions.html
在进入/离开的过渡中,会有 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
被删除),在过渡/动画完成之后移除。
对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>
,则 v-
是这些类名的默认前缀。如果你使用了 <transition name="my-transition">
,那么 v-enter
会替换为 my-transition-enter
。
v-enter-active
和 v-leave-active
可以控制进入/离开过渡的不同的缓和曲线
- 使用transition元素把需要被动画控制的元素包括起来
<body> <div id="app"> <input type="button" value="toggle" @click='flag = !flag'> <!--需求:点击按钮,让h3显示,再点击让h3隐藏--> <!--1.使用transition元素,把需要动画的控制的元素包括起来--> <transition> <h3 v-if='flag'>这是一个H3</h3> </transition> </div> <script> var vm = new Vue({ el: '#app', data: { flag: false }, methods: {} }) </script> </body>
- 自定义两组样式控制transition内部元素的动画实现,默认.v-,但是有一个问题,当需要实现不同动画时就没办法,当遇到这种情况时,<transitiono name='my-transition1'></transition>就可以了,将.v-改为.my-transition1就可以了
//v-enter和v-leave-to是动画进入之前和离开之后的时间点,他们两个时间点的状态是一致的
.v-enter,.v-leave-to {
opacity: 0;//透明度为0
transform: translateX(80px)
}
//v-enter-active和v-leave-active入场和出场的时间段
.v-enter-active,v-leave-active {
transition: all 0.4s ease
}
实现半场动画:只有进入的动画,没有离开的动画
小球半场动画:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width , initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
<link rel="stylesheet" href="./lib/bootstrap-3.3.7.css">
<style>
.ball {
width: 15px;
height: 15px;
border-radius: 50%;
background-color: red;
}
</style>
</head>
<body>
<div id="app">
<input type="button" value="快到碗里来" @click='flag = !flag'>
<transition
@before-enter='beforeEnter'
@enter='enter'
@after-enter='afterEnter'>
<div class='ball' v-show='flag'></div>
</transition>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
flag: false
},
methods: {
//注意:动画钩子函数的第一个函数el表示要执行的那个元素,是个原生的js DOM对象
beforeEnter(el) {
//beforeEnter表示动画入场之前,表示动画尚未开始,可以再beforeEnter中设置元素的样式
//设置小球的起始位置
el.style.transform = 'translate(0 , 0)'
},
enter(el , done) {
//表示动画开始之后的样式,这里可以设置小球完成动画之后的状态
el.offsetWidth
//设置小球的结束位置
el.style.transform = 'translate(150px , 450px)'
//小球动画时长
el.style.transition = 'all 0.5s ease'
//这里的done其实就是afterEnter这个函数,也就是说done是afterEnter的引用(我认为是结束enter函数)
done()
},
afterEnter(el) {
//动画完成之后
this.flag = !this.flag
}
}
})
</script>
</body>
</html>