Vue路由过渡动效
源链接:https://juejin.cn/post/6963205355702583303 (opens new window)
Vue 路由过渡是对 Vue 程序一种快速简便的增加个性化效果的的方法。 可以让你在程序的不同页面之间增加平滑的动画和过渡。如果使用得当,可以使你的程序显得更加专业,从而增强用户体验。
# 在 Vue 程序中添加路由
一般 Vue 路由设置如下所示:
<template>
<router-view />
</template>
2
3
在旧版本的 Vue 路由中,我们可以简单地用 <transition>
组件包装 <router-view>
。
但是,在较新版本的 Vue 路由中则必须用 v-slot
来解构 props 并将它们传递到我们的内部 slot 中。 这将包含一个动态组件,该组件被过渡组件包围。
<router-view v-slot="{ Component }">
<transition>
<component :is="Component" />
</transition>
</router-view>
2
3
4
5
# 为路由添加过渡
默认情况下,用 <transition>
包裹 <component>
会在你应用的每个路由上添加相同的过渡。
可以通过两种方式为每个路由自定义转场效果。
# 将过渡移到每个组件中
首先,不用把我们的动态组件与过渡组件包装在一起,可以将 <transition>
移动到每个单独的组件中。 像这样:
<template>
<transition>
<div class="wrapper">
<!-- -->
</div>
</transition>
</template>
2
3
4
5
6
7
依此类推,对要进行过渡的每条路由进行处理。 这样就可以通过修改过渡名称来自定义每条路由。
# 用 v-bind 进行动态过渡
另一个方法是将过渡的名称绑定到变量。 然后就可以根据自己的路有动态地修改这个变量。
这是 Vue 路由文档中的例子。在当前路由上用观察模式来动态设置 transitionName
变量。
<transition :name="transitionName">
<component :is="Component" />
</transition>
2
3
watch: {
'$route' (to, from) {
const toDepth = to.path.split('/').length
const fromDepth = from.path.split('/').length
this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
}
}
2
3
4
5
6
7
# 渐变过渡
渐变页面过渡应该是最直接的一种动效。可以通过修改元素的透明度来实现。
首先,创建一个名为 fade 过渡。需要注意的是过渡模式设置为 out-in
。
总共有 3 种过渡模式:
- default:淡入和淡出过渡同时发生
- in-out:新元素首先淡入。 然后当前元素淡出。
- out-in:当前元素先淡出。 然后新元素开始淡入。
为了使新元素顺利淡入,我们需要在开始新过渡之前将当前元素删除。所以必须用 mode = "out-in"
。
<router-view v-slot="{ Component }">
<transition name="fade" mode="out-in">
<component :is="Component" />
</transition>
</router-view>
2
3
4
5
<transition>
提供了几个 CSS 类,它们能够在动画周期中被动态添加或删除。
有 6 个不同的过渡类(3 个用于淡入,3 个用于淡出)。
v-enter
/v-leave
: 过渡的初始状态,过度开始后将其删除v-enter-active
/v-leave-active
: 过渡的激活状态v-enter-to
/v-leave-to
: 过渡的结束状态
我们的淡入淡出过渡有一个名为 fade-enter
的类。
我们希望淡入和淡出状态的透明度为 0。然后当过渡处于活动状态时,希望对透明度进行动画处理。
我们甚至不必将透明度设置为1,因为在动画制作过程中会删除 fade-enter
和 fade-leave-to
类。 这会使元素自己单独设置为默认透明度为 1 的动画。
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s ease;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
2
3
4
5
6
7
8
9
# 幻灯片过渡
模板将如下。 由于希望淡入和淡出过渡同时发生,所以我们不想为过渡设置特殊的模式。
<router-view v-slot="{ Component }">
<transition name="slide">
<component :is="Component" />
</transition>
</router-view>
2
3
4
5
为了使例子更容易理解,我把每个组件的宽度都设为100%,并占用至少 1 vh,还分别设置了背景色。
.wrapper {
width: 100%;
min-height: 100vh;
}
2
3
4
最后过渡样式将为要滑动组件的绝对位置设置动画。如果需要不同的滑动方向,只需更改要设置的CSS属性( top
, bottom
, left
, right
)。
.slide-enter-active,
.slide-leave-active {
transition: all 0.75s ease-out;
}
.slide-enter-to {
position: absolute;
right: 0;
}
.slide-enter {
position: absolute;
right: -100%;
}
.slide-leave-to {
position: absolute;
left: -100%;
}
.slide-leave {
position: absolute;
left: 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 缩放过渡
缩放过渡与渐变过渡非常相似。同样需要把模式设置为 out-in
,这样可以确保动画的正确顺序。
<router-view v-slot="{ Component }">
<transition name="scale" mode="out-in">
<component :is="Component" />
</transition>
</router-view>
2
3
4
5
然后用样式改变元素的透明度和 transform: scale
。
.scale-enter-active,
.scale-leave-active {
transition: all 0.5s ease;
}
.scale-enter,
.scale-leave-to {
opacity: 0;
transform: scale(0.9);
}
2
3
4
5
6
7
8
9
10
为了使这个过渡看上去更干净,可以把整个网页的背景色设置为黑色。
# 组合过渡
过渡的效果有很多很多,常用的做法是把一些基础的过渡结合在一起,例如把幻灯片和缩放合并为一个过渡。
<router-view v-slot="{ Component }">
<transition name="scale-slide">
<component :is="Component" />
</transition>
</router-view>
2
3
4
5
.scale-slide-enter-active,
.scale-slide-leave-active {
position: absolute;
transition: all 0.85s ease;
}
.scale-slide-enter {
left: -100%;
}
.scale-slide-enter-to {
left: 0%;
}
.scale-slide-leave {
transform: scale(1);
}
.scale-slide-leave-to {
transform: scale(0.8);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21