《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 来完成动画。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之数学基础:线性代数中的线性相关和线性无关

本文重点 在线性代数的广阔领域中,线性相关与线性无关是两个核心概念,它们对于理解向量空间、矩阵运算、线性方程组以及人工智能等问题具有至关重要的作用。 定义与直观理解 当存在一组不全为0的数x1,x2,...,xn使得上式成立的时候,那么此时我们可以说向量组a1,a2...,an…

【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)

链路上的相关性模型 召回海选 打分量&#xff1a;数万模型&#xff1a;文本匹配分数线性模型或双塔BERT模型 粗排 打分量&#xff1a;数千模型&#xff1a;双塔BERT&#xff0c;或单塔BERT模型&#xff08;交叉&#xff09; 精排 打分量&#xff1a;数百模型&#xff1a;单塔B…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

项目实战--网页五子棋(游戏大厅)(3)

我们的游戏大厅界面主要需要包含两个功能&#xff0c;一是显示用户信息&#xff0c;二是匹配游戏按钮 1. 页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport"…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…

网络变压器的分类

网络变压器是局域网(LAN)中各级网络设备中必备的元件。它们的主要功能是传输数据&#xff0c;增强信号&#xff0c;并提供电气隔离&#xff0c;以防雷保护和匹配阻抗。网络变压器也被称为数据泵或网络隔离变压器。它们广泛应用于网络交换机、路由器、网卡、集线器等设备中。 网…

大数据时代的璀璨明珠:机器学习引领的智能应用革新与深度融合探索

欢迎大家阅读&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,ubuntu,linux,数据结构领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 目录 技术前沿&#xff1a…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…

封装Redis工具类

基于StringRedisTemplate封装一个缓存工具类,满足以下需求: 方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间 方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间,用于处理缓存击穿问题 方法3:根据指定的…

三电平空间矢量详解

0. 前言 空间矢量PWM控制策略是依据变流器空间电压切换来控制变流器的一种新颖思路的控制策略。最早由日本学者在20世纪80年代初针对交流电动机变频驱动而提出的,主要思路在于抛弃了原有的正弦波脉宽调制,而是采用逆变器空间电压的矢量以获得准圆形旋转磁场,从而在不高的开关…

Go 切片:用法和本质

要想更好的了解一个知识点&#xff0c;实战是最好的经历。 题目 我这里放一道题目&#xff1a; package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树&#xff0c;对于树中的每个结点&#xff0c;如果该结点的权值大于等于孩子结点的权值&#xff0c;就称它为大根堆&#xff0c;小于等于就叫小根堆&#xff0c;如果是大根堆&#xff0c;每个子树也是符合大根堆的特征的&#xff0c;如果是…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…

springboot医院信管系统

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

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

和组合导航一样&#xff0c;也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说&#xff0c;预积分因子可以更方便地整合到现有的优化框架中&#xff0c;从开发到实现都更为便…

微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

动手学大数据-3社区开源实践

目录 数据库概览&#xff1a; MaxComput&#xff1a; HAWQ&#xff1a; Hologres&#xff1a; TiDB&#xff1a; Spark&#xff1a; ClickHouse&#xff1a; Apache Calcite 概览 Calcite RBO HepPlanner 优化规则&#xff08;Rule&#xff09; 内置有100优化规则 …

WPS数据分析000004

目录 一、表格阅读技巧 冻结窗格 拆分窗口 新建窗口 阅读模式 护眼模式 二、表格打印技巧 打印预览 打印缩放 打印区域 打印标题 分页打印 打印位置 页眉页脚 逐份打印 三、表格保护技巧 锁定单元格 隐藏公式 文档权限 文件加密 一、表格阅读技巧 冻结窗…