技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • Vue2 基础

    • Vue 学习指南
    • Vue2 快速入门
    • Vue2 模板语法
    • Vue2 组件基础
    • Vue2 计算属性与侦听器
    • Vue2 生命周期
  • Vue2 进阶

    • Vue2 组件通信
    • Vue2 插槽详解
    • Vue2 混入与自定义指令
    • Vue2 过渡与动画
    • Vuex 状态管理
  • Vue2 高级

    • Vue2 性能优化
    • Vue2 服务端渲染(SSR)
    • Vue2 源码解析
  • Vue3 基础

    • Vue3 快速入门
    • Vue3 Composition API
    • Vue3 响应式系统
    • Vue3 组件基础
    • Vue3 生命周期
  • Vue3 进阶

    • Vue3 组合式函数
    • Vue3 组件通信
    • Vue3 Teleport 与 Suspense
    • Pinia 状态管理
    • Vue Router 4
  • Vue3 高级

    • Vue3 TypeScript
    • Vue3 性能优化
    • Vue3 测试
    • Vue3 SSR
    • Vue3 源码解析
  • 实战项目

    • Vue2 实战项目
    • Vue3 实战项目
    • Vue2 迁移 Vue3

Vue2 过渡与动画

单元素/组件过渡

基本用法

<transition name="fade">
  <p v-if="show">hello</p>
</transition>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

过渡类名

  • v-enter:进入过渡的开始状态
  • v-enter-active:进入过渡生效时的状态
  • v-enter-to:进入过渡的结束状态
  • v-leave:离开过渡的开始状态
  • v-leave-active:离开过渡生效时的状态
  • v-leave-to:离开过渡的结束状态

CSS 动画

<transition name="bounce">
  <p v-if="show">Lorem ipsum</p>
</transition>

<style>
.bounce-enter-active {
  animation: bounce-in .5s;
}
.bounce-leave-active {
  animation: bounce-in .5s reverse;
}
@keyframes bounce-in {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(1.5);
  }
  100% {
    transform: scale(1);
  }
}
</style>

自定义过渡类名

<transition
  name="custom"
  enter-active-class="animated fadeIn"
  leave-active-class="animated fadeOut"
>
  <p v-if="show">hello</p>
</transition>

JavaScript 钩子

<transition
  @before-enter="beforeEnter"
  @enter="enter"
  @after-enter="afterEnter"
  @enter-cancelled="enterCancelled"
  @before-leave="beforeLeave"
  @leave="leave"
  @after-leave="afterLeave"
  @leave-cancelled="leaveCancelled"
>
</transition>
methods: {
  beforeEnter(el) {
    el.style.opacity = 0
  },
  enter(el, done) {
    el.offsetWidth // 触发重绘
    el.style.transition = 'opacity 1s'
    el.style.opacity = 1
    done()
  },
  afterEnter(el) {
    console.log('enter completed')
  }
}

初始渲染过渡

<transition appear>
  <div>hello</div>
</transition>

多元素过渡

<transition name="fade" mode="out-in">
  <button v-if="isEditing" key="save">
    Save
  </button>
  <button v-else key="edit">
    Edit
  </button>
</transition>

列表过渡

<transition-group name="list" tag="ul">
  <li v-for="item in items" :key="item.id">
    {{ item.text }}
  </li>
</transition-group>

<style>
.list-enter-active, .list-leave-active {
  transition: all 1s;
}
.list-enter, .list-leave-to {
  opacity: 0;
  transform: translateY(30px);
}
.list-move {
  transition: transform 1s;
}
</style>

实际应用

路由过渡

<transition name="fade" mode="out-in">
  <router-view></router-view>
</transition>

模态框过渡

<transition name="modal">
  <div v-if="showModal" class="modal-mask">
    <div class="modal-wrapper">
      <div class="modal-container">
        <slot></slot>
      </div>
    </div>
  </div>
</transition>

<style>
.modal-enter-active, .modal-leave-active {
  transition: opacity .3s;
}
.modal-enter, .modal-leave-to {
  opacity: 0;
}
.modal-enter-active .modal-container,
.modal-leave-active .modal-container {
  transition: transform .3s;
}
.modal-enter .modal-container,
.modal-leave-to .modal-container {
  transform: scale(1.1);
}
</style>
最近更新: 2026/1/27 15:51
Contributors: hailong
Prev
Vue2 混入与自定义指令
Next
Vuex 状态管理