vue实现消息动画
Vue 实现消息动画的方法
使用 Vue Transition 组件
Vue 内置的 Transition 组件可以方便地实现进入/离开动画。适用于消息提示框、Toast 等组件的显示和隐藏动画。
<transition name="fade">
<div v-if="showMessage" class="message">
{{ messageText }}
</div>
</transition>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
使用 CSS 动画
通过 CSS @keyframes 定义动画效果,结合 Vue 的动态 class 绑定实现更复杂的动画效果。
<div
class="message"
:class="{ 'bounce': showMessage }"
>
{{ messageText }}
</div>
@keyframes bounce {
0% { transform: scale(0.8); opacity: 0; }
50% { transform: scale(1.1); }
100% { transform: scale(1); opacity: 1; }
}
.bounce {
animation: bounce 0.5s ease-out;
}
使用第三方动画库
引入动画库如 Animate.css 可以快速实现丰富的预设动画效果。
<transition
enter-active-class="animate__animated animate__bounceIn"
leave-active-class="animate__animated animate__bounceOut"
>
<div v-if="showMessage" class="message">
{{ messageText }}
</div>
</transition>
需要先安装 animate.css:
npm install animate.css
列表消息动画
对于消息列表,可以使用 TransitionGroup 实现逐个消息的动画效果。
<transition-group name="list" tag="ul">
<li v-for="(msg, index) in messages" :key="msg.id">
{{ msg.text }}
</li>
</transition-group>
.list-enter-active, .list-leave-active {
transition: all 0.5s;
}
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
使用 JavaScript 钩子
通过 JavaScript 钩子可以实现更复杂的动画逻辑,与 GSAP 等动画库结合使用。
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<div v-if="showMessage" class="message">
{{ messageText }}
</div>
</transition>
methods: {
beforeEnter(el) {
el.style.opacity = 0;
el.style.transform = 'translateY(-20px)';
},
enter(el, done) {
gsap.to(el, {
opacity: 1,
y: 0,
duration: 0.5,
onComplete: done
});
},
leave(el, done) {
gsap.to(el, {
opacity: 0,
y: 20,
duration: 0.5,
onComplete: done
});
}
}
消息队列动画
对于需要依次显示的消息队列,可以结合 Vue 的响应式特性和 setTimeout 实现顺序动画。
data() {
return {
messageQueue: [],
currentMessage: null
}
},
methods: {
addMessage(msg) {
this.messageQueue.push(msg);
if (!this.currentMessage) {
this.showNextMessage();
}
},
showNextMessage() {
if (this.messageQueue.length > 0) {
this.currentMessage = this.messageQueue.shift();
setTimeout(() => {
this.currentMessage = null;
this.showNextMessage();
}, 2000);
}
}
}






