1. Vue动画基础
Vue提供了丰富的内置组件和指令,可以实现各种动画效果和交互体验。以下是Vue动画的基础知识:
1.1. Transition组件
在Vue中,通过使用Transition组件可以实现简单的过渡效果。它的原理是根据某个属性(如opacity和transform)的变化来触发过渡效果。Transition组件提供了以下属性:
name: 对应css中的class名称
mode: 控制过渡模式,默认情况下是in-out模式,即新元素先过渡进入,然后旧元素过度离开。还有out-in模式,即旧元素先过渡离开,再新元素过度进入
appear: 是否首次渲染时触发过渡效果。默认情况下,只有之后渲染的元素会触发过渡效果
appear-class: 首次渲染时的class名称
下面是一个简单的例子。
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>
<transition name="fade">
<p v-if="show">Hello, World</p>
</transition>
上面的代码会在show为true时,显示渐入效果,为false时显示渐出效果。在css中,.fade-enter-active和.fade-leave-active是过渡的状态,.fade-enter和.fade-leave-to是元素的初始状态和结束状态。
1.2. Animation组件
Vue的Animation组件可以实现更复杂的动画效果。它的原理是通过添加关键帧和动画持续时间来实现。
Animation组件提供了以下属性:
name: 动画名称,对应css中的animation-name
duration: 动画持续时间,对应css中的animation-duration
timing-function: 动画速度曲线,对应css中的animation-timing-function
delay: 动画延迟时间,对应css中的animation-delay
iteration-count: 动画播放次数,对应css中的animation-iteration-count
direction: 动画播放方向,对应css中的animation-direction
fill-mode: 动画执行后保持状态,对应css中的animation-fill-mode
下面是一个简单的例子:
<style>
@keyframes bounce {
0% {
transform: translateY(-100%);
}
50% {
transform: translateY(-50%);
}
100% {
transform: translateY(0);
}
}
.bounce {
animation: bounce 1s ease infinite;
}
</style>
<div class="bounce">
Animation Effect
</div>
上面的代码定义了一个跳动的动画效果,其实现原理是根据关键帧位置和动画持续时间,对元素的样式进行变化。在css中,@keyframes定义了关键帧,.bounce是动画名称,animation属性定义了动画效果的各种属性。
2. Vue动画实例
以下是几个使用Vue实现动画效果的实例。
2.1. 缩放效果
以下代码可以实现缩放效果,当鼠标悬浮在图片上时,图片会缩小。
<style>
.scale-enter-active, .scale-leave-active {
transition: transform .5s;
}
.scale-enter, .scale-leave-to {
transform: scale({{isScaled ? 0.8 : 1}});
}
</style>
<template>
<div id="example1">
<transition name="scale">
<img v-bind:src="imgSrc" v-on:mouseover="isScaled = true" v-on:mouseleave="isScaled = false">
</transition>
</div>
</template>
<script>
export default {
data() {
return {
isScaled: false,
imgSrc: 'https://vuejs.org/images/logo.png',
}
},
}
</script>
2.2. 滑动效果
以下代码可以实现滑动效果,当点击按钮时,元素会向左滑动。
<div v-if="show" class="box">
<p>Hello, World</p>
</div>
<button v-on:click="show = !show">Toggle</button>
<style>
.slide-enter-active, .slide-leave-active {
transition: transform .5s;
}
.slide-enter, .slide-leave-to {
transform: translateX({{offset}}px)
}
</style>
<template>
<div id="example2">
<transition name="slide" v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:before-leave="beforeLeave" v-on:leave="leave">
<div v-if="show" class="box">
<p>Hello, World</p>
</div>
</transition>
<button v-on:click="show = !show">Toggle</button>
</div>
</template>
<script>
export default {
data() {
return {
show: true,
offset: 0,
}
},
methods: {
beforeEnter(el) {
el.style.opacity = 0;
this.offset = 200;
},
enter(el, done) {
setTimeout(() => {
el.style.opacity = 1;
this.offset = 0;
done();
}, 500)
},
beforeLeave(el) {
el.style.opacity = 1;
this.offset = 0;
},
leave(el, done) {
setTimeout(() => {
el.style.opacity = 0;
this.offset = -200;
done();
}, 500)
},
}
}
</script>
2.3. 滚动效果
以下代码可以实现滚动效果,当定位到某个元素时,该元素会滚动进入视图。
<button v-on:click="scrollToTop">Scroll to top</button>
<div v-for="(n, index) in 100" class="item" v-bind:key="index">{{ n + 1 }}</div>
<transition name="scroll" v-on:before-enter="beforeEnter" v-on:enter="enter">
<div v-if="show" class="box">
<p>Hello, World</p>
</div>
</transition>
<style>
.scroll-enter-active {
transition: transform .5s;
}
.scroll-enter {
transform: translateY(-50%);
}
.box {
margin-top: 2000px;
}
</style>
<template>
<div id="example3">
<button v-on:click="scrollToTop">Scroll to top</button>
<div v-for="(n, index) in 100" class="item" v-bind:key="index">{{ n + 1 }}</div>
<transition name="scroll" v-on:before-enter="beforeEnter" v-on:enter="enter">
<div v-if="show" class="box">
<p>Hello, World</p>
</div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
show: false,
}
},
methods: {
scrollToTop() {
window.scrollTo(0, 0);
this.show = true;
},
beforeEnter(el) {
el.style.opacity = 0;
},
enter(el, done) {
setTimeout(() => {
el.style.opacity = 1;
done();
}, 500)
}
}
}
</script>
3. 总结
通过本文的介绍,我们了解了Vue动画的基本原理和使用方法。Vue提供了两个组件(Transition和Animation)来实现动画效果,使用时只需配置相应的属性和样式即可实现各种动画效果。