Vue之动画的实现

2023-11-03

前言

当我们的UI界面显示出来后,需要和用户进行交互,即用户点击某个控件,比如是一个按钮,需要跳转到另一个界面的时候,如果直接跳转到另一个界面,功能是实现了,但是未免有些生硬,因为用户体验不是很好,这时就需要动画的润色了,添加一个好的转场动画能让用户使用起来拥有更好的体验,并且动画还可以让一些耗时的任务看起来不那么“耗时”,比如当用户下载一个文件时,假如没有动画,系统一直卡在下载当那个页面(其实系统没有卡住,只是在下载,用户以为卡住了),那么下载完文件后就会直接显示一个下载完成的界面给到用户,用户是很蒙的。但是使用一个进度条动画,告诉用户文件正在下载的话,用户的体验会更好,至少他知道此时系统没有卡死。所以本文将介绍使用Vue实现动画效果。

示例解析

使用Vue实现过渡动画

实现一个过渡动画,过渡动画的效果是由蓝色渐渐变成红色,有一个switch按钮,点击时会做效果的切换,如果当前是蓝色,点击会过渡到红色,如果当前是红色,点击会过渡到蓝色。效果如下:
在这里插入图片描述

代码实现如下:

首先我们需要定义一个CSS过渡动画,如下:

  <style>
        /* 过渡动画 */
    .transition{
       transition: 3s background-color ease;
    }
  </style>

然后在Vue中使用:

 const app = Vue.createApp({
        data() {
            return {
                styleObj:{
                    background:'blue'
                }
            }
        },
        methods: {
            handleClick(){
                if(this.styleObj.background === 'blue'){
                    this.styleObj.background = 'red';
                }else{
                    this.styleObj.background = 'blue';
                }
            }
        },
        template: 
        `
        <div class="transition" :style="styleObj">
        hello world
        </div>
        <button @click="handleClick">switch</button>
        `
    });

在Vue中使用的时候,我们定义了一个对象styleObj 表示当前的背景色,当我们点击switch按钮时,通过js方法handleClick将当前演示切换到红色,再点击又切换回来,实现的方案就是我们使用vue将css给添加到我们的vue模版div中。

所有代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡动画</title>
    <style>
        /* 过渡动画 */
        .transition{
            transition: 3s background-color ease;
        }
    </style>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>

 const app = Vue.createApp({
        data() {
            return {
                styleObj:{
                    background:'blue'
                }
            }
        },
        methods: {
            handleClick(){
                if(this.styleObj.background === 'blue'){
                    this.styleObj.background = 'red';
                }else{
                    this.styleObj.background = 'blue';
                }
            }
        },
        template: 
        `
        <div class="transition" :style="styleObj">hello world </div>
        <button @click="handleClick">switch</button>
        `
    });

    const vm = app.mount('#root');
</script>
</html>

使用Vue实现动画效果

学会了过渡动画,接下来我们再来看看动画效果,我们可以使用Vue实现一个动画效果,使用一个CSS帧动画,让一个div往左移100像素,退到50像素最后恢复到原来的位置,效果如下:
在这里插入图片描述

代码实现如下:

首先定义一个CSS帧动画:

  <style>
        @keyframes leftToRight {
            0%{
                transform: translateX(-100px);
            }

            50%{
                transform: translateX(-50px);
            }

            0%{
                transform: translateX(0px);
            }
        }
        .animation{
            animation: leftToRight 3s;
        }
    </style>

然后在Vue中使用时:

 const app = Vue.createApp({
        data() {
            return {
                animate:{
                    animation:true
                }
            }
        },
    
        template: 
        `
        <div :class="animate">hello world </div>
        `
    });

我们使用一个animate对象去控制animate,这个animate即为是否带动画效果,如果带动画效果,animation为true会直接在需要带动画效果的div上加上我们定义的animation。若是animation为false,则不会加上这个我们定义的名为animationclass,也就不会带动画效果了
在这里插入图片描述

所有代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>动画效果</title>
    <style>
        @keyframes leftToRight {
            0%{
                transform: translateX(-100px);
            }

            50%{
                transform: translateX(-50px);
            }

            0%{
                transform: translateX(0px);
            }
        }
        .animation{
            animation: leftToRight 3s;
        }
    </style>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>

 const app = Vue.createApp({
        data() {
            return {
                animate:{
                    animation:true
                }
            }
        },
    
        template: 
        `
        <div :class="animate">hello world </div>
        `
    });

    const vm = app.mount('#root');
</script>
</html>

完成一个组件的转场动画

接下来我们利用vue提供的<transition></transition>完成一个转场动画,点击switch按钮,hello world先以帧动画的方式进程,然后再点击switch按钮,hello world 再以过渡动画的方式出场。效果如下:
在这里插入图片描述

代码实现如下:

首先我们先在CSS中定义好动画效果:

   <style>
        /* 定义动画效果 */
        @keyframes shake {
            0% {
                transform: translateX(-100px);;
            }

            50% {
                transform: translateX(-50px);;
            }
            100% {
                transform: translateX(50px);;
            }
        }
        /* 过渡动画 */
        .transition{
            transition: 3s background-color ease;
        }

        /* 让opacity做一个动画的缓慢替换 */
        .v-enter-active{
            animation:shake 3s;
        }

        .v-leave-active{
            transition: opacity 3s ease-out;
        }
           /* 入场动画 */
        .v-enter-from{
            opacity: 0;
        }

        /* 动画结束 */
        .v-enter-to{
            opacity: 1;
        }
        
        .v-leave-to{
            opacity: 0;
        }
    </style>

进场的时候使用帧动画将显示内容的div先向左移动100px,然后是50px,然后再向右移动50px到了显示的位置,然后用过渡动画定义一个淡入的效果,即将透明度由0变成1,使用vue的类名v-enter-from表示进场动画开始的时候,定义透明度opacity为0,v-enter-active表示进场动画在中间状态时,我们使用帧动画做一个效果,v-enter-to表示进场动画结束时,将透明度opacity置为1,表示完全显示,v-leave-from表示离场动画开始,v-leave-active表示离场动画在中间状态开始执行,v-leave-to表示离场动画结束时,离场时我们将透明度由1变成0。

注意:在定义离场动画时,眼尖的读者可能会发现我们没有使用v-leave-from,这里其实加上和不加一样,因为离场动画的开始透明度本来就是1,即内容本来就是显示的,所以没有必要加上。当然加上也是正确的
Vue在使用的时候,使用<transition></transition>标签来使用我们定义的动画,代码如下:

 const app = Vue.createApp({
        data() {
            return {
                show:false
            }
        },
        methods: {
            handleClick(){
                this.show = !this.show;
            }
        },

        // 加了自定义的名字
        template: 
        `
        <transition>
            <div v-if="show" >hello world </div>
        </transition>
        <button @click="handleClick">switch</button>
        `
    });

我们使用一个show变量来控制div的入场和离场动画的执行,所有代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡与动画--入场和出场</title>
    <style>
        /* 定义动画效果 */
        @keyframes shake {
            0% {
                transform: translateX(-100px);;
            }

            50% {
                transform: translateX(-50px);;
            }


            100% {
                transform: translateX(50px);;
            }
            
        }
        /* 过渡动画 */
        .transition{
            transition: 3s background-color ease;
        }

        /* 让opacity做一个动画的缓慢替换 */
        .v-enter-active{
            animation:shake 3s;
        }

        .v-leave-active{
            transition: opacity 3s ease-out;
        }
           /* 入场动画 */
        .v-enter-from{
            opacity: 0;
        }

        /* 动画结束 */
        .v-enter-to{
            opacity: 1;
        }
        .v-leave-to{
            opacity: 0;
        }
    </style>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
 const app = Vue.createApp({
        data() {
            return {
                show:false
            }
        },
        methods: {
            handleClick(){
                this.show = !this.show;
            }
        },

        template: 
        `
        <transition>
            <div v-if="show" >hello world </div>
        </transition>
        <button @click="handleClick">switch</button>
        `
    });

    const vm = app.mount('#root');
</script>
</html>

在上面定义动画的时候,我们需要使用.v-enter-active之类的Vue专有关键字定义,那这个名字可以修改吗?答案是可以的,首先在transition标签中加上我们要定义的名字,假设为“hello”

   <transition name="hello">
     <div v-if="show" >hello world </div>
  </transition>

使用的时候将.v-xxxx-xx中的v使用hello代替,如下所示:

 <style>
        /* 定义动画效果 */
        @keyframes shake {
            0% {
                transform: translateX(-100px);;
            }
            50% {
                transform: translateX(-50px);;
            }
            100% {
                transform: translateX(50px);;
            }
        }
        /* 过渡动画 */
        .transition{
            transition: 3s background-color ease;
        }
        /* 入场动画 */
        .hello-enter-from{
            opacity: 0;
        }
        /* 让opacity做一个动画的缓慢替换 */
        .hello-enter-active{
            animation:shake 3s;
        }
        .hello-leave-active{
            transition: opacity 3s ease-out;
        }
        /* 动画结束 */
        .hello-enter-to{
            opacity: 1;
        }
        .hello-leave-to{
            opacity: 0;
        }
    </style>

效果与我们上面实现的转场动画完全一样,那有读者说我就想使用自己定义的名字,不要啥v-enter-from,v-leave-to之类的,可以吗?答案是当然可以
使用transition标签时,我们在标签中加上下面的属性

<transition 
  enter-active-class="你定义的名字"
  leave-active-class="你定义的名字">
   <div v-show="show" >hello world </div>
</transition>

然后定义动画效果时使用你自定义的名字就行了,Vue的这个支持自定义名字的这个功能非常的有用,因为我们可以借助它来接入第三方动画库的效果。比如我们接入一个Animate.css动画库中的一个闪烁效果Animate.css官网

<transition 
  enter-active-class="animate__animated animate__flash"
  leave-active-class="animate__animated animate__flash">
  <div v-show="show" >hello world </div>
</transition>

这样就可以完成一个三方动画效果的接入了,直接把三方实现的CSS动画效果的样式类名给到Vue的transition就可以了

所有代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link
    rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
  />
    <title>接入三方动画效果</title>

    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>

    // 过渡与动画
 const app = Vue.createApp({
        data() {
            return {
                show:false
            }
        },
        methods: {
            handleClick(){
                this.show = !this.show;
            }
        },

        template: 
        `
        <transition 
            enter-active-class="animate__animated animate__flash"
            leave-active-class="animate__animated animate__flash">
            <div v-show="show" >hello world </div>
        </transition>
        <button @click="handleClick">switch</button>
        `
    });

    const vm = app.mount('#root');
</script>
</html>

运行效果:
在这里插入图片描述

总结

本文主要介绍了使用Vue实现动画效果,以及接入第三方动画的效果,本文只是实现了一些简单的动画,意在入门,读者有更好的动画实现方式,欢迎评论区交流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue之动画的实现 的相关文章

随机推荐

  • ELF文件格式的详解

    1 说明 2 elf文件的基本格式 3 elf文件的头部信息 4 elf文件的节区 Section 4 1 节区的作用 4 2 节区的组成 5 elf文件的段 Segment 6 用python解析elf文件 7 总结 1 说明 ELF的英
  • 设计模式之中介者模式

    中介者模式包装了一系列对象相互作用的方式 使得这些对象1不必相互明显作用 从而使它们可以松散耦合 当某些对象之间的作用发生改变时 不会立即影响到其他的一些对象之间的作用 保证这些作用可以彼此独立变化 中介者模式将多对多的相互作用转化为一对多
  • C语言函数程序实例(超全)

    目录 1 编写函数fun 功能是 计算n门课程的平均值 计算结果作为函数值返回 例如 若有5门课程的成绩是 92 76 69 58 88 则函数的值为76 599998 2 用函数将一个N阶方阵进行转置 输入输出在主函数中实现 使用for循
  • [QT编程系列-7]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义工具栏、状态栏、快捷键、图标

    目录 3 QT窗体设计 3 2 自定义工具栏 3 2 1 目标 3 2 2 实现过程 3 2 自定义状态栏 3 2 1 目标 3 2 2 过程 3 3 自定义动作快捷键 3 4 自定义图标 3 QT窗体设计 3 2 自定义工具栏 在Qt中
  • idea2023搜不到中文插件问题

    idea2023搜不到中文插件 可以考虑下载插件后本地安装 注意先看idea版本号 然后从官网下载离线汉化包 选择的版本等于或者低于idea版本号 1 离线汉化包下载地址 Chinese Simplified Language Pack 中
  • python操作excel(xlrd、xlwt、xlwings、pandas、openpyxl)

    文章目录 一 xlrd库 1 工作簿 book 1 创建工作簿对象 2 工作表 sheet 1 创建工作表对象 3 单元格 range 1 获取单个单元格的值 两种方法 2 获取单行或单列的值 4 获取工作表中的总行列数 二 xlwt库 1
  • JAVA多线程--信号量(Semaphore)

    简介 信号量 Semaphore 有时被称为信号灯 是在多线程环境下使用的一种设施 它负责协调各个线程 以保证它们能够正确 合理的使用公共资源 一个计数信号量 从概念上讲 信号量维护了一个许可集 如有必要 在许可可用前会阻塞每一个 acqu
  • VUE + 微信分享

    cnpm i weixin js sdk save 在需要分享的页面引入 import wx from weixin js sdk import shares from api index 在methods写调用的方法 vue调用微信的自定
  • Idea 代码存在报找不到符号

    前言 话说IDEA这个开发工具已经用了好几个春秋了 没想到最近很是淘气呢 打算撂挑子了 来咱们来整顿一下这淘气的货 问题 Error 191 80 java 找不到符号 符号 方法 getListByParamWithoutPage jav
  • 国家发改委发布《“互联网+”高效物流实施意见》

    国家发展改革委关于印发 互联网 高效物流实施意见 的通知 发改经贸 2016 1647号 国务院有关部委 直属单位 各省 自治区 直辖市及计划单列市人民政府 为贯彻落实 国务院关于积极推进 互联网 行动的指导意见 国发 2015 40号 发
  • #ifdef,#ifndef,#define,#endif解析(原)

    我们在看一些开源的源代码的时候 经常会看到如下情景 if defined PTHREADS defined NOTHREADS define STL PTHREADS endif if defined UITHREADS defined P
  • github上的adminlte下载太慢,下载失败解决办法

    不知道为什么github上的AdminLTE下载特别慢 一直失败 可以到码云上的镜像仓库去下载 码云急速下载
  • USB/UART/I2C/SPI等接口传输速率

    USB UART I2C SPI等接口传输速率 目录 USB总线 UART I2C总线 SPI总线 GPIO RK3399 FMC 参考 USB总线 USB1 1 低速模式 low speed 1 5Mbps 全速模式 full speed
  • CompletableFuture使用(五)

    异步任务交互方法applyToEither acceptEither和runAfterEither的使用介绍 1 applyToEither两个异步任务哪个先返回就处理哪个异步任务结果并返回CompletableFuture Complet
  • Flexera 2023 云状态报告解读

    导读 根据 Flexera 2023 云状态报告显示 经济问题不会减缓公有云市场的增长 FinOps 仍然处于应用多云战略的企业首要关注的问题 AWS 和 Azure 在全球市场仍处于领导地位 Flexera 根据对全球 750 位云决策者
  • iOS开发网络-HTTP协议

    一 URL 1 基本介绍 URL的全称是Uniform Resource Locator 统一资源定位符 通过1个URL 能找到互联网上唯一的1个资源 URL就是资源的地址 位置 互联网上的每个资源都有一个唯一的URL 2 URL中常见的协
  • 前端基础(四)- 数组和对象方法

    数组的方法 Array prototype reduce reduce 方法会对数组中的每个元素按序执行一个由您提供的 reducer 函数 每一次运行 reducer 会将先前元素的计算结果作为参数传入 最后将其结果汇总为单个返回值 第一
  • npm离线安装npm包的两种方法

    1 使用npm link 使用npm link 的方式是最常用的方法 具体做法是在联网机器上下载pm2的源码并安装好依赖 拷贝到离线服务器上 最后借助npm link将pm2链接到全局区域 首先 将pm2的源代码克隆下来 git clone
  • C语言标准库函数qsort( )——数据排序

    大家好 我是保护小周 本期为大家带来的是深度解剖C语言标准库函数 qsort qsort 函数他可以对任意类型的数据排序 博主会详细解释函数使用方法 以及使用快速排序的左右指针法模拟实现函数功能 这样的排序确定不来学习一下吗 目录 一 qs
  • Vue之动画的实现

    前言 当我们的UI界面显示出来后 需要和用户进行交互 即用户点击某个控件 比如是一个按钮 需要跳转到另一个界面的时候 如果直接跳转到另一个界面 功能是实现了 但是未免有些生硬 因为用户体验不是很好 这时就需要动画的润色了 添加一个好的转场动