过渡类名

Vue 在过渡过程中会自动添加和移除 CSS 类名。理解这 6 个类名是掌握 Vue 过渡系统的基础。

类名详解

进入过渡

v-enter        → 进入的开始状态
v-enter-active → 进入的过渡状态
v-enter-to     → 进入的结束状态

离开过渡

v-leave        → 离开的开始状态
v-leave-active → 离开的过渡状态
v-leave-to     → 离开的结束状态

类名切换时机

以进入过渡为例:

时间线:
├── 元素插入
├── 添加 v-enter
├── 添加 v-enter-active
├── 下一帧:移除 v-enter,添加 v-enter-to
├── 过渡完成
├── 移除 v-enter-active
└── 移除 v-enter-to

基本示例

<div id="app">
  <button @click="show = !show">切换</button>
  
  <transition name="fade">
    <p v-if="show" class="content">Hello Vue!</p>
  </transition>
</div>

<style>
.fade-enter {
  opacity: 0;
}

.fade-enter-active {
  transition: opacity 0.5s;
}

.fade-enter-to {
  opacity: 1;
}

.fade-leave {
  opacity: 1;
}

.fade-leave-active {
  transition: opacity 0.5s;
}

.fade-leave-to {
  opacity: 0;
}
</style>

<script>
new Vue({
  el: '#app',
  data: {
    show: true
  }
})
</script>

简化写法

通常 v-enterv-leave-to 是相同的状态,v-enter-tov-leave 也是:

.fade-enter, .fade-leave-to {
  opacity: 0;
}

.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}

这样只需要写两段 CSS。

自定义类名

如果需要自定义类名(比如配合 Animate.css),可以这样:

<transition
  enter-active-class="animated bounceIn"
  leave-active-class="animated bounceOut"
>
  <p v-if="show">Hello</p>
</transition>

可自定义的属性:

  • enter-class
  • enter-active-class
  • enter-to-class
  • leave-class
  • leave-active-class
  • leave-to-class

滑动效果示例

<style>
.slide-enter, .slide-leave-to {
  transform: translateX(-100%);
  opacity: 0;
}

.slide-enter-active, .slide-leave-active {
  transition: all 0.3s ease;
}

.slide-enter-to, .slide-leave {
  transform: translateX(0);
  opacity: 1;
}
</style>

缩放效果示例

<style>
.scale-enter {
  transform: scale(0);
  opacity: 0;
}

.scale-enter-active {
  transition: all 0.3s ease-out;
}

.scale-enter-to {
  transform: scale(1);
  opacity: 1;
}

.scale-leave {
  transform: scale(1);
  opacity: 1;
}

.scale-leave-active {
  transition: all 0.3s ease-in;
}

.scale-leave-to {
  transform: scale(0);
  opacity: 0;
}
</style>

组合效果

多个属性同时过渡:

.combo-enter, .combo-leave-to {
  opacity: 0;
  transform: translateY(20px) scale(0.9);
}

.combo-enter-active, .combo-leave-active {
  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}

不同过渡时间

进入和离开可以使用不同的过渡时间:

.fade-enter-active {
  transition: opacity 0.3s;
}

.fade-leave-active {
  transition: opacity 1s;
}

离开时动画更慢,给用户更多时间看清内容。

过渡曲线

使用不同的 timing function 创造不同效果:

.bounce-enter-active {
  transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

.elastic-enter-active {
  transition: all 0.8s cubic-bezier(0.68, -0.6, 0.32, 1.6);
}

注意事项

常见问题:

  1. 类名前缀<transition name="fade"> 对应 fade-enter,没有 name 时默认 v-enter

  2. 过渡不生效:确保设置了 transition 属性,并且开始和结束状态不同

  3. display: none:过渡期间不要设置 display: none,会打断过渡

实用技巧

延迟过渡

.delay-leave-active {
  transition: all 0.5s 0.2s;
}

交错动画

.stagger-enter-active {
  transition: all 0.5s;
}

.stagger-enter:nth-child(1) { transition-delay: 0.1s; }
.stagger-enter:nth-child(2) { transition-delay: 0.2s; }
.stagger-enter:nth-child(3) { transition-delay: 0.3s; }

理解过渡类名后,你就可以创建各种过渡效果了。