问题的引入
首先我们完成一段通过点击控制div盒子出现及消失的代码
<div id="root">
<div v-if='show'>hello world</div>
<button @click="handleClick">change</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show = ! this.show
}
}
})
</script>
我们希望实现div盒子的渐入渐出的效果,所以引入了过渡动画的内容,这里我们使用CSS实现
CSS实现过渡动画
使用目的
在页面的构建过程中,往往会令单个的DOM元素或者单个组件进行出现或消失的操作,过渡动画则完成了令这些内容渐入渐出的效果
使用对象
- 条件渲染v-if
- 条件展示v-show
- 动态组件
- 组件根节点
使用方法
对需要添加动画效果的内容外部包裹一个<transition>
标签,并编写相应的CSS样式
<transition name='fade'>
<div v-if='show'>hello world</div>
</transition>
name属性
name : string,用于自动生成 CSS 过渡类名。例如:name: 'fade' 将自动拓展为.fade-enter,.fade-enter-active等。默认类名为 "v"
appear属性
appear : boolean,是否在初始渲染时使用过渡。默认为 false。
过渡动画原理分析
CSS过渡时通过添加或删除相应的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 被删除),在过渡/动画完成之后移除。
CSS样式内容分析
opacity样式
CSS中的opacity属性设置元素的不透明级别
语法:
opacity: value|inherit;
- value:指定相应的不透明度,从0.0(完全透明) - 1.0(不透明)
- inherit:opacity属性值从父元素继承
显示
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition:opacity 3s;
}
分析:
- 通过改变元素的不透明度来实现,为了使元素显示,我们需要令opacity值从0到1
- 当从第二帧开始删除fade-enter类,opacity值即变为1
- 我们在fade-enter-active类中使用transition对opacity进行控制,使他三秒完成变换,即达到了渐入渐出的效果
- 当结束时fade-enter-to结束的类应该将opacity设置为1,由于默认值为1,故不再进行多余设置
消失
.fade-leave-to{
opacity: 0;
}
.fade-leave-active{
transition: opacity 3s;
}
分析:
- 由于从显示到消失,初始状态时opacity值为1,即为默认值,故fade-leave不须多余设置
- 我们需要设置结束时的fade-leave-to的opacity值为0,即完全透明不显示
- 在fade-leave-active使用transition对opacity的变化进行控制,使他在三秒内完成
过渡动画修改后的代码
<style type="text/css">
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition:opacity 3s;
}
.fade-leave-to{
opacity: 0;
}
.fade-leave-active{
transition: opacity 3s;
}
</style>
<div id="root">
<transition name='fade'>
<div v-if='show'>hello world</div>
</transition>
<button @click="handleClick">change</button>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#root',
data:{
show:true
},
methods:{
handleClick:function(){
this.show = ! this.show
}
}
})
</script>