指南
基础
- 安装
- 介绍
- Vue 实例
- 模板语法
- 计算属性和侦听器
- 类和样式绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
组件深入
- 组件注册
- Props
- 自定义事件
- 插槽
- 动态和异步组件
- 处理边缘情况
过渡和动画
- 进入/离开和列表过渡
- 状态过渡
可重用性和组合
- 混合
- 自定义指令
- 渲染函数和 JSX
- 插件
- 过滤器
工具
- 单文件组件
- 测试
- TypeScript 支持
- 生产部署
扩展
- 路由
- 状态管理
- 服务器端渲染
- 安全
内部机制
- 深入响应性
迁移
- 从 Vue 1.x 迁移
- 从 Vue Router 0.7.x 迁移
- 从 Vuex 0.6.x 迁移到 1.0
- 迁移到 Vue 2.7
元数据
- 与其他框架比较
- 加入 Vue.js 社区!
- 认识团队
进入/离开和列表过渡
概述
Vue 提供了多种方法,可以在 DOM 中插入、更新或删除项目时应用过渡效果。这包括用于
- 自动应用 CSS 过渡和动画的类
- 集成第三方 CSS 动画库,例如 Animate.css
- 使用 JavaScript 在过渡钩子期间直接操作 DOM
- 集成第三方 JavaScript 动画库,例如 Velocity.js
在本页中,我们只介绍进入、离开和列表过渡,但您可以在下一节中查看 管理状态过渡。
单个元素/组件的过渡
Vue 提供了一个 transition
包装组件,允许您在以下情况下为任何元素或组件添加进入/离开过渡
- 条件渲染(使用
v-if
) - 条件显示(使用
v-show
) - 动态组件
- 组件根节点
这是一个实际操作的示例
|
|
|
你好
当用 transition
组件包装的元素被插入或删除时,会发生以下情况
Vue 会自动嗅探目标元素是否应用了 CSS 过渡或动画。如果有,CSS 过渡类将在适当的时间添加/删除。
如果过渡组件提供了 JavaScript 钩子,这些钩子将在适当的时间被调用。
如果没有检测到 CSS 过渡/动画,并且没有提供 JavaScript 钩子,则插入和/或删除的 DOM 操作将在下一帧立即执行(注意:这是浏览器动画帧,不同于 Vue 的
nextTick
概念)。
过渡类
为进入/离开过渡应用了六个类。
v-enter
:进入的起始状态。在元素插入之前添加,在元素插入后一帧删除。v-enter-active
:进入的活动状态。在整个进入阶段应用。在元素插入之前添加,在过渡/动画完成时删除。此类可用于定义进入过渡的持续时间、延迟和缓动曲线。v-enter-to
:仅在 2.1.8+ 版本中可用。 进入的结束状态。在元素插入后一帧添加(与v-enter
删除同时),在过渡/动画完成时删除。v-leave
:离开的起始状态。在离开过渡触发时立即添加,在下一帧后删除。v-leave-active
:离开的活动状态。在整个离开阶段应用。在离开过渡触发时立即添加,在过渡/动画完成时删除。此类可用于定义离开过渡的持续时间、延迟和缓动曲线。v-leave-to
:仅在 2.1.8+ 版本中可用。 离开的结束状态。在离开过渡触发后一帧添加(与v-leave
删除同时),在过渡/动画完成时删除。
这些类中的每一个都将以过渡的名称为前缀。这里 v-
前缀是使用没有名称的 <transition>
元素时的默认值。例如,如果您使用 <transition name="my-transition">
,则 v-enter
类将变为 my-transition-enter
。
v-enter-active
和 v-leave-active
使您能够为进入/离开过渡指定不同的缓动曲线,您将在下一节中看到一个示例。
CSS 过渡
最常见的过渡类型之一是使用 CSS 过渡。以下是一个示例
|
|
|
你好
CSS 动画
CSS 动画的应用方式与 CSS 过渡相同,不同之处在于 v-enter
不会在元素插入后立即删除,而是在 animationend
事件上删除。
以下是一个示例,为了简洁起见,省略了带前缀的 CSS 规则
|
|
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
自定义过渡类
您还可以通过提供以下属性来指定自定义过渡类
enter-class
enter-active-class
enter-to-class
(2.1.8+)leave-class
leave-active-class
leave-to-class
(2.1.8+)
这些将覆盖传统的类名。当您想将 Vue 的过渡系统与现有的 CSS 动画库(例如 Animate.css)结合使用时,这特别有用。
以下是一个示例
|
|
你好
使用过渡和动画
Vue 需要附加事件监听器才能知道过渡何时结束。它可以是 transitionend
或 animationend
,具体取决于应用的 CSS 规则类型。如果您只使用其中一个,Vue 可以自动检测正确的类型。
但是,在某些情况下,您可能希望在同一个元素上同时使用两者,例如让 Vue 触发 CSS 动画,并在悬停时使用 CSS 过渡效果。在这些情况下,您必须在 type
属性中显式声明您希望 Vue 关注的类型,其值为 animation
或 transition
。
显式过渡持续时间
2.2.0+ 中的新功能
在大多数情况下,Vue 可以自动确定过渡何时结束。默认情况下,Vue 等待根过渡元素上的第一个 transitionend
或 animationend
事件。但是,这并不总是理想的 - 例如,我们可能有一个编排的过渡序列,其中一些嵌套的内部元素具有延迟的过渡或比根过渡元素更长的过渡持续时间。
在这种情况下,您可以使用 <transition>
组件上的 duration
道具来指定显式过渡持续时间(以毫秒为单位)
|
您还可以为进入和离开持续时间指定单独的值
|
JavaScript 钩子
您也可以在属性中定义 JavaScript 钩子
|
|
这些钩子可以与 CSS 过渡/动画结合使用,也可以单独使用。
当仅使用 JavaScript 过渡时,enter
和 leave
钩子需要 done
回调。否则,钩子将同步调用,过渡将立即完成。
对于仅使用 JavaScript 的过渡,最好显式添加 v-bind:css="false"
,以便 Vue 可以跳过 CSS 检测。这也防止 CSS 规则意外干扰过渡。
现在让我们深入了解一个示例。以下是一个使用 Velocity.js 的 JavaScript 过渡
|
|
演示
初始渲染时的过渡
如果您还想在节点的初始渲染时应用过渡,可以添加 appear
属性
|
默认情况下,这将使用为进入和离开指定的过渡。但是,如果您愿意,也可以指定自定义 CSS 类
|
以及自定义 JavaScript 钩子
|
在上面的示例中,appear
属性或 v-on:appear
钩子都会导致出现过渡。
元素之间的过渡
我们将在后面讨论 组件之间的过渡,但您也可以使用 v-if
/v-else
在原始元素之间进行过渡。最常见的两个元素过渡之一是在列表容器和描述空列表的消息之间进行过渡
|
这很有效,但需要注意一个问题
当在具有相同标签名称的元素之间切换时,您必须告诉 Vue 它们是不同的元素,方法是为它们提供唯一的 key
属性。否则,为了效率,Vue 的编译器只会替换元素的内容。即使在技术上没有必要,始终在 <transition>
组件中为多个项目添加键也是最佳实践。
例如
|
在这些情况下,您也可以使用 `key` 属性在同一个元素的不同状态之间进行过渡。上面的示例可以改写为以下形式,而不是使用 `v-if` 和 `v-else`。
|
实际上,可以通过使用多个 `v-if` 或将单个元素绑定到动态属性来在任意数量的元素之间进行过渡。例如
|
也可以写成
|
|
过渡模式
不过,仍然存在一个问题。尝试点击下面的按钮
在“on”按钮和“off”按钮之间进行过渡时,两个按钮都会被渲染 - 一个过渡出去,另一个过渡进来。这是 `<transition>` 的默认行为 - 进入和离开同时发生。
有时这非常有效,例如当过渡项目绝对定位在彼此之上时
然后也许还可以翻译成看起来像滑动过渡
但是,同时进入和离开过渡并不总是理想的,因此 Vue 提供了一些替代的 **过渡模式**
in-out
:新元素先过渡进来,然后在完成时,当前元素过渡出去。out-in
:当前元素先过渡出去,然后在完成时,新元素过渡进来。
现在,让我们使用 `out-in` 更新 on/off 按钮的过渡
|
只需添加一个属性,我们就修复了原始过渡,而无需添加任何特殊样式。
in-out
模式并不常用,但有时对于稍微不同的过渡效果可能很有用。让我们尝试将其与之前使用的滑动淡入淡出过渡结合起来
很酷,对吧?
组件之间的过渡
组件之间的过渡更加简单 - 我们甚至不需要 `key` 属性。相反,我们包装一个 动态组件
|
|
|
列表过渡
到目前为止,我们已经为以下内容管理了过渡
- 单个节点
- 多个节点,其中一次只渲染一个节点
那么,当我们想要同时渲染一整列项目时,例如使用 `v-for`,该怎么办?在这种情况下,我们将使用 `<transition-group>` 组件。在我们深入研究示例之前,有一些关于此组件的重要事项需要了解
- 与 `<transition>` 不同,它渲染一个实际的元素:默认情况下为 `<span>`。您可以使用 `tag` 属性更改渲染的元素。
- 过渡模式不可用,因为我们不再在互斥元素之间交替。
- 内部的元素 **始终需要** 具有唯一的 `key` 属性。
- CSS 过渡类将应用于内部元素,而不是应用于组/容器本身。
列表进入/离开过渡
现在,让我们深入研究一个示例,使用之前使用的相同 CSS 类来过渡进入和离开
|
|
|
此示例存在一个问题。当您添加或删除项目时,周围的项目会立即跳到它们的新位置,而不是平滑过渡。我们将在稍后修复这个问题。
列表移动过渡
<transition-group>
组件还有另一个技巧。它不仅可以动画化进入和离开,还可以动画化位置变化。使用此功能您需要了解的唯一新概念是添加 **`v-move` 类**,该类在项目更改位置时添加。与其他类一样,它的前缀将与提供的 `name` 属性的值匹配,您也可以使用 `move-class` 属性手动指定一个类。
此类主要用于指定过渡时间和缓动曲线,如下所示
|
|
|
这可能看起来很神奇,但在幕后,Vue 使用了一种称为 FLIP 的动画技术,使用变换将元素从旧位置平滑过渡到新位置。
我们可以将此技术与之前的实现结合起来,为列表的每种可能的变化制作动画!
|
|
|
需要注意的是,这些 FLIP 过渡不适用于设置为 `display: inline` 的元素。作为替代方案,您可以使用 `display: inline-block` 或将元素放置在 flex 上下文中。
这些 FLIP 动画也不限于单个轴。多维网格中的项目也可以 过渡
不断点击洗牌按钮,直到你获胜。
交错列表过渡
通过数据属性与 JavaScript 过渡进行通信,也可以在列表中交错过渡
|
|
可重用过渡
过渡可以通过 Vue 的组件系统重复使用。要创建可重用过渡,您只需将 `<transition>` 或 `<transition-group>` 组件放在根部,然后将任何子元素传递到过渡组件中。
以下是一个使用模板组件的示例
|
并且 函数式组件特别适合此任务
|
动态过渡
是的,即使 Vue 中的过渡也是数据驱动的!动态过渡最基本的示例将 `name` 属性绑定到动态属性。
|
当您使用 Vue 的过渡类约定定义了 CSS 过渡/动画,并且想要在它们之间切换时,这很有用。
实际上,任何过渡属性都可以动态绑定。而且不仅仅是属性。由于事件钩子是方法,因此它们可以访问上下文中的任何数据。这意味着根据组件的状态,您的 JavaScript 过渡可以表现出不同的行为。
|
|
hello
最后,创建动态过渡的终极方法是通过组件,这些组件接受道具来更改要使用的过渡的性质。这听起来可能很俗套,但唯一的限制实际上是你的想象力。