Vue中使用<Transition>与<TransitionGroup>
目录
介绍
CSS过渡类
为过渡效果命名
CSS的transition
CSS的transform
性能考量
出现时过渡
元素间过渡
过渡模式
使用Key属性过渡
和的区别
进入/离开动画
移动动画
一个购物车飞跃例子
介绍
传统HTML中,我们可以使用CSS属性:“animation”与“transform”进行动画处理,而Vue为我们提供了两种内置组件:“<Transition>”与“<TransitionGroup>”
- 在Vue文件中可以直接使用<Transition>与<TransitionGroup>
- 使用Vue为静态页面增强时,请使用“<transition-group>”
CSS过渡类
Vue为我们提供了六种CSS动画类,方便我们进行操作:
- v-enter-from:进入动画的起始状态(在元素插入之前添加,元素插入完成后下一帧被移除)
- v-enter-active:进入动画的生效状态(应用于整个动画阶段),在元素插入之前添加,在过渡或动画完成之后移除(该clss可以用来定义动画的持续时间、延迟与速度曲线类型)
- v-enter-to:进入动画的结束状态。在元素插入完成后的下一帧被添加(v-enter-from被移除的同时),在过渡或动画完成之后移除
- v-leave-from:离开动画的起始状态。在离开过渡效果被触发时立即添加,在一帧后被移除
- v-leave-active:离开动画的生效状态(应用于整个动画阶段),在离开过渡效果被触发时立即添加,在过渡或动画完成之后移除(该clss可以用来定义动画的持续时间、延迟与速度曲线类型)
- v-leave-to:离开动画的结束状态。在一个离开动画被触发后的下一帧被添加(也就是v-leave-from被移除的同时),在过渡或动画完成之后移除
尽管如此,关于上述概念,同学们可能还会有所疑惑,因为官方文档给出的概念过于繁琐,因此在这里给出作者的一种“大白话”理解:
- v-enter-from:动画起始状态:“哪个位置”、“自身属性(背景颜色、透明度等)”开始动画
- v-enter-active:动画执行过程:“动画以什么方式执行?(ease、ease-in、ease-in-out)等”、“动画执行多久(duration)”、“元素的哪一部分执行动画(全部、局部)”
- v-enter-to:动画结束状态:“动画最终会在哪里?”、“动画属性最终是什么样子?”
v-leave与上述v-enter一致,不再赘述
<Transition>
- <Transition>会在一个元素或组件进入和离开DOM时应用动画
<Transition>触发条件如下:
- 由“v-if”所触发的切换
- 由“v-show”所触发的切换
- 由特殊元素<component>切换的动态组件
- 改变特殊的key属性
为过渡效果命名
我们可以给<Transition>组件穿一个“name”属性来声明一个过渡效果
<Transition name="fade"><p v-show="flag">Hello World!</p>
</Transition>
- 对于一个有名字的过渡效果,对它起作用的过渡class会以其名字而不是v作为前缀
- 例如上方例子被应用的class将会是“fade-enter-active”而不是“v-enter-active“
.fade-enter-active,.fade-leave-active {transition:opacity 0.5s ease;
}
.fade-enter-from,.fade-leave-to {opacity: 0;
}
效果:
CSS的transition
<Transition>一般都会搭配原生CSS过渡一起使用
.fade-enter-active {transition:all 0.5s ease-out;
}
.fade-leave-active {transition:all 0.8s cubic-bezier(1,0.5,0.8,1)
}
.fade-enter-from,.fade-leave-to {transform: translateX(20px);opacity: 0;
}
效果:
CSS的transform
原生CSS动画和CSS transition的应用方式基本上是相同的,只有一点不同,那就是“*-enter-from”不是在元素插入后立即移除,而是在一个“animationend”事件触发时被移除
<template><div style="position:absolute;margin: 0px 200px;"><Transition name="fade"><p v-show="flag">Hello World!</p></Transition><button @click="flag = !flag">出现/消失</button></div>
</template><style scpoed>
.fade-enter-active {animation: bounce-in 0.5s;
}
.fade-leave-active {animation: bounce-in 0.5s reverse;
}
@keyframes bounce-in {0% {transform: scale(0);}50% {transform: scale(1.25);}100% {transform: scale(1);}
}
</style>
效果:
性能考量
制作动画应尽量使用“transform”和“opacity”等,而不应使用“height”、“margin”这些属性,因为:
- 它们在动画过程中不会影响到DOM结构,不会每一帧都触发CSS布局重新计算
- 大多数现代浏览器执行transform动画时可以利用GPU进行硬件加速
出现时过渡
如果想在某个节点初次渲染时应用一个过渡效果(页面加载时),可以添加“appear”属性实现
<Transition appear>...
</Transition>
元素间过渡
除了通过“v-if”和“v-show”切换一个元素,我们还可以通过“v-if”、“v-else-if”、“v-else”进行几个组件之间切换,只要确保任一时刻只会有一个元素被渲染即可
<template><div style="position:absolute;margin: 0px 200px;"><Transition name="fade" mode="out-in"><p v-if="flag == 'Tom'">I am Tom</p><p v-else-if="flag == 'Amy'">I am Amy</p><p v-else="flag == 'Sam'">I am Sam</p></Transition></div><button @click="flag = 'Tom'">Tom</button><button @click="flag = 'Amy'">Amy</button><button @click="flag = 'Sam'">Sam</button>
</template>
<style scpoed>
.fade-enter-from {transform: translateY(10px);opacity: 0;
}
.fade-leave-to{transform: translateY(-10px);opacity: 0;
}
.fade-enter-active,.fade-leave-active {transition: transform 0.5s, opacity 0.5s;
}
.fade-enter-to,.fade-leave-from {transform: translateY(0);opacity: 1;
}
</style>
效果:
- 可以发现,上一个元素的离开动画和下一个元素的进入动画是同时发生的,这样会有很大的顿挫感,不过好在Vue提供“过渡模式”帮助我们解决这个问题
过渡模式
当我们想要先执行离开动画,然后在其完成之后再执行元素的进入动画。手动编排这样的动画是非常复杂的,不过我们可以通过向“<Transition>”传入一个“mode”属性来实现这个行为:
<Transition mode="out-in">...
</Transition>
效果:
使用Key属性过渡
有时为了触发过渡,我们需要强制重新渲染DOM元素
我们可以使用key属性“强标记”一个元素
不使用key属性:
<script setup>
import {ref} from 'vue'
const count = ref(0)
setInterval(() => count.value += 1,1000)
</script><template><div style="position:absolute;margin: 0px 200px;"><Transition name="fade" mode="out-in"><p>{{count}}</p></Transition></div>
</template>
<style scpoed>
.fade-enter-from {transform: translateY(10px);opacity: 0;
}
.fade-leave-to{transform: translateY(-10px);opacity: 0;
}
.fade-enter-active,.fade-leave-active {transition: transform 0.5s, opacity 0.5s;
}
.fade-enter-to,.fade-leave-from {transform: translateY(0);opacity: 1;
}
</style>
效果:
使用key属性:
<p :key="count">{{count}}</p>
效果:
可以发现,如果不使用“key”属性,只有文本节点会被更新,因此不会触发过渡
但是有了“key”属性,Vue就知道在count改变时新建一个<p>元素,因此<Transition>组件有两个不同的元素在它们之间进行过渡
<TransitionGroup>
<TransitionGroup>用于对“v-for”列表中的元素或组件的插入、移除和顺序改变添加动画效果
<TransitionGroup>和<Transition>的区别
<TransitionGroup>支持和<Transition>基本相同的属性、CSS过渡class和JavaScript钩子监听器,但有以下几点区别:
- 默认情况下,它不会渲染一个容器元素,但是你可以通过传入一个“tag”属性来指定一个元素作为容器元素来渲染
- “过渡模式”在这里不可用,因为我们不再是在互斥的元素之间进行切换
- 列表中的每个元素都必须有一个独一无二的key属性
- CSS过渡class会被应用在列表内的元素上,而不是容器元素上
进入/离开动画
一个<TransitionGroup>对一个“v-for”列表添加进入/离开动画的示例:
<script setup>
import {ref} from 'vue'
const items = ref([1,2,3,4,5])
const addValue = ref(6)
function addToRandomPosition() { const randomIndex = Math.floor(Math.random() * (items.value.length + 1)); items.value.splice(randomIndex, 0,addValue.value);addValue.value += 1;
}
function removeRandomElement(arr) { if (arr.length === 0) { return null;} const randomIndex = Math.floor(Math.random() * items.value.length); items.value.splice(randomIndex, 1);
}
</script><template><div style="position:absolute;margin: 0px 200px;"><TransitionGroup name="fade" tag="ul"><li v-for="item in items" :key="item">{{ item }}</li></TransitionGroup><button @click="addToRandomPosition">随机添加一项</button><button @click="removeRandomElement">随机删除一项</button></div>
</template>
<style scpoed>
.fade-enter-from {transform: translateX(10px);opacity: 0;
}
.fade-leave-to{transform: translateY(-10px);opacity: 0;
}
.fade-enter-active,.fade-leave-active {transition: transform 0.5s, opacity 0.5s;
}
</style>
效果:
移动动画
上面的例子中有一些明显的缺陷:当某一项插入或移除时,它周围的元素会立即发生“跳跃”而不是平稳地移动(具体表现为:“坍塌式的插入、移除”,观感不好)
解决办法是,给“enter-active和leave-active添加一个v-move(对移动中的元素应用的过渡)”
给“leave-active添加一个absolute属性,让它脱离布局流,以便可以正确地计算移动的动画”
.fade-move, /* 对移动中的元素应用的过渡 */
.fade-enter-active,
.fade-leave-active {transition: all 0.5s ease;
}.fade-enter-from,
.fade-leave-to {opacity: 0;transform: translateX(30px);
}/* 确保将离开的元素从布局流中删除以便能够正确地计算移动的动画。 */
.fade-leave-active {position: absolute;
}
效果:
一个购物车飞跃例子
在电商等很多平台中,会有如下场景:
“点击某商品添加按钮,该商品会飞跃到购物车,并消失”
现在,我们尝试使用Vue简单模拟
思路如下:“点击按钮后,元素进行X和Y方向的移动,且逐渐缩小并消失”
<script setup>
import {ref} from 'vue'
const showAnimation = ref(false)
function startMove() {showAnimation.value = true//定时器用来隐藏小球,时间为小球动画时间setTimeout(() => {showAnimation.value = false},1000)
}
</script><template><div style="position:absolute;margin: 200px 200px;"><div style="border: 1px solid;height: 60px;width: 60px;"><Transition name="fade"><div class="small-ball" v-show="showAnimation"></div></Transition></div></div><button @click="startMove" style="position:absolute;top:200px;left:100px;">开始移动</button>
</template>
<style scpoed>
.small-ball {width:60px;height: 60px;background-color: red;border-radius: 50%;
}
/* 初始时小球应该先显示出来因此opacity为1 */
.fade-enter-from {opacity: 1;
}
.fade-enter-active {transition: all 1s ease;
}
/* 小球进入动画的位置和小球离开动画的开始位置应该一致 */
/* 因为小球是先从隐藏变为显示,再从显示变为隐藏 */
.fade-enter-to,.fade-leave-from {transform: translate(100px,100px) scale(0);opacity: 0;
}
</style>
效果:
相关文章:
Vue中使用<Transition>与<TransitionGroup>
目录 介绍 CSS过渡类 为过渡效果命名 CSS的transition CSS的transform 性能考量 出现时过渡 元素间过渡 过渡模式 使用Key属性过渡 和的区别 进入/离开动画 移动动画 一个购物车飞跃例子 介绍 传统HTML中,我们可以使用CSS属性:“animation”…...
Algorithms and Data Structures in C++ by Mohammed Yasir Eramangadan
MP4 创建 |视频:h264、1280720 |音频:AAC,44.1 KHz,2 通道 类型:在线学习 |语言:英文 字幕 |持续时间: 159 讲座 ( 10h 43m ) |大小: 3.5 GB “通过专家制作…...
2024广东省职业技能大赛云计算——构建CICD 部署2048小游戏
构建CI/CD 前言 题目如下: 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建,具体要求如下: (1)基于镜像maven:3.6-jdk-8构建项目的drone分支; (2)构建镜像的名称:…...
React 条件渲染
React 条件渲染 React 条件渲染是一种在 React 应用程序中根据不同的条件显示不同组件或内容的技巧。它是 React 响应用户输入、状态变化或数据变化的核心机制之一。本文将深入探讨 React 条件渲染的概念、用法和最佳实践。 目录 条件渲染的基本概念使用 JavaScript 运算符进…...
Hadoop生态圈框架部署(九)- Hive部署
文章目录 前言一、Hive部署(手动部署)下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…...
c语言的qsort函数理解与使用
介绍:qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活,可以对任意类型的元素进行排序,只要提供了比较函数即可。 qsort 函数原型及参数解释: void qsort ( void* base, //指向要排序的数组的首元素…...
Java 语言的起源发展与基本概念(JDK,JRE,JVM)
Java语言的起源 源起 Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡…...
03_变量
变量 var num 10; 变量的重新赋值 var num10; num 20; 变量提升 JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的…...
[论文阅读-综述]Supervised Speech Separation Based on Deep Learning: An Overview
基于深度学习的监督语音分离:综述 出版:IEEE 核心:使用语音分离将目标语音信号与噪声混合分离的计算 本文用于对该文章的学习,主要是对内容的理解翻译与笔记 1. 语音分离介绍 语音分离的目标:将目标语音与背景干扰分…...
群控系统服务端开发模式-应用开发-邮箱配置功能开发
邮箱配置主要是将管理员数据做归属。具体见下图: 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_mail (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,title varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
android studio引用so库
在工程中编译好的so库文件将在原始编译工程对应目录下:build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示,包含生成的四个版本,每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...
2024年信号处理与神经网络应用(SPNNA 2024)
会议官网:www.spnna.org 会议时间:2024年12月13-15日 会议地点:中国武汉...
wxWidgets-ImageView
wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...
第1章-JVM和Java体系架构
虚拟机 虚拟机概念 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box,VMware就属…...
windows 服务器角色
windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息,防止未授权使用。AD RMS 将建立用户标识,并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
C#中判断两个 List<T> 的内容是否相等
ET实现游戏中邮件系统逻辑思路(服务端)_游戏邮件系统设计-CSDN博客 场景:今天遇到一个BUG,在服务器重启的时候(体验服),玩家之前接收的邮件又重新接收了一次,但是两封邮件的ID是不同…...
Linux环境下配置neo4j图数据库
1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装(jdk1.8不够用) 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…...
Windows 11 搭建 Docker 桌面版详细教程
在当今的软件开发与部署领域,Docker 已成为一项极为重要的容器化技术。它能够让开发者轻松地打包应用及其依赖项,实现跨环境的一致性运行,大大提高了开发效率与部署的便捷性。本教程将详细介绍在 Windows 11 操作系统上搭建 Docker 桌面版的具…...
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks) 前言一、什么是钩子?二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…...
dns 服务器简单介绍
dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里…...
Neo4j图形数据库-Cypher中常用指令
一、创建与修改 1.1 create 创建图数据库中的节点、关系等元素: CREATE (:Person {name: "Alice", age: 30}) CREATE (p1:Person {name: "Bob"})-[r:KNOWS]->(p2:Person {name: "Charlie"})批量创建元素 CREATE (n1:Node),(n2…...
linux安全管理-防火墙配置
1. 开启系统防火墙 1、检查内容 检查操作系统是否开启防火墙; 2、配置要求 操作系统开启防火墙; 3、配置方法 systemctl status firewalld ##查看系统防火墙运行状态 systemctl start firewalld ##启动防火墙 systemctl restart firewalld ##重启防火墙…...
什么是BIOS
BIOS(Basic Input/Output System,基本输入输出系统)是计算机启动过程中的一个关键组件,主要负责硬件的初始化和系统的引导。以下是关于 BIOS 的一些详细信息: 1. 基本功能 硬件初始化:当计算机启动时&…...
c++视频图像处理
打开视频或摄像头 打开指定视频 /*VideoCapture(const String &filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference:读取数据时设置的属性*/ VideoCapture video; //定义一个空的视频对象 video.open("H:/BaiduNetdiskDownlo…...
音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域
注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 当TS Header中的adaptation_field_control属性的值为10或11 时,TS Header包含adaptation field(适配域): 根据《T-RE…...
基于stm32单片机的教室节能系统设计
功能描述 0. STM32F103C8T6单片机为控制核心 1. OLED液晶显示当前年 月 日 时 分 秒 星期 2. 按键可以设置定时时间 3. 按键可以设置用电开关的开启和关闭时间,实现设备的节能 4. 通过红外遥控可以打开关闭空调设备(通过继电器开关闭合模拟&#x…...
mini主机通过内网穿透做成服务器
文章目录 简介1.ubuntu 的ssh server 安装2.ubuntu 的docker 安装3.ubuntu的curl的安装4.ubuntu的frp客户端安装5.ubuntu的docker compose安装6.声明 简介 主要目的 本地设备做成服务器,实现ssh远程登录以及内网穿透设备总成本1千多元(其实部分设备可以…...
智能桥梁安全运行监测系统守护桥梁安全卫士
一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…...
莘县网站制作/seo竞价
说明前端 vue 框架不知不觉就这样火起来了,生态圈也是逐渐在完善,后台也是彻底分离了数据给前端,就类似ios 和安卓客户端一样,令人惊奇的是也拥有了前端路由这个概念,更令人兴奋的是用 webpack 打包解决了包和包依赖的…...
html 单页网站/百度霸屏培训
部署django项目常见的方式有三种: 1.在windows服务器中,采用IIS服务器进行部署。 2.在Linux服务器中,采用uwsginginx或者uwsgiapache的组合进行部署。 本文主要介绍在ubuntu20.04中采用uwsginginx的组合进行上线部署的方法。 第一步 安装uwsgi 1.首先启…...
做网站违法/冯耀宗seo课程
1、uptime从前到后分别为a、系统时间b、运行时间:从开机到现在一共运行了11daysc、连接数:1 user 。 每一个终端算一个连接d、load average:三个数分别代表1,5,15分钟内的系统平均负载。值越大。负载越重。通过运行队列中的平均进程数计算 2、…...
手机网站制作器/爱廷玖达泊西汀
pt-kill 是一个优秀的kill MySQL连接的一个工具,是percona toolkit的一部分,在因为空闲连接较多导致超过最大连接数、某个有问题的sql导致mysql负载很高时,都需要将一些连接kill掉,这个工具主要就是这个用途。参数–busy-time运行…...
网站运营岗位介绍/百度交易平台官网
位图就是用ps操作的,就是像拍照一样,色彩丰富。位图是由像素(点)组成的, 优点:就是像拍照一样,色彩丰富。非常真实。 缺点:放大失真 矢量图是由直线,曲线,矩形,圆通过数…...
windowxp做网站服务器/营销计划
一、前言 1、简介 在上一篇UART详解中,已经有了关于UART的详细介绍了,也有关于如何使用STM32CubeMX来配置UART的操作了,而在该篇博客,主要会讲解一下如何实现UART串口的发送功能。 2、UART简介 嵌入式开发中,UART串口通…...