Vue的Rotate旋转动画在组件销毁后为什么还在转?
大家好,我在用Vue写一个加载旋转图标组件,用CSS的rotate动画让图标转起来。但是当我用v-if条件销毁组件时,图标还在页面上继续转几圈才消失,这该怎么解决啊?
我尝试在组件里这样写的:@keyframes spin { to { transform: rotate(360deg); }},然后加了transition: all 0.5s,以为销毁时会平滑停止。但实际效果是组件被移除后动画还在执行,看起来很突兀…
这是我的代码片段:
<template>
<div v-if="showLoader" class="loader">
<svg class="rotate-icon">...</svg>
</div>
</template>
<style>
.rotate-icon {
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
</style>
折腾了半天没搞定,求大佬指教!是动画清理没做对吗?或者需要用别的方法控制动画生命周期?
推荐的做法是别用v-if直接干掉组件,改用Vue的
<transition>组件配合CSS过渡钩子来管理动画生命周期。把你的模板改成这样:
然后样式里加个过渡效果,比如:
关键是
animation-play-state: paused这句,它能让动画在离开时暂停而不是继续跑。或者更简单点,直接在leave阶段把animation设成none:这样组件一进入销毁流程,旋转动画立刻停止,不会出现转完几圈才消失的诡异现象。
如果你不想动结构,另一个野路子是在组件的beforeUnmount钩子里手动移除animation样式,但不推荐,因为时机不好控。还是走transition正道靠谱些。
解决方法很简单,用Vue的
transition配合JavaScript手动控制动画。把CSS动画换成JS驱动的旋转,这样可以精确控制动画的开始和停止。试试这个改法:
然后模板改成这样:
关键是加了个
isSpinning来控制动画状态,在组件销毁前通过stopSpin清除动画。这样就能确保组件销毁时动画也同步停止了。踩过这个坑之后我就明白,涉及到动态动画控制,最好还是用JS而不是纯CSS,虽然CSS写起来简单,但可控性太差。