众所周知,animate作为一款优秀的开源CSS动画库,具有使用简单、兼容性强、动画丰富的特点。那么如何在自己的项目中使用炫酷的animate动画,实现页面切换特效呢?本文带你快速上手使用animate动画。

一、创建项目与页面

初始化项目后默认有home页面和about页面。为了演示添加不同的动画效果,我们再添加test1和test2页面,并将各个页面使用router-link互相链接跳转。

1. Home.vue

<template>
  <div class="home">
    <router-link to="/about">跳转About</router-link>
    <br>
    <router-link to="/test1">跳转Test</router-link>
    <br>
    <router-link to="/test2">跳转Test2</router-link>
    <h1>这是主页</h1>
  </div>
</template>

<script>
export default {
  name: 'Home',
}
</script>
<style lang="scss">
.home{
  background-color: skyblue;
  height: 100vh;
}
</style>

2. About.vue

<template>
  <div class="about">
    <router-link to="/home">跳转Home</router-link>
    <br>
    <router-link to="/test1">跳转Test1</router-link>
    <br>
    <router-link to="/test2">跳转Test2</router-link>
    <h1>这是关于页</h1>
  </div>
</template>

<script>
export default {
  name: 'About',
}
</script>
<style lang="scss">
.about{
  background-color: pink;
  height: 100vh;
}
</style>

3. Test1.vue

<template>
  <div class="test1">
    <router-link to="/about">跳转About</router-link>
    <br>
    <router-link to="/home">跳转Home</router-link>
    <br>
    <router-link to="/test2">跳转Test2</router-link>
    <h1>这是测试页</h1>
  </div>
</template>

<script>
export default {
  name: 'Test',
}
</script>
<style lang="scss">
.test1{
  background-color: darkcyan;
  height: 100vh;
}
</style>

4. Test2.vue

<template>
  <div class="test2">
    <router-link to="/about">跳转About</router-link>
    <br>
    <router-link to="/home">跳转Home</router-link>
    <br>
    <router-link to="/test1">跳转Test1</router-link>
    <h1>这是测试页</h1>
  </div>
</template>

<script>
export default {
  name: 'Test',
}
</script>
<style lang="scss">
.test2 {
  background-color: gold;
  height: 100vh;
}
</style>

5. router

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/home',
    name: 'Home',
    component: () => import('@/views/Home')
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('@/views/About')
  },
  {
    path: '/test1',
    name: 'Test1',
    component: () => import('@/views/Test1')
  },
  {
    path: '/test2',
    name: 'Test2',
    component: () => import('@/views/Test2')
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

二、添加动画配置

1. 安装animate.css

npm install animate.css -D

2. 修改router,添加动画元信息名称

首先修改router下的index.js,添加meat标签,并定义不同的动画类型,达到自定义不同页面添加不同的动画效果。

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/home',
    name: 'Home',
    component: () => import('@/views/Home'),
    meta: {
      transitionClass: 'back' //左右切换动画
    }
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('@/views/About'),
    meta: {
      transitionClass: 'gradually' //淡入淡出动画
    }
  },
  {
    path: '/test1',
    name: 'Test1',
    component: () => import('@/views/Test1'),
    meta: {
      transitionClass: 'jump' //旋转跳跃动画
    }
  },
  {
    path: '/test2',
    name: 'Test2',
    component: () => import('@/views/Test2'),
    meta: {
      transitionClass: 'fast' //快速切换动画
    }
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

3.修改App.vue

核心思路是从route的元信息中取到动画类型,然后给transition标签动态绑定不同的animate动画属性,达到自定义动画切换效果。

<template>
  <router-view class="router-view" v-slot="{ Component }">
    <transition :enter-active-class="enterClass"
                :leave-active-class="leaveClass"
                :duration="{ enter: 800, leave: 500 }">
      <component :is="Component"/>
    </transition>
  </router-view>
</template>
<script>
import {ref, watch} from "vue";
import {useRoute} from "vue-router";
import animate from "animate.css";

export default {
  name: "App",
  setup() {
    let enterClass = ref('');
    let leaveClass = ref('');
    const route = useRoute();
    // 监控路由的变化
    watch(
        () => route.meta.transitionClass,
        (transitionClass) => {
          // 平滑切换
          if (transitionClass === 'back') {
            enterClass.value = 'animate__animated animate__fadeInRight'
            leaveClass.value = 'animate__animated animate__fadeOutRight'
          }
          // 跳转
          else if (transitionClass === 'jump') {
            enterClass.value = 'animate__animated animate__rollIn'
            leaveClass.value = 'animate__animated animate__rollOut'
          }
          // 渐入
          else if (transitionClass === 'gradually') {
            enterClass.value = 'animate__animated animate__fadeIn'
            leaveClass.value = 'animate__animated animate__fadeOut'
          }
          // 快速切换
          else if (transitionClass === 'fast') {
            enterClass.value = 'animate__animated animate__fadeInRightBig'
            leaveClass.value = 'animate__animated animate__fadeOutRightBig'
          } else {
            enterClass.value = ''
            leaveClass.value = ''
          }
        }
    );
    return {enterClass, leaveClass};
  },
};
</script>
<style lang="scss">
.router-view {
  width: 100%;
  height: auto;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: 0 auto;
  -webkit-overflow-scrolling: touch;
}
</style>

三、效果演示

222.gif - 图片地址: https://cdn.cuiliangblog.cn/media/markdown/222.gif - 参考链接

animate中文网:http://www.animate.net.cn/ VUE动画参考官方文档:https://v3.cn.vuejs.org/guide/transitions-overview.html

0 子项 · 2 次浏览 · 2026-09-24