下面这段代码,是点击按钮实现hello world
显示与隐藏
hello world
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
此时有一个需求,希望是在显示与隐藏时,能实现渐隐渐现的动画效果。
hello world
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
如果希望hello world
有一个动画效果的话,需要在外面套一层transition
标签,意思它包裹的内容,有一个动画效果,可以给它一个名字name="fade"
。
enter
当一个元素被transition
标签包裹之后,Vue 会自动的分析元素的css
样式,然后构建动画流程
在动画还没有执行的一瞬间,Vue 会帮我们在dom
标签上添加两个class
,分别是fade-enter
、fade-enter-active
。
当动画第一帧执行结束之后,transition
这个标签分析过,里面有一个动画效果,Vue 会在动画运行到第二帧的时候,会将dom
标签上v-enter
的class
删除,再添加一个v-enter-to
的class
。
接着动画会继续执行,执行到结束的一瞬间,Vue 会干一件事,它会把之前添加的v-enter-to
和v-enter-active
都删除,
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition: opacity 3s;
}
hello world
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
我们只需要在css
中给fade-enter
和fade-enter-active
分别写上样式就行了。这里要注意的是 Vue 中默认以v
开头,如:v-enter
,transition
加个name
属性,就可以用name
属性值做开头,如:fade-enter
。
现在这里两个class
的意思是:
动画还没执行时,就已经有fade-enter
,fade-enter-active
,动画第一帧运行时fade-enter
就会被移除,css
效果opacity: 0
就会变成opacity: 1
,直到动画执行完fade-enter-active
才会被移除,这期间它用transition
对opacity
进行监控,需要3s
才能完成。
leave
隐藏的动画流程:
隐藏的第一个瞬间时,Vue 会在dom
上添加两个class
,分别是v-leave
和v-leave-active
运行到第二帧时,Vue 会将v-leave
移除,再添加一个v-leave-to
接着动画会继续执行,执行到结束的一瞬间,Vue 会把之前添加的v-leave-to
和v-leave-active
都删除。
.fade-leave-to{
opacity: 0;
}
.fade-leave-active{
transition: opacity 3s;
}
hello world
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
为什么加了这两个css
动画效果就出来了呢?
从动画执行的第一个瞬间,到动画执行完毕,fade-leave-active
这个class
都存在。也就是在动画运行过程中,我要时刻监听div
的opacity
,一旦opacity
发生变化,我要让让他在3s
内执行完毕。
在第一个瞬间fade-leave
的opacity
为1
,就是显示状态;第二个瞬间opacity
为0
了,此时要给它添加一个fade-leave-to
的class
,而fade-leave-active
一直在监听opacity
的变化,一旦opacity
发生变化,会让它在3s
内完成
自定义class
如果我不想用 Vue 提供的这六个class
,我想自定义一个class
,该怎么实现呢?
.active,.leave{
transition: opacity 3s;
}
Vue 给我们提供了一个自定义的属性的方法,使用enter-active-class
就能自定义一个enter
类;使用leave-active-class
就用自定义一个leave
类。
hello world