Vue3的内置组件 -实现过渡动画 TransitionGroup

Vue3的内置组件 -实现过渡动画 TransitionGroup

是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果

支持和 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器,但有以下几点区别:

  • 默认情况下,它不会渲染一个容器元素。但你可以通过传入 tag prop 来指定一个元素作为容器元素来渲染。

  • 过渡模式在这里不可用,因为我们不再是在互斥的元素之间进行切换。

  • 列表中的每个元素都必须有一个独一无二的 key attribute。

  • CSS 过渡 class 会被应用在列表内的元素上,而不是容器元素上

基本用法
<template><button @click="addItem">增加item</button><button @click="removeItem">移除item</button><TransitionGroup name="list" tag="div"><div v-for="(item, index) in items" :key="item" :data-index="index">{{ item }}</div></TransitionGroup>
</template><script setup lang="ts">const items = ref(['Item 1', 'Item 2', 'Item 3']);const nextId = ref(4);const addItem = () => {items.value.push(`Item ${nextId.value++}`);};const removeItem = () => {items.value.pop();};
</script><style scoped>
.list-enter-active,
.list-leave-active {transition: all 0.5s;
}
.list-enter-from,
.list-leave-to {opacity: 0;transform: translateX(30px);
}
</style>
移动动画

上面的示例有一些明显的缺陷:当某一项被插入或移除时,它周围的元素会立即发生“跳跃”而不是平稳地移动。我们可以通过添加一些额外的 CSS 规则来解决这个问题

<template><button @click="addItem">在任意位置添加一项</button><button @click="removeItem">移除任意位置上的一项</button><button @click="shuffleItems">排序位置</button><TransitionGroup name="list" tag="div"><div v-for="(item, index) in items" :key="item" :data-index="index">{{ item }}</div></TransitionGroup>
</template><script setup lang="ts">const items = ref(['Item 1', 'Item 2', 'Item 3']);const nextId = ref(4);const addItem = () => {items.value.push(`Item ${nextId.value++}`);};const removeItem = () => {items.value.pop();};const shuffleItems = () => {items.value = items.value.sort(() => Math.random() - 0.5);};
</script><style scoped>
.list-group {display: flex;flex-direction: column;gap: 10px;
}.list-item {padding: 10px;background-color: #f0f0f0;border-radius: 4px;
}
.list-enter-active,
.list-leave-active,
.list-move { /* 对移动中的元素应用的过渡 */transition: all 0.5s;
}
.list-enter-from,
.list-leave-to {opacity: 0;transform: translateX(30px);
}
/* 确保将离开的元素从布局流中删除以便能够正确地计算移动的动画。 */
.list-leave-active {position: absolute;
}
</style>
自定义过渡组 class

你还可以通过向 传递 moveClass prop 为移动元素指定自定义过渡 class,类似于自定义过渡 class。
在 中,你可以通过以下属性来自定义过渡类:

  • enter-active-class:定义进入时的活动类。
  • leave-active-class:定义离开时的活动类。
  • move-class:定义移动时的类(用于列表项的重新排序动画)。
    这些类允许你自定义进入、离开和移动时的动画效果。
<template><div><button @click="addItem">Add Item</button><button @click="removeItem">Remove Item</button><TransitionGroupenter-active-class="custom-enter-active"leave-active-class="custom-leave-active"move-class="custom-move"tag="div"class="list-group"><divv-for="(item, index) in items":key="item":data-index="index"class="list-item">{{ item }}</div></TransitionGroup></div>
</template><script>
import { ref } from 'vue';export default {setup() {const items = ref(['Item 1', 'Item 2', 'Item 3']);const nextId = ref(4);const addItem = () => {items.value.push(`Item ${nextId.value++}`);};const removeItem = () => {items.value.pop();};return { items, addItem, removeItem };},
};
</script><style>
.list-group {display: flex;flex-direction: column;gap: 10px;
}.list-item {padding: 10px;background-color: #f0f0f0;border-radius: 4px;
}/* 自定义进入活动类 */
.custom-enter-active {animation: fadeIn 0.5s ease-out;
}/* 自定义离开活动类 */
.custom-leave-active {animation: fadeOut 0.5s ease-out;
}/* 自定义移动类 */
.custom-move {transition: transform 0.5s ease;
}/* 自定义动画 */
@keyframes fadeIn {from {opacity: 0;transform: translateX(-20px);}to {opacity: 1;transform: translateX(0);}
}@keyframes fadeOut {from {opacity: 1;transform: translateX(0);}to {opacity: 0;transform: translateX(20px);}
}
</style>
渐进延迟列表动画
  • 安装gsap库:
npm install gsap --save
  • 在组件中中引入gsap库:
import gsap from 'gsap';
  • 在组件中使用gsap库:
<script setup>
<template><input v-model="query" /><TransitionGrouptag="ul":css="false"@before-enter="onBeforeEnter"@enter="onEnter"@leave="onLeave"><liv-for="(item, index) in computedList":key="item.msg":data-index="index">{{ item.msg }}</li></TransitionGroup>
</template><script setup lang="ts">import { ref, computed ,unref} from 'vue'import gsap from 'gsap';const list = ref([{ msg: 'Hello' },{ msg: 'World' },{ msg: 'Foo' },{ msg: 'Bar' },{ msg: 'Baz' },]) const query = ref('')const computedList = computed(() => {return list.value.filter((item) => item.msg.toLowerCase().includes(unref(query)))
})const onBeforeEnter = (el: any) => {el.style.opacity = 0el.style.height = 0}
const onEnter=(el, done) => {gsap.to(el, {opacity: 1,height: '1.6em',delay: el.dataset.index * 0.15,onComplete: done})
}
const onLeave =(el, done) =>{gsap.to(el, {opacity: 0,height: 0,delay: el.dataset.index * 0.15,onComplete: done})
} 
</script>

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

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

相关文章

【软考-架构】14、软件可靠性基础

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 软件可靠性基本概念软件可靠性建模软件可靠性管理软件可靠性设计N版本程序设计恢复块设计&#xff08;动态冗余&#xff09;双机容错技术、集群技术负载均衡软件可靠性测试…

使用Python+OpenCV对视频抽帧保存为JPG图像

使用PythonOpenCV对视频抽帧保存为JPG图像 import os import cv2 import time#视频文件夹路径&#xff0c;可修改 videoPath D:\\video\\ #保存的图片文件夹路径&#xff0c;可修改 savePath D:\\images\\ videolist os.listdir(videoPath) if not os.path.exists(savePath…

学习整理在centos7上安装mysql8.0版本教程

学习整理在centos7上安装mysql8.0版本教程 查看linux系统版本下载mysql数据库安装环境检查解压mysql安装包创建MySQL需要的目录及授权新增用户组新增组用户配置mysql环境变量编写MySQL配置文件初始化数据库初始化msyql服务启动mysql修改初始化密码配置Linux 系统服务工具,使My…

DeepSeek预训练追求极致的训练效率的做法

DeepSeek在预训练阶段通过多种技术手段实现了极致的训练效率,其中包括采用FP8混合精度训练框架以降低计算和内存需求 ,创新性地引入Multi-head Latent Attention(MLA)压缩KV缓存以提升推理效率,以及基于Mixture-of-Experts(MoE)的稀疏计算架构以在保证性能的同时显著降低…

【计算机视觉】CV项目实战- 深度解析TorchVision_Maskrcnn:基于PyTorch的实例分割实战指南

深度解析TorchVision_Maskrcnn&#xff1a;基于PyTorch的实例分割实战指南 技术背景与核心原理Mask R-CNN架构解析项目特点 完整实战流程环境准备硬件要求软件依赖 数据准备与标注1. 图像采集2. 数据标注3. 数据格式转换 模型构建与训练1. 模型初始化2. 数据加载器配置3. 训练优…

x86系列CPU寄存器和汇编指令总结

文章目录 概要一、寄存器1.1、8086寄存器1.2、通用寄存器1.3、扩展寄存器 二、指令集三、x86指令集常见指令使用说明四、汇编4.1、汇编语法4.2、nsam汇编 五、参考 概要 在对学习Go的过程中&#xff0c;涉及到了汇编&#xff0c;因此对X86系列CPU的背景、寄存器、汇编指令做了一…

戴维斯双击选股公式如何编写?

戴维斯双击&#xff0c;指的是营收增长和净利润增长同步&#xff0c;并有超预期的财务状况。 戴维斯双击是指在低市盈率&#xff08;P/E&#xff09;时买入股票&#xff0c;待公司盈利增长和市盈率提升后卖出&#xff0c;以获取双重收益。以下是一个简单的通达信选股模型示例&…

前端面试宝典---vue原理

vue的Observer简化版 class Observer {constructor(value) {if (!value || typeof value ! object) returnthis.walk(value) // 对对象的所有属性进行遍历并定义响应式}walk (obj) {Object.keys(obj).forEach(key > defineReactive(obj, key, obj[key]))} } // 定义核心方法…

从“聋哑设备“到超级工厂:EtherCAT转Modbus协议网关正在重构工业未来

当全球工厂加速迈向工业4.0&#xff0c;您的生产线是否因Modbus设备“拖后腿”而被迫降速&#xff1f;无需百万改造&#xff01;无需淘汰设备&#xff01;一套EtherCAT从站转Modbus协议网关&#xff0c;让30年老机床与智能工厂实时对话&#xff0c;效率飙升300%&#xff01; 一…

Tauri文件系统操作:桌面应用的核心能力(入门系列四)

今天我们来聊聊Tauri中一个超级重要的功能 - 文件系统操作。这可是Web应用和桌面应用最大的区别之一。在浏览器里&#xff0c;出于安全考虑&#xff0c;我们对文件系统的访问被限制得死死的。但在Tauri桌面应用中&#xff0c;我们可以安全地访问用户的文件系统&#xff0c;这简…

Python解析地址中省市区街道

Python解析地址中省市区街道 1、效果 输入&#xff1a;海珠区沙园街道西基村 输出&#xff1a; 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)

基于Node+HeadlessBrowser的浏览器自动化方案

基于NodeHeadlessBrowser的浏览器自动化方案 什么是无头浏览器(Headless Browser)&#xff1f; 无头浏览器&#xff0c;就像是一个没有用户界面的浏览器程序。你可以想象它就是一个“隐形”的浏览器&#xff0c;只不过它没有图形界面&#xff0c;但能做我们用普通浏览器所能做…

AEB法规升级后的市场预测与分析:技术迭代、政策驱动与产业变革

文章目录 一、政策驱动&#xff1a;全球法规升级倒逼市场扩容二、技术迭代&#xff1a;从“基础防护”到“场景全覆盖”三、市场格局&#xff1a;竞争加剧与生态重构四、挑战与未来展望五、投资建议结语 近年来&#xff0c;全球汽车安全法规的加速升级正深刻重塑AEB&#xff08…

【Docker项目实战】使用Docker部署Caddy+vaultwarden密码管理工具(详细教程)

【Docker项目实战】使用Docker部署vaultwarden密码管理工具 前言一、vaultwarden介绍1.1 vaultwarden简介1.2 主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、拉取镜像五、…

第十六届蓝桥杯大赛软件赛省赛第二场

第十六届蓝桥杯大赛软件赛省赛第二场 大家好。最近参加了第十六届蓝桥杯大赛软件赛省赛第二场 Python 大学 B 组的比赛&#xff0c;现在来和大家分享一下我的解题思路和代码实现。以下内容是我自己写的&#xff0c;可能对也可能错&#xff0c;欢迎大家交流讨论。 试题 A&…

硬件须知的基本问题2

目录 1、典型电路 1. DC5V 转 DC3.3V 电路 2. 通信电路 2、STM32F103RCT6 最小系统如何设计搭建电路 1. 电源电路 2. 复位电路 3. 时钟电路 4. 下载电路 5. 单片机连接连接 3、请列举你所知道的二极管型号&#xff1f; 1. 整流二极管 2. 小信号二极管 3. 肖特基二极管 4. 超…

力扣HOT100——102.二叉树层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] /*** Definition for a bi…

CSS 定位学习笔记

一、定位概述 CSS 定位是控制 HTML 元素在页面中位置的核心技术&#xff0c;允许元素脱离正常文档流&#xff0c;实现复杂布局效果。 二、定位类型对比 定位类型属性值参考基准是否脱离文档流常用场景静态定位static无否默认布局相对定位relative自身原位置否元素微调绝对定…

Threejs中顶视图截图

Threejs中顶视图截图 一般项目中的每个模型&#xff0c;都需要有一张对应的图片&#xff0c;一般是顶视图&#xff0c;在对应的2D场景场景中展示。以下分享一个实现方式&#xff0c;先将清空模型材质的纹理&#xff0c;把颜色设置为白色&#xff0c;使用正交相机截取顶视图&am…

深度探索:DeepSeek赋能WPS图表绘制

一、研究背景 在当今数字化信息爆炸的时代&#xff0c;数据处理与可视化分析已成为众多领域研究和决策的关键环节。随着数据量的急剧增长和数据维度的不断丰富&#xff0c;传统的数据可视化工具在应对复杂数据时逐渐显露出局限性。Excel作为广泛应用的电子表格软件&#xff0c;…