Vue实现路由过渡动效的4种方法

Vue 路由过渡是对 Vue 程序一种快速简便的增加个性化效果的的方法。 可以让你在程序的不同页面之间增加平滑的动画和过渡。如果使用得当,可以使你的程序显得更加专业,从而增强用户体验。

本文中会先介绍使用 Vue 路由过渡的基础知识,然后在举几个例子,为你一些灵感。下面是其中的一个案例:

在 Vue 程序中添加路由

一般 Vue 路由设置如下所示:

<template>
  <router-view />
</template>

在旧版本的 Vue 路由中,我们可以简单地用 <transition> 组件包装 <router-view>。

但是,在较新版本的 Vue 路由中则必须用 v-slot 来解构 props 并将它们传递到我们的内部 slot 中。 这将包含一个动态组件,该组件被过渡组件包围。

<router-view v-slot="{ Component }">
  <transition>
    <component :is="Component" />
  </transition>
</router-view>

为路由添加过渡

默认情况下,用 <transition> 包裹 <component> 会在你应用的每个路由上添加相同的过渡。
可以通过两种方式为每个路由自定义转场效果。

将过渡移到每个组件中

首先,不用把我们的动态组件与过渡组件包装在一起,可以将 <transition> 移动到每个单独的组件中。 像这样:

<template>
  <transition>
    <div class="wrapper">
      <!-- -->
    </div>
  </transition>
</template>

依此类推,对要进行过渡的每条路由进行处理。 这样就可以通过修改过渡名称来自定义每条路由。

用 v-bind 进行动态过渡

另一个方法是将过渡的名称绑定到变量。 然后就可以根据自己的路有动态地修改这个变量。
这是 Vue 路由文档中的例子。在当前路由上用观察模式来动态设置 transitionName 变量。

<transition :name="transitionName">
  <component :is="Component" />
</transition>
watch: {
  '$route' (to, from) {
    const toDepth = to.path.split('/').length
    const fromDepth = from.path.split('/').length
    this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
  }
}

现在我们了解了 Vue 路由过渡的基础知识,下面让来看一些例子。

#1 – 渐变过渡

渐变页面过渡应该是最直接的一种动效。可以通过修改元素的透明度来实现。
首先,创建一个名为 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>

<transition> 为提供了几个 CSS 类,它们能够在动画周期中被动态添加或删除。
有 6。个不同的过渡类(3 个用于淡入,3 个用于淡出)。

  • v-enter-from / v-leave-from: 过渡的初始状态,过度开始后将其删除
  • v-enter-active / v-leave-active: 过渡的激活状态
  • v-enter-to / v-leave-to: 过渡的结束状态

我们的淡入淡出过渡有一个名为 fade-enter-from 的类。

我们希望淡入和淡出状态的透明度为 0。然后当过渡处于活动状态时,希望对透明度进行动画处理。

我们甚至不必将透明度设置为1,因为在动画制作过程中会删除  fade-enter-from 和 fade-leave-to 类。 这会使元素自己单独设置为默认透明度为 1 的动画。

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

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

配合一些虚拟组件,这就是最终过渡效果。

#2 – 幻灯片过渡

下一个是页面幻灯片过渡。

模板将如下。 由于希望淡入和淡出过渡同时发生,所以我们不想为过渡设置特殊的模式。

<router-view v-slot="{ Component }">
  <transition name="slide">
    <component :is="Component" />
  </transition>
</router-view>

为了使例子更容易理解,我把每个组件的宽度都设为100%,并占用至少 1 vh,还分别设置了背景色。

.wrapper {
  width: 100%;
  min-height: 100vh;
}

最后过渡样式将为要滑动组件的绝对位置设置动画。如果需要不同的滑动方向,只需更改要设置的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-from {
  position: absolute;
  right: -100%;
}

.slide-leave-to {
  position: absolute;
  left: -100%;
}

.slide-leave-from {
  position: absolute;
  left: 0;
}

这是最终效果:

#3 – 缩放过渡

缩放过渡与渐变过渡非常相似。同样需要把模式设置为 out-in,这样可以确保动画的正确顺序。

<router-view v-slot="{ Component }">
  <transition name="scale" mode="out-in">
    <component :is="Component" />
  </transition>
</router-view>

然后用样式改变元素的透明度和 transform: scale。

.scale-enter-active,
.scale-leave-active {
  transition: all 0.5s ease;
}

.scale-enter-from,
.scale-leave-to {
  opacity: 0;
  transform: scale(0.9);
}

为了使这个过渡看上去更干净,可以把整个网页的背景色设置为黑色。

这是最终效果:

#4 – 组合过渡

过渡的效果有很多很多,常用的做法是把一些基础的过渡结合在一起,例如把幻灯片和缩放合并为一个过渡。

<router-view v-slot="{ Component }">
  <transition name="scale-slide">
    <component :is="Component" />
  </transition>
</router-view>
.scale-slide-enter-active,
.scale-slide-leave-active {
  position: absolute;
  transition: all 0.85s ease;
}

.scale-slide-enter-from {
  left: -100%;
}

.scale-slide-enter-to {
  left: 0%;
}

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

.scale-slide-leave-to {
  transform: scale(0.8);
}

这是最终效果

看上去还不错吧。

#5 – 写在最后

近期在提升 Vue 的过程中,发现一个高逼格的 Vue3+TS 教程

到此这篇关于Vue实现路由过渡动效的4种方法的文章就介绍到这了,更多相关Vue 路由过渡动效 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue 解决路由过渡动画抖动问题(实例详解)

    前言 Vue-Router 作为 Vue 的核心模块,它为我们提供了基于组件的路由配置.路由参数等功能,让单页面应用变得更易于管理.良好的路由管理尤为重要,比如路由拦截.路由懒加载.路由权限等都在开发中起着至关重要的作用.同时路由还支持视图过渡效果,没有添加过渡动画的路由切换会感觉很生硬,为了提高用户体验,路由过渡还是很有必要的.毕竟做出来,自己看着也舒服. 过渡动效文档:https://cn.vuejs.org/v2/guide/transitions.html 过渡动画抖动 代码片段 这里为

  • Vue实现路由过渡动效的4种方法

    Vue 路由过渡是对 Vue 程序一种快速简便的增加个性化效果的的方法. 可以让你在程序的不同页面之间增加平滑的动画和过渡.如果使用得当,可以使你的程序显得更加专业,从而增强用户体验. 本文中会先介绍使用 Vue 路由过渡的基础知识,然后在举几个例子,为你一些灵感.下面是其中的一个案例: 在 Vue 程序中添加路由 一般 Vue 路由设置如下所示: <template> <router-view /> </template> 在旧版本的 Vue 路由中,我们可以简单地用

  • Vue 路由 过渡动效 数据获取方法

    过渡动效 <router-view> 是基本的动态组件,所以我们可以用 <transition> 组件给它添加一些过渡效果: <transition> <router-view></router-view> </transition> 单个路由的过渡 上面的用法会给所有路由设置一样的过渡效果,如果你想让每个路由组件有各自的过渡效果,可以在各路由组件内使用 <transition> 并设置不同的 name. 基于路由的动态过

  • vue实现路由懒加载的3种方法示例

    前言 路由懒加载在访问页面的时候非常重要,能够提高首页加载速度,避免出现加载时候白页,如果没有懒加载,webpack打包后的文件会非常大. import按需加载(常用) vue异步组件 webpack提供的require.ensure() 1.import按需加载(常用) 允许将不同的组件打包到一个异步块中,需指定了相同的webpackChunkName. 把组件按组分块 const A = () => import(/* webpackChunkName: "group-A"

  • vue 路由切换过渡动效滑入滑出效果的实例代码

    效果展示 css 滑入和滑出的动画 .twofade-enter {transform: translateX(100%);} .twofade-enter-active {transition: all 0.3s;position: absolute;height:100%;background:#ececec;} .twofade-leave-active {transition: all 0;transition-delay: 0.3s;position: absolute;} .twof

  • Vue 不定高展开动效原理详解

    目录 使用场景 背景 实现 transition 组件 过渡效果原理 解决 使用场景 在大多数 APP 中,都有问答模块,类似于下面这种(bilibili 为例): 问答模块的静态页面开发并不复杂,也没有特殊的交互.唯一有一点难度应该是回答部分的展开特效. 展开时,需要从上往下将回答部分的 div 慢慢撑开,上面的箭头也要有旋转的特效. 收回时,需要从下往上将回答部分的 div 慢慢缩小,上面的箭头也要有旋转的特效. 对于一般的展开.隐藏特效,只需要在对应元素的 height 上面增加过渡效果即

  • vue router路由嵌套不显示问题的解决方法

    vue router路由嵌套不显示问题的解决方法,具体内容如下 路由嵌套,vue2.0 router中嵌套路由不成功,如何解决? 我先说下我的需求,例如下图 我本来是想打算将中间的模块做一层子路由(test模块),模块代码没错,每次编译都正常好使. 但是打开编译后的文件之后,一直都是==只能渲染一级路由,子路由没有效果,==,查了一推资料. 帖子说:子路由多写了/, 会默认从根目录开始匹配,我试着也删除掉这些东西,但是后来发现,我的问题并不是这个原因造成的,原因在于,在子模块里面引用子路由,也是

  • vue修改Element的el-table样式的4种方法

    修改Element中的el-table样式,可以使用以下几种方法: 1. row-style 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style. 2. cell-style 单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style. 3. header-row-style 表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style. 4. header-c

  • Vue中子组件调用父组件的3种方法实例

    目录 1.直接在子组件中通过“this.$parent.event”来调用父组件的方法. 2.子组件用“$emit”向父组件触发一个事件,父组件监听这个事件即可. 3.父组件把方法传入子组件中,在子组件里直接调用这个方法即可. 总结 Vue中子组件调用父组件的三种方法: 1.直接在子组件中通过“this.$parent.event”来调用父组件的方法. 父组件 <template> <div> <child></child> </div> <

  • vue中el-table格式化el-table-column内容的三种方法

    目录 el-table格式化el-table-column内容 一.template scope .v-if判断 二.利用formatter.slot属性 三.但这些对我当前的情况,并不适用.所以,后来发现一个好方法.将两种方法结合起来,使用slot,自定义 formatter.(自定义)灵活应用就好啦 博文参考: el-table格式化el-table-column内容 遇到一个需求,一个循环展示的table中的某项,或者某几项需要格式化.对于格式化的方法,主要有template scope.

随机推荐