1. Vue.transition函数介绍
Vue.js是一个用于构建用户界面的渐进式框架,提供了丰富的API和功能,其中Vue.transition函数是Vue.js框架中非常重要的一部分,它允许开发者在DOM元素进出场时制定动画效果,并可以在动画结束后触发回调函数。这个函数接收2个参数:过渡名称和配置对象,具体的API格式如下:
Vue.transition(transitionName:string | Object, definition: Object)
1.1 过渡的名称定义
过渡的名称可以为字符串,表明该过渡应用于所有具有该名称的过渡元素,也可以为一个包含钩子函数的对象。在这个对象中,每个钩子函数的名称与Vue.js中预定义的钩子函数名称相同,如enter(进场动画开始前)、enter-active(进场动画过程中)、enter-to(进场动画完成后)、leave(出场动画开始前)、leave-active(出场动画过程中)等等。下面是自定义名称的API格式:
definition: {
name: string,
// 钩子函数...
}
1.2 钩子函数介绍
在Vue.transition函数中,钩子函数是用来控制过渡状态和动画效果的关键部分。留意到它们分为两种类型:进场钩子函数和出场钩子函数。接下来将详细阐述每个钩子函数的作用。
1.2.1 进场钩子函数
进场钩子函数是进场动画过程中发生时执行的函数。通常情况下,整个进场过程是由v-enter、v-enter-active和v-enter-to三部分构成的。
v-enter:该钩子函数用于定义进场动画开始前的状态(译者注:也就是初始状态)。它只被执行一次。
v-enter-active:该钩子函数用于定义进场动画过程中的状态。它会被反复执行,直到进场动画完成为止。
v-enter-to:该钩子函数用于定义进场动画完成后的状态。它只被执行一次。
下面是进场钩子函数的API格式:
definition: {
// ...
beforeEnter(el) {},
enter(el, done) {},
afterEnter(el) {},
enterCancelled(el) {}
}
1.2.2 出场钩子函数
出场钩子函数是出场动画过程中发生时执行的函数。通常情况下,整个出场过程是由v-leave、v-leave-active和v-leave-to三部分构成的。
v-leave:该钩子函数用于定义出场动画开始前的状态。它只被执行一次。
v-leave-active:该钩子函数用于定义出场动画过程中的状态。它会被反复执行,直到出场动画完成为止。
v-leave-to:该钩子函数用于定义出场动画完成后的状态。它只被执行一次。
下面是出场钩子函数的API格式:
definition: {
// ...
beforeLeave(el) {},
leave(el, done) {},
afterLeave(el) {},
leaveCancelled(el) {}
}
2. 实现元素过渡效果
为了更好地演示Vue.transition函数的具体使用方法,接下来将实现一个简单的元素过渡效果,实现方案如下:
鼠标移上去时展开更多内容
使用Vue.transition函数实现元素进场和出场动画
2.1 模板部分
首先,我们先来编写HTML代码:
<!-- HTML代码 -->
<div id="app">
<p
class="text"
@mouseover="isMouseover = true"
@mouseleave="isMouseover = false">
我是一条测试数据
</p>
<transition
name="fade"
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@enter-cancelled="enterCancelled"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
@leave-cancelled="leaveCancelled">
<p
v-if="isMouseover"
class="text-detail">
我是更多内容
</p>
</transition>
</div>
这里定义了一个ID为“app”的DOM容器,并在其中定义了两个<p>元素:一个用于显示数据,一个用于显示更多详情。其中,<p>元素的CSS类分别为“text”和“text-detail”。
2.2 样式部分
接下来,让我们为这两个<p>元素设定样式:
/* CSS代码 */
.text {
padding: 10px;
background-color: #f44336;
color: #ffffff;
cursor: pointer;
}
.text-detail {
padding: 10px;
background-color: #2196f3;
color: #ffffff;
}
2.3 JavaScript代码部分
最后,让我们来编写JavaScript代码:
// JavaScript代码
new Vue({
el: "#app",
data: {
isMouseover: false
},
methods: {
beforeEnter(el) {
el.style.opacity = 0
},
enter(el, done) {
Velocity(el, { opacity: 1 }, { duration: 500, complete: done })
},
afterEnter(el) {
console.log("afterEnter")
},
enterCancelled(el) {
console.log("enterCancelled")
},
beforeLeave(el) {
el.style.opacity = 1
},
leave(el, done) {
Velocity(el, { opacity: 0 }, { duration: 500, complete: done })
},
afterLeave(el) {
console.log("afterLeave")
},
leaveCancelled(el) {
console.log("leaveCancelled")
}
}
})
这里,我们定义了Vue实例,其el选项指向之前在HTML中定义的ID为“app”的容器。数据部分isMouseover用于判定鼠标是否移到元素上,方法部分包含了beforeEnter、enter、afterEnter、enterCancelled、beforeLeave、leave、afterLeave和leaveCancelled八个钩子函数,分别用于控制元素的进场和出场动画效果。这里我们引用了Velocity.js动画库来实现过渡效果,不仅速度更快,而且支持触摸时的动画效果。
2.4 完整演示
现在,通过运行上述代码,我们就可以在Web页面中看到一个具有进场和出场动画效果的元素,鼠标移到它上面时会弹出更多内容:
<div id="app-demo">
<p
class="text"
@mouseover="isMouseover = true"
@mouseleave="isMouseover = false">
我是一条测试数据
<transition
name="fade"
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@enter-cancelled="enterCancelled"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
@leave-cancelled="leaveCancelled">
v-if="isMouseover"
class="text-detail">
我是更多内容
</transition>
</div>
<style>
/* 演示样式 */
.fade-enter-active,
.fade-leave-active {
position: absolute;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/velocity/2.0.5/velocity.js"></script>
<script>
// JavaScript代码
new Vue({
el: "#app-demo",
data: {
isMouseover: false
},
methods: {
beforeEnter(el) {
el.style.opacity = 0
},
enter(el, done) {
Velocity(el, { opacity: 1 }, { duration: 500, complete: done })
},
afterEnter(el) {
console.log("afterEnter")
},
enterCancelled(el) {
console.log("enterCancelled")
},
beforeLeave(el) {
el.style.opacity = 1
},
leave(el, done) {
Velocity(el, { opacity: 0 }, { duration: 500, complete: done })
},
afterLeave(el) {
console.log("afterLeave")
},
leaveCancelled(el) {
console.log("leaveCancelled")
}
}
})
</script>