动画状态类名
vue动画经过将须要执行动画的标签放入transition标签中,再经过设置预置的vue动画类名的css样式来控制动画的呈现效果。javascript
开场动画状态的三个类名css
v-enter:动画开始以前的状态html
v-enter-active:动画过渡期间的状态vue
v-enter-to:动画结束后的状态java
离场动画状态的三个类名app
v-leave:动画开始以前的状态ide
v-leave-active:动画过渡期间的状态函数
v-leave-to:动画结束后的状态post
css属性transition能够控制元素执行动画过渡,该属性须要设置元素的起始样式和结束样式,起始样式写在css样式表里,而结束样式的写法有两种,要么得经过js来设置结束样式,要么动态改变该元素的类名(在新的类名中写结束样式)。而在vue.js中,要为某个元素执行动画须要如下三步:学习
1.将须要执行动画的元素用transition标签包裹起来
2.用起始、过渡、结束的三个类名设置元素的起始、过渡和结束样式
3.在元素上指定v-show指令(v-show控制元素的显示和隐藏)
综上能够看出vue动画是以元素的显示和隐藏做为动画的基础,显示元素是入场动画、而隐藏元素则是出场动画。如下是一个点击按钮后h3标签将从起始样式(透明度为0)过渡到结束样式(透明度为1)的动画。
.v-enter {
opacity: 0; //起始样式
}
.v-enter-active {
transition: all 0.9s ease;
}
.v-enter-to {
opacity: 1;//结束样式
}
.v-leave{
opacity: 1; //起始样式
}
.v-leave-active{
transition:all 0.9s ease;
}
.v-leave-to{
opacity: 0; //结束样式
}
<div id="box">
<input type="button" @click="flag=!flag" />
<transition>
<h3 v-show="flag">hello world</h3>
</transition>
</div>
var vm = new Vue({
el: "#box",
data:{
flag:false
}
});

vue组件切换动画
<transition mode="out-in">
<router-view></router-view>
</transition>
.v-enter-active,.v-leave-active{
transition:all 0.3s ease;
}
.v-leave-to{
opacity:0;
transform:translateX(-100%);
}
.v-enter{
opacity:0;
transform:translateX(100%);
}
修改动画类名 <transition name="xx">
若是一个vue中有多个html元素都有本身的动画,那么v-enter、v-leave将没法同时知足多个元素的动画,此时能够为transition指定name属性,指定name后,v-enter中的v变为name。
.n1-enter{ }
.n1-enter-active{ }
.n1-enter-to{ }
.n1-leave { }
.n1-leave-active { }
.n1-leave-to { }
.n2-enter{ }
.n2-enter-active{ }
.n2-enter-to{ }
.n2-leave { }
.n2-leave-active { }
.n2-leave-to { }
<transition name="n1">
……
</transition>
<transition name="n2">
……
</transition>
动画事件 <transition @事件名="xxx">
因为默认的vue动画是专用于元素的显示与隐藏,若是元素须要执行的动画不是默认的显示与隐藏,则须要使用动画事件。
<transition @before-enter="初始状态的事件函数"
@enter="过渡状态的事件函数"
@after-enter="结束状态的事件函数"
@enter-cancelled="取消动画的事件函数"
@before-leave="初始状态的事件函数"
@leave="过渡状态的事件函数"
@after-leave="结束状态的事件函数"
@leave-cancelled="取消动画的事件函数">
</transition>
好比购物车小球动画:

这个动画仅仅使用动画状态类名是没法完成的。这个过程是:点击加入购物车按钮,购物球从无到有显示出来,接着执行动画过渡到下方后透明度改成0,但它并不会真正从文档中消失,若是使用动画类名控制这个动画效果,那么当再次点击按钮的时候,购物球会消失,由于按钮只能重复控制奇数次时购物球显示偶数次时购物球隐藏这种效果。而正确的需求应该是你第二次点击购物球的时候它应该继续执行从无到有再移动到下方的过渡动画,而使用动画状态类名结合按钮的显示/隐藏模式并不能知足这个需求,第二次点击按钮时它只能控制隐藏购物球。因此,相似于这种半场动画能够交给vue的动画事件来完成,在vue中提供了动画事件的事件指令,事件指令指向自处理的事件处理函数,你能够在函数里设置按钮所关注的那个控制显示/隐藏的布尔值,以此达到购物球能够每次点击按钮时看起来都像是从无到有显示出来的效果。
购物车小球动画

首先按钮被点击后设置flag为true,而执行动画的小球元素被v-show控制,一旦flag为true就会开启动画的执行,在各个动画事件中控制动画的呈现方式
<body>
<div class="btn-box">
<div class="btn-1" @click="clickFlag&&addCar()">加入购物车</div>
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter" @after-leave="afterLeave">
<i id="shop-ball" class="shop-ball" v-show="flag"></i>
</transition>
<div class="btn-2">当即购买</div>
</div>
<img src="/Img/p2.2.jpg" />
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li id="shop-car">购物车</li>
<li>e</li>
</ul>
</body>
</html>
<script type="text/javascript">
var vm = new Vue({
el: ".btn-box",
data: {
flag: false,
clickFlag: true, carPosition: null,
ballPostion: null,
xP: null,
yP: null
},
methods: {
addCar: function () {
this.flag = !this.flag;
},
beforeEnter: function (el) {
el.style.transform = "translate(0, 0)";
el.style.opacity = "1";
},
enter: function (el, done) {
this.clickFlag = false;
this.carPosition = document.querySelector("#shop-car").getBoundingClientRect(); this.ballPostion = document.querySelector("#shop-ball").getBoundingClientRect();
this.xP = this.carPosition.left - this.ballPostion.left+30 ;
this.yP = this.carPosition.top - this.ballPostion.top;
el.style.opacity = "1";
el.style.transition = "all 1s cubic-bezier(.4,-0.3,1,.68)";
el.style.transform = `translate(${this.xP}px,${this.yP}px)`;
done();
},
afterEnter: function (el) {
this.flag = !this.flag;
},
afterLeave: function (el) {
this.clickFlag = true;
el.style.transform = "translate(0, 0)";
}
}
});
</script>
在v-for元素上使用vue动画 transition-group
在v-for的元素上不能应用transition而应改成transition-group。如下实现一个添加新项到列表时的入场动画和删除列项时的出场动画。
ul{
list-style:none;
}
li{
background:#b6ff00;
}
.v-enter{
opacity:0;
transform:translateY(100px);
}
.v-enter-active{
transition:all 0.6s ease;
}
.v-leave-to{
opacity:0;
transform:translateY(100px);
}
.v-leave-active{
transition:all 0.6s ease;
}
<div id="box">
<input type="text" v-model="id" />
<input type="text" v-model="stu" />
<button @click="add">test</button>
<transition-group appear tag="ul"> 若是须要在网页一打开就显示整个列表的动画效果,须要为transition-group指定一个appear,再指定该标签被当作ul使用
<li v-for="(item, i) in list" :key="item.id" @click="del(i)">
{{item.id}},{{item.stu}}
</li>
</transition-group>
</div>
var vm = new Vue({
el: "#box",
data: {
id:"",
stu:null,
list: [
{id:1,stu:"sam"}
]
},
methods: {
add: function () {
this.list.push({ id: this.id, stu: this.stu});
},
del: function (index) {
this.list.splice(index,1);
}
}

上图中当删除一项时,下面一项没有以动画过渡的形式顶替上一项的位置,可增长下面两个类来改善动画效果。
1.v-move:使当删除列表某项时,它的下一项会接收到位置的变化,能够以动画的效果顶替被删除的元素的位置
2.被删除的元素必须绝对定位
.v-move{
transition:all 0.6s ease;
}
.v-leave-active{
position:absolute;
width:100%;
}
动画队列
mode:in-out | out-in,表示动画执行模式为先等待入场动画执行完毕再执行出场动画,或反之
好比在一个切换登陆或注册的tab项时,由于应用了动画的左移效果,当点击注册时,注册的功能区域会左移淡入,而登陆的功能区域会左移淡出,此时两个动画同时在执行,会引发混乱。

Javascript - 学习总目录