From 76ef5f7e5b3b7731a57e410c1de28d4a1a4de894 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Sat, 21 Jun 2025 23:06:10 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Vue2=20Transition=20=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E7=B3=BB=E7=BB=9F=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vue2-tutorials/single-file/demo2/src/App.vue | 8 +- .../demo10/Vue2 Transition 动画系统详解.md | 175 ++++++++++++++++++ .../demo2/src/views/demo10/index.vue | 52 ++++++ 3 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo10/Vue2 Transition 动画系统详解.md create mode 100644 vue2-tutorials/single-file/demo2/src/views/demo10/index.vue diff --git a/vue2-tutorials/single-file/demo2/src/App.vue b/vue2-tutorials/single-file/demo2/src/App.vue index b34bd10..4f36dbb 100644 --- a/vue2-tutorials/single-file/demo2/src/App.vue +++ b/vue2-tutorials/single-file/demo2/src/App.vue @@ -9,7 +9,8 @@ - + + @@ -21,11 +22,12 @@ // import Demo5 from "@/views/demo5/index.vue"; // import Todo from "@/views/todo/index.vue"; // import Demo8 from "@/views/demo8/index.vue"; -import Demo9 from "@/views/demo9/index.vue"; +// import Demo9 from "@/views/demo9/index.vue"; +import Demo10 from "@/views/demo10/index.vue"; export default { name: "App", // components: { Demo1, Demo2, Demo3 }, - components: { Demo9 }, + components: { Demo10 }, }; diff --git a/vue2-tutorials/single-file/demo2/src/views/demo10/Vue2 Transition 动画系统详解.md b/vue2-tutorials/single-file/demo2/src/views/demo10/Vue2 Transition 动画系统详解.md new file mode 100644 index 0000000..b938725 --- /dev/null +++ b/vue2-tutorials/single-file/demo2/src/views/demo10/Vue2 Transition 动画系统详解.md @@ -0,0 +1,175 @@ +# Vue2 Transition 动画系统详解 + +## 一、基本动画实现 + +### 1. Transition 组件核心用法 +```html + +
内容
+
+``` + +| 属性 | 说明 | 示例值 | +| -------- | -------------------- | -------- | +| `name` | 动画类名前缀 | "bunny" | +| `appear` | 初始渲染是否应用动画 | true | +| `mode` | 过渡模式 | "out-in" | + +### 2. 动画类名系统 +```css +/* 进入动画 */ +.bunny-enter-active { /* 激活阶段样式 */ } +.bunny-enter { /* 开始状态 */ } +.bunny-enter-to { /* 结束状态 */ } + +/* 离开动画 */ +.bunny-leave-active { /* 激活阶段样式 */ } +.bunny-leave { /* 开始状态 */ } +.bunny-leave-to { /* 结束状态 */ } +``` + +## 二、动画效果进阶 + +### 1. CSS 动画实现 +```css +/* 关键帧动画 */ +@keyframes slip { + from { transform: translateX(-100%); } + to { transform: translateX(0); } +} + +.bunny-enter-active { + animation: slip 0.5s ease-out; +} + +.bunny-leave-active { + animation: slip 0.5s ease-in reverse; +} +``` + +### 2. 过渡效果实现 +```css +/* 过渡效果 */ +.bunny-enter-active, .bunny-leave-active { + transition: all 0.5s cubic-bezier(0.68, -0.55, 0.27, 1.55); +} + +.bunny-enter, .bunny-leave-to { + opacity: 0; + transform: scale(0.8); +} +``` + +## 三、最佳实践指南 + +### 1. 性能优化建议 +- 优先使用 `transform` 和 `opacity` 属性 +- 避免动画期间触发布局重排 +- 对移动设备减少动画持续时间 + +### 2. 动画调试技巧 +```css +/* 调试用边框 */ +.bunny-enter-active { + outline: 2px solid red; +} +``` + +### 3. 响应式动画方案 +```javascript +computed: { + animationDuration() { + return this.isMobile ? 300 : 500 + } +} +``` + +## 四、高级应用场景 + +### 1. 列表过渡 +```html + +
  • + {{ item.text }} +
  • +
    + + +``` + +### 2. 动态过渡 +```html + + + + + +``` + +### 3. JavaScript 钩子 +```html + + + + + +``` + +## 五、常见问题解决方案 + +1. **动画不生效排查**: + - 检查类名前缀是否匹配 + - 确认元素初始状态是否正确 + - 验证CSS属性是否可动画 + +2. **闪烁问题处理**: + ```css + .v-enter { + opacity: 0.01; /* 避免初始状态检测问题 */ + } + ``` + +3. **多元素过渡**: + ```html + +
    {{ currentView }}
    +
    + ``` + +## 六、与Vue3的对比 + +| 特性 | Vue2 | Vue3 | +| -------- | ---------------------- | ---------------- | +| 类名前缀 | `v-` 或自定义 | 相同 | +| 过渡模式 | 支持 `in-out`/`out-in` | 新增 `in-out-in` | +| 性能 | 基于CSS | 基于FLIP优化 | +| 新特性 | - | 过渡持久化 | + diff --git a/vue2-tutorials/single-file/demo2/src/views/demo10/index.vue b/vue2-tutorials/single-file/demo2/src/views/demo10/index.vue new file mode 100644 index 0000000..4ca312d --- /dev/null +++ b/vue2-tutorials/single-file/demo2/src/views/demo10/index.vue @@ -0,0 +1,52 @@ + + + + +