《Vue3 九》动画

Vue 提供了一些内置组件和对应的 API 来完成动画,利用它们可以方便地实现动画效果。

<transition> 内置组件:

Vue 提供了 <transition> 内置组件,可以给任意元素或组件添加进入/离开时的动画效果。在条件渲染、动态组件、改变 key 属性时将会触发。

主要针对单个元素或组件。

transition 过渡动画:

<!-- 给 <div> 元素的显示与隐藏添加过渡动画 -->
<template>
  <!-- 2. 使用 <transition> 包裹想要添加动画的元素,Vue 在恰当的时机将编写好的类自动添加、移除  -->
  <transition>
    <div v-if="isShow">Hello Vue</div>
  </transition>
  <button @click="handleChange">切换</button>
</template>

<script setup>
import {ref} from 'vue'
const isShow = ref(false)
const handleChange = () => {
  isShow.value = !isShow.value
}
</script>

<style scoped>
/* 1. 编写想要的动画的类 */
/* 进入前的状态 */
.v-enter-from, 
/* 离开后的状态 */
.v-leave-to {
  opacity: 0;
}

/* 进入后的状态  */
.v-enter-to,
/* 离开前的状态 */
.v-leave-from {
  opacity: 1;
}

/* 进入时的效果 */
.v-enter-active,
/* 离开时的效果 */
.v-leave-active {
  transition: opacity 1s ease;
}
</style>  

在这里插入图片描述

animation 序列帧动画:

<!-- 给 <div> 元素的显示与隐藏添加 animation 动画 -->
<template>
  <!-- 2. 使用 <transition> 包裹想要添加动画的元素,Vue 在恰当的时机将编写好的类自动添加、移除  -->
  <transition>
    <div v-if="isShow">Hello Vue</div>
  </transition>
  <button @click="handleChange">切换</button>
</template>

<script setup>
import {ref} from 'vue'
const isShow = ref(false)
const handleChange = () => {
  isShow.value = !isShow.value
}
</script>

<style scoped>
/* 1. 编写想要的动画的类 */
@keyframes enterAnimation {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(2);
  }
  100% {
    transform: scale(1);
  }
}

/* 进入时的效果 */
.v-enter-active {
  animation: enterAnimation 1s ease;
}

@keyframes leaveAnimation {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(2);
  }
  100% {
    transform: scale(0);
  }
}

/* 离开时的效果 */
.v-leave-active {
  animation: leaveAnimation 1s ease;
}
</style>  

<transition> 组件的原理:

Vue 并没有编写好动画的类,只是会在恰当的时机将开发者编写好的类自动添加、移除。

当插入或者删除包含在 <transition> 组件中的元素时,Vue 会做以下处理:

  1. 自动嗅探目标元素是否应用了 CSS 动画,如果有的话,那么将会在恰当的时机自动添加/移除 CSS 类名。
  2. 如果 <transition> 组件提供了 JavaScript 钩子函数,那么这些钩子函数将会在恰当的时机被调用。
  3. 如果没有检测到 CSS 动画并且也没有找到 JavaScript 钩子函数,那么 DOM 的插入、删除操作将会立即执行。

<transition> 组件的属性:

  1. name:动画的 class 类名的前缀。
  2. duration:显式地设置动画的持续时间。
  3. appear:首次渲染时是否采用动画。默认首次渲染是没有动画的。
  4. type:当同时使用过渡动画和序列帧动画时,以谁的时间为动画的结束时刻。属性值可以为 transition 或者 animation。当不设置type时,默认会取 transitioned 和 animationed 两者更长的为结束时刻。
  5. mode:当一个动画在两个元素之间切换时,如果不希望同时执行进入动画和离开动画,俺么可以设置动画的过渡模式。属性值可以为 in-out,新元素先过渡进入,完成之后当前元素再过渡离开;out-in:当前元素先过渡离开,新元素再过渡进入。
      <template>
        <!-- 如果不设置 mode 过渡属性,那么一个元素显示、一个元素消失将会同时执行动画。设置 mode="out-in" 之后,Hello Vue 会先消失,然后你好,世界再显示 -->
        <transition mode="out-in">
          <div v-if="isShow">Hello Vue</div>
          <div v-else> 你好,世界</div>
        </transition>
        <button @click="handleChange">切换</button>
      </template>
      
      <script setup>
      import {ref} from 'vue'
      const isShow = ref(true)
      const handleChange = () => {
        isShow.value = !isShow.value
      }
      </script>
      
      <style scoped>
      .v-enter-from, 
      .v-leave-to {
        opacity: 0;
      }
      
      .v-enter-to,
      .v-leave-from {
        opacity: 1;
      }
      
      .v-enter-active,
      .v-leave-active {
        transition: opacity 1s ease;
      }
      </style>  
    

动画的 class 类:

  1. v-enter-from:进入动画的起始状态。在元素被插入之前添加,在元素插入完成后的下一帧移除。
  2. v-enter-active:进入动画的生效状态。应用于整个进入动画阶段,在元素被插入之前添加,在动画完成之后移除。
  3. v-enter-to:进入动画的结束状态。在元素被插入完成后的下一帧添加,在动画完成之后移除。
  4. v-leave-from:离开动画的起始状态。在离开动画被触发时立刻添加,下一帧被移除。
  5. v-leave-active:离开动画的生效状态。应用于整个离开动画阶段,在离开动画被触发时立刻添加,在动画完成之后移除。
  6. v-leave-to:离开动画的结束状态。在离开动画被触发后的下一帧添加,在动画完成之后移除。

动画的 class 类的命名规则:

  1. 如果使用的是一个没有 name 的 <transition> ,那么所有的 class 是以 v- 作为默认前缀。
  2. 如果给 <transition> 添加了 name 属性,那么所有的 class 会以 name 属性值做前缀。例如 <transition name=''fade>,那么所有的 class 以 fase- 为前缀。

<transition-group> 内置组件:

Vue 提供了 <transition-group> 内置组件,可以为列表添加、删除数据时添加动画效果。

主要针对列表元素或组件。

<!-- 列表添加、删除元素时,添加、删除的元素将会运用动态效果 -->
  <template>
    <!-- 默认情况下,<transition-group> 不会渲染成一个元素的包裹器,可以通过指定 tag 属性将其渲染为想要的元素 -->
    <transition-group tag="div">
      <!-- 内部元素总是需要提供唯一的 key 属性。CSS 动画的类将会应用在内部的元素上,而不是外面的包裹容器上 -->
      <template v-for="item in nums" :key="item">
        <div>{{ item }}</div>
      </template>
    </transition-group>
    <button @click="handleAdd">插入</button>
    <button @click="handlDelete">删除</button>
  </template>
  
  <script setup>
  import {ref} from 'vue'
  const nums = ref([0, 1, 2, 3, 4, 5])
  const randomIndex = () => {
    return Math.floor(Math.random() * nums.value.length)
  }
  const handleAdd = () => {
    nums.value.splice(randomIndex(), 0, nums.value.length)
  }
  const handlDelete = () => {
    nums.value.splice(randomIndex(), 1)
  }
  </script>
  
  <style scoped>
  .v-enter-from, 
  .v-leave-to {
    opacity: 0;
     transform: translateY(30px);
  }
  
  .v-enter-to,
  .v-leave-from {
    opacity: 1;
    transform: translateY(0);
  }
  
  .v-enter-active,
  .v-leave-active {
    transition: opacity 1s ease;
  }
  </style>  

此时,列表添加、删除的元素是有动画的,但是由于添加或者删除导致的其他需要移动的元素是没有动画的。可以使用一个新增的 v-move 的 class 来完成动画,它会在元素改变位置的过程中应用。

<transition-group> 组件的属性:

  1. 除了 mode 过渡模式不可用外,其他 <transition> 组件的属性都可用。
  2. tag:默认情况下,<transition-group> 不会渲染成一个元素的包裹器,可以通过指定 tag 属性将其渲染为想要的元素。

动画的 class 类:

  1. <transition>中动画的 class 类都可用。
  2. v-move:会在元素改变位置的过程中应用。
      <template>
        <transition-group tag="div">
          <template v-for="item in nums" :key="item">
            <div>{{ item }}</div>
          </template>
        </transition-group>
        <button @click="handleAdd">插入</button>
        <button @click="handlDelete">删除</button>
      </template>
      
      <script setup>
      import {ref} from 'vue'
      const nums = ref([0, 1, 2, 3, 4, 5])
      const randomIndex = () => {
        return Math.floor(Math.random() * nums.value.length)
      }
      const handleAdd = () => {
        nums.value.splice(randomIndex(), 0, nums.value.length)
      }
      const handlDelete = () => {
        nums.value.splice(randomIndex(), 1)
      }
      </script>
      
      <style scoped>
      .v-enter-from, 
      .v-leave-to {
        opacity: 0;
        transform: translateY(30px);
      }
      
      .v-enter-to,
      .v-leave-from {
        opacity: 1;
        transform: translateY(0);
      }
      
      .v-enter-active,
      .v-leave-active,
      /* 为其他移动的元素添加动画 */
      .v-move {
        transition: all 3s ease;
      }
    
      /* 元素离开时设置绝对定位,否则的话,离开动画的过程中,被删除元素仍然占据位置,导致其他需要移动的元素无法运用动画 */
      .v-leave-active {
        position: absolute;
      }
      </style>
    
    上面的示例中,列表添加、删除的元素是有动画的,但是由于添加或者删除而导致的其他需要移动的元素是没有动画的。可以使用 新增的 v-move 的 class 来完成动画。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言进阶习题【1】指针和数组(4)——二维指针

4. 二维指针练习&#xff08;sizeof&#xff09; 二维数组名和&二维数组名 二维数组名&#xff0c;指的是第一行的地址&#xff0c;1会跳过第一行 &二维数组名&#xff0c;指的是整个数组地址 1会跳过整个数组 4.1代码验证 #include<stdio.h> #include<strin…

2024年最新ComfyUI汉化及manager插件安装详解!

前言 在ComfyUI文生图详解中&#xff0c;学习过如果想要安装相应的模型&#xff0c;需要到模型资源网站&#xff08;抱抱脸、C站、魔塔、哩布等&#xff09;下载想要的模型&#xff0c;手动安装到ComfyUI安装目录下对应的目录中。 为了简化这个流程&#xff0c;我们需要安装Co…

Mysql常见问题处理集锦

Mysql常见问题处理集锦 root用户密码忘记&#xff0c;重置的操作(windows上的操作)MySQL报错&#xff1a;ERROR 1118 (42000): Row size too large. 或者 Row size too large (&#xff1e; 8126).场景&#xff1a;报错原因解决办法 详解行大小限制示例&#xff1a;内容来源于网…

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…

vulnhub靶场【Mr-robot靶机】,分析数据包,根据回显不同进行爆破

前言 靶机&#xff1a;lampiao&#xff0c;IP地址为192.168.10.12 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 该靶机目前只剩下一个了&#xff0c;之前记得是有两台构成系列的。 文章中涉及的靶机&#xff0c;来源于v…

上一次和英特尔的接触...

大家好啊&#xff0c;我是董董灿。 最近很多人在转发英特尔将被收购的消息&#xff08;真假不知&#xff09;。 被收购对英特尔而言&#xff0c;很悲情。 作为早期通用计算领域的老大哥&#xff0c;在 AI 时代&#xff0c;英特尔意外的被 AI 计算&#xff08;英伟达&#xf…

【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewClause 22/Clause 45Clause 22Clause 45 PHY Link 状态的软件实现 转自&#xff1a; 开心果 Need Car 2022年10月20日 09:50 上海 Overview PHY…

Android设备:Linux远程lldb调试

更多内容&#xff1a;XiaoJ的知识星球 目录 一、环境准备1.1 安装llvm/NDK1.2 开启lldb-server服务1.3 lldb连接lldb-server 二、使用lldb调试Android native源码2.1 运行调试2.2 .lldbinit文件 下面介绍Android设备&#xff08;Android手机为例&#xff09;&#xff0c;在Linu…

力扣动态规划-2【算法学习day.96】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

电商项目高级篇08-springCache

电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…

模块化架构与微服务架构,哪种更适合桌面软件开发?

前言 在现代软件开发中&#xff0c;架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景&#xff0c;尤其在C#桌面软件开发领域&#xff0c;模块化架构往往更加具有实践性。本文将对这两种架构进行对比&#xff0…

grafana + Prometheus + node_exporter搭建监控大屏

本文介绍生产系统监控大屏的搭建&#xff0c;比较实用也是实际应用比较多的方式&#xff0c;希望能够帮助大家对监控系统有一定的认识。 0、规划 grafana主要是展示和报警&#xff0c;Prometheus用于保存监控数据&#xff0c;node_exporter用于实时采集各个应用服务器的事实状…

诗意与技术交织的奇妙世界

诗意与技术交织的奇妙世界 在CSDN的浩瀚星空中&#xff0c;有这样一座独特的岛屿&#xff0c;它属于酒城译痴无心剑。这是一个充满诗意与智慧的世界&#xff0c;是无心剑用文字精心构筑的精神家园。 无心剑是酒城泸州人&#xff0c;毕业于南京大学&#xff0c;基础数学专业&am…

Conv2d中groups=2时手动计算及pytorch源码验证

文章目录 1. excel 原理计算2. pytorch 源码 1. excel 原理计算 2. pytorch 源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2in_cha…

支付宝商家转账到账户余额,支持多商户管理

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

JavaWeb项目——如何处理管理员登录和退出——笔记

一、知识点 1、WebServlet注解的使用 WebServlet注解是Servlet 3.0引入的一个特性&#xff0c;它允许开发者在Servlet类上使用注解来声明Servlet的一些属性&#xff0c;从而避免在web.xml文件中进行配置。这种方式简化了Servlet的配置过程&#xff0c;使得代码更加简洁&#…

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…

4. LwIP_网络数据包管理

概述 协议栈的本质&#xff1a; TCP/IP协议栈的实现&#xff0c;本质上就是对数据包的管理。在LwIP中&#xff0c;定义了一个pbuf结构体对数据包进行管理。 pbuf管理数据包的步骤&#xff1a; 1、用户产生要传输的数据 2、用户在内存堆/内存池中申请一个pbuf结构体 3、将…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…