一.vue中的css动画原理(transition)
1.过渡显示
(1)transition标签
transition表示包裹的内容会有一个动画过渡效果,动画效果必须包含在transition标签里。
(2)动画流程
transition包裹后会vue会自动分析css样式,构建一个动画流程。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue中的css动画原理</title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
.fade-enter {
opacity: 0;
} /* fade-enter被移除,opacity将恢复到1 */
/* 这个变化将在3s种内完成 */
.fade-enter-active {
transition: opacity 3s;
}
/* 对opacity进行transition监控,若opacity变化会在三秒钟从0变到opacity的值 */
/* .v-enter{
opacity: 0;
}
.v-enter-active{
transition: opacity 3s;
} */
</style>
</head>
<body>
<div id="root">
<transition name="fade"> <!-- 不屑name默认前缀为v -->
<!-- 动画效果必须包含在transition标签里
transition表示包裹的内容会有一个动画过渡效果-->
<!-- transition包裹后会vue会自动分析css样式,构建一个动画流程 -->
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
流程:a.动画将要执行时,fade-enter与fade-enter-active生成。
b.第二帧时,fade-enter被消除,opacity将恢复到1。
c.将会在3s内完成恢复。
2.过渡隐藏
(1)动画流程
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
.v-enter{
opacity: 0;
}
.v-enter-active{
transition: opacity 20s;
}
.v-leave-to{
opacity: 0;
}
.v-leave-active{
transition: opacity 5s;
}
/* opacity默认值为1。 */
</style>
</head>
<body>
<div id="root">
<transition>
<div v-if="show">
<!-- v-if与v-show都可以只要用transition包裹 -->
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
二.在Vue中使用Animate.css库(keyframes)
1.在vue中如何使用@keyframes方式的动画
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>在Vue中使用Animate.css库</title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
/* 名字为bounce-in的动画效果 */
@keyframes bounce-in{
0%{
transform: scale(0);
}
50%{
transform: scale(1.5);
}
100%{
transform: scale(1);
}
}
.fade-enter-active{
transform-origin: left center;
animation: bounce-in 1s; /* 一秒内运行结束 */
}
.fade-leave-active{
transform-origin: left center;
animation: bounce-in 1s reverse; /* revers让动画反向执行 */
}
</style>
</head>
<body>
<div id="root">
<transition name="fade">
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
自定义class名字
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
@keyframes bounce-in{
0%{
transform: scale(0);
}
50%{
transform: scale(1.5);
}
100%{
transform: scale(1);
}
}
.active{
transform-origin: left center;
animation: bounce-in 1s;
}
.leave{
transform-origin: left center;
animation: bounce-in 1s reverse;
}
</style>
</head>
<body>
<div id="root">
<transition name="fade"
enter-active-class="active"
leave-active-class="leave"
><!-- 自定义class名字 -->
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
2.使用animate.css库
animate.css网址https://animate.style/
animate.css所提供的动画就是@keyframes类型的css动画效果。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="../animate.css"/>
<style type="text/css">
</style>
</head>
<body>
<div id="root">
<transition name="fade"
enter-active-class="animated wobble"
leave-active-class="animated wobble"
><!-- 使用animate动画,入场出场的名字都要是animated -->
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
三.在vue中使用过度和动画
1.第一次显示如何有动画效果
appear-active-class要使网页第一次显示也有动画就要加上,还需要在上面声明appear
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="../animate.css"/>
<style type="text/css">
</style>
</head>
<body>
<div id="root">
<transition name="fade"
appear
enter-active-class="animated wobble"
leave-active-class="animated wobble"
appear-active-class="animated wobble"
><!-- 使用animate动画,入场出场的名字都要是animated -->
<!-- appear-active-class要使网页第一次显示也有动画就要加上,还需要在上面声明appear -->
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
2.既要有@keyframes动画效果又要有transition效果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="../animate.css"/>
<style type="text/css">
.fade-enter,
.fade-leave-to{
opacity: 0;
}
.fade-enter-active,
.fade-leave-active{
transition: opacity 2s;
}
</style>
</head>
<body>
<div id="root">
<!-- type="transition" 设置动画时常与transition为准 -->
<!-- :duration="10000" 自定义动画时间 -->
<transition
<!-- type="transition" -->
<!-- :duration="10000" -->
:duration="{enter:5000,leave:10000}"
<!-- enter为入场动画,leave为出场 -->
name="fade"
appear
enter-active-class="animated flash fade-enter-activa"
leave-active-class="animated wobble fade-leave-active"
appear-active-class="animated wobble">
<!-- 使用animate动画,入场出场的名字都要是animated -->
<!-- appear-active-class要使网页第一次显示也有动画就要加上,还需要在上面声明appear -->
<div v-if="show">
hello world
</div>
</transition>
<button type="button" @click="handleClick">切换</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
<!-- 总结:通过appear与 appear-active-class实现页面初次动画。
即使用transition动画又使用@keyframes动画。
type确定与哪一种动画时常为准。
使用duration设置动画时常。 -->
四.Vue中的Js动画与Velocity.js的结合
1.入场动画
(1)动画钩子before-enter
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="root">
<transition
name="fade"
@before-enter="handleBefoeEnter"
@enter="handleEnter"
>
<!-- 当@before-enter运行玩,动画开始运行,动画都写在在handleEnter里。 -->
<div v-show="show">
Hello World
</div>
</transition>
<button type="button" @click="handleClick">toggle</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:"#root",
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
},
// el值是动画包裹的div标签
handleBefoeEnter:function(el){
el.style.color ='red'
},
// el值一样是动画包裹的div标签,done是回调函数
handleEnter:function(el,done){
setTimeout(() =>{
el.style.color = 'green'
done()
//执行结束后要调用done函数,相当于告诉Vue已经执行完了
},2000)
},
// 点击toggle后,变成红色,动画开始运行,2秒中变成绿色
}
})
</script>
</body>
</html>
(2)动画钩子enter与after-enter
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="root">
<transition
name="fade"
@before-enter="handleBefoeEnter"
@enter="handleEnter"
@after-enter="handleAfaterEnter"
>
<!-- 当@before-enter运行玩,动画开始运行,动画都写在在handleEnter里。 -->
<div v-show="show">
Hello World
</div>
</transition>
<button type="button" @click="handleClick">toggle</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:"#root",
data:{
show:true
},
methods:{
handleClick:function(){
this.show=!this.show
},
// el值是动画包裹的div标签
handleBefoeEnter:function(el){
el.style.color ='red'
},
// el值一样是动画包裹的div标签,done是回调函数
handleEnter:function(el,done){
setTimeout(() =>{
el.style.color = 'green'
done()
//执行结束后要调用done函数,相当于告诉Vue已经执行完了
},2000)
setTimeout(() => {
done()
},4000)
},
// 点击toggle后,变成红色,动画开始运行,2秒中变成绿色,4秒算结束
handleAfaterEnter:function(el){
el.style.color = "#000"
}
}
})
</script>
</body>
</html>
2.出场动画
分别对应的动画钩子为
(1)@before-leave
(2)@leave
(3)@after-enter
3.velocity.js