Vue 3.0 Transition 组件使用详解

Vue 3.0 的 Transition 组件提供了一种简单的方式来为元素或组件的进入/离开添加动画效果。下面是使用<script setup>语法糖的实现方式。

1. 基本用法

使用场景:当需要为元素的显示/隐藏添加简单的淡入淡出效果时,这是最基础的过渡实现方式。

<template><!-- 按钮用于触发显示/隐藏状态切换 --><button @click="show = !show">Toggle</button><!-- Transition包裹需要动画的元素 --><Transition><p v-if="show">Hello Vue 3 Transition!</p></Transition>
</template><script setup>
import { ref } from 'vue'const show = ref(true)
</script><style>
/* * 定义过渡效果:* - v-enter-active/v-leave-active 定义过渡持续时间和缓动函数* - v-enter-from/v-leave-to 定义起始和结束状态*/
.v-enter-active,
.v-leave-active {transition: opacity 0.5s ease;
}.v-enter-from,
.v-leave-to {opacity: 0;
}
</style>

实现原理:当元素插入或删除时,Vue会自动在适当的时机添加/移除对应的CSS类名,从而触发CSS过渡效果。这种实现方式性能较好,适合大多数简单场景。

2. 自定义类名前缀

使用场景:当项目中存在多个不同的过渡效果时,为了避免类名冲突,或者需要更语义化的类名时使用。

<template><button @click="show = !show">Toggle</button><!-- 使用name属性定义前缀 --><Transition name="fade"><p v-if="show">Hello with custom name</p></Transition>
</template><script setup>
import { ref } from 'vue'const show = ref(true)
</script><style>
/* 类名前缀变为fade- */
.fade-enter-active,
.fade-leave-active {transition: opacity 0.5s ease;
}.fade-enter-from,
.fade-leave-to {opacity: 0;
}
</style>

最佳实践:建议为每个独立的过渡效果都定义特定的前缀,这样既避免了样式冲突,也提高了代码可读性。特别是当项目中使用多种动画库时,这种隔离尤为重要。

3. JavaScript 钩子

使用场景:当需要实现复杂的动画逻辑,或者需要与第三方JavaScript动画库(如GSAP)集成时使用。

<template><button @click="show = !show">Toggle</button><!-- 绑定各个动画阶段的钩子函数 --><Transition@before-enter="onBeforeEnter"@enter="onEnter"@after-enter="onAfterEnter"@enter-cancelled="onEnterCancelled"@before-leave="onBeforeLeave"@leave="onLeave"@after-leave="onAfterLeave"@leave-cancelled="onLeaveCancelled"><div v-if="show" class="box">Content</div></Transition>
</template><script setup>
import { ref } from 'vue'const show = ref(true)// 进入动画开始前的准备工作
const onBeforeEnter = (el) => {el.style.opacity = 0el.style.transform = 'scale(0.5)'
}// 执行进入动画
const onEnter = (el, done) => {// 使用requestAnimationFrame确保动画流畅requestAnimationFrame(() => {el.style.transition = 'all 0.5s ease'el.style.opacity = 1el.style.transform = 'scale(1)'// 监听过渡结束事件el.addEventListener('transitionend', done, { once: true })})
}// 其他钩子函数...
</script><style>
.box {width: 100px;height: 100px;background-color: #42b983;border-radius: 4px;
}
</style>

注意事项:使用JavaScript钩子时,必须确保在适当的时机调用done回调函数,否则过渡将无法正常完成。这种方式虽然灵活,但性能不如纯CSS实现,应谨慎使用。

4. 过渡模式

使用场景:当两个元素需要交替显示时(如标签切换、轮播图等),避免新旧元素同时存在导致的布局问题。

<template><button @click="toggleView">Toggle View</button><!-- 使用out-in模式确保当前元素先离开,新元素再进入 --><Transition mode="out-in"><component :is="currentView" :key="currentView.name"></component></Transition>
</template><script setup>
import { ref, shallowRef } from 'vue'
import CompA from './CompA.vue'
import CompB from './CompB.vue'const currentView = shallowRef(CompA)const toggleView = () => {currentView.value = currentView.value === CompA ? CompB : CompA
}
</script><style>
.v-enter-active,
.v-leave-active {transition: opacity 0.3s ease, transform 0.3s ease;
}.v-enter-from {opacity: 0;transform: translateX(30px);
}.v-leave-to {opacity: 0;transform: translateX(-30px);
}
</style>

模式选择:

in-out:新元素先进入,完成后当前元素离开,使用较少;

out-in:当前元素先离开,完成后新元素进入,更符合用户预期,使用较多;

5. 列表过渡

使用场景:当需要对v-for渲染的列表元素添加排序、添加、删除动画时使用。

<template><div class="demo"><button @click="addItem">Add Item</button><button @click="removeItem">Remove Item</button><button @click="shuffleItems">Shuffle</button><!-- TransitionGroup管理列表过渡 --><TransitionGroup name="list" tag="ul"><li v-for="item in items" :key="item.id" class="item">{{ item.text }}</li></TransitionGroup></div>
</template><script setup>
import { ref } from 'vue'
import { shuffle } from 'lodash-es'let id = 3
const items = ref([{ id: 0, text: 'Item 0' },{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' }
])const addItem = () => {items.value.push({ id: id++, text: `Item ${id}` })
}const removeItem = () => {if (items.value.length > 0) {const randomIndex = Math.floor(Math.random() * items.value.length)items.value.splice(randomIndex, 1)}
}const shuffleItems = () => {items.value = shuffle(items.value)
}
</script><style>
/* 进入/离开动画 */
.list-enter-active,
.list-leave-active {transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {opacity: 0;transform: translateY(30px);
}/* 确保离开的元素脱离文档流 */
.list-leave-active {position: absolute;
}/* 排序动画 */
.list-move {transition: transform 0.5s ease;
}/* 基础样式 */
.demo {max-width: 300px;margin: 20px auto;
}
.item {padding: 8px 16px;margin: 4px 0;background-color: #f3f3f3;border-radius: 4px;
}
ul {position: relative;padding: 0;list-style: none;
}
</style>

关键点:

1. 必须为每个元素设置唯一的key;

2. 使用list-move类处理排序动画;

3. 离开动画需要设置position: absolute避免布局问题;

4. 容器需要设置position: relative;

6. 与 CSS 动画库集成

使用场景:当需要快速实现复杂动画效果,或项目中使用专业动画库时。

<template><button @click="show = !show">Toggle</button><!-- 直接使用动画库的类名 --><Transitionenter-active-class="animate__animated animate__bounceIn"leave-active-class="animate__animated animate__hinge"><p v-if="show" class="demo-text">Using Animate.css</p></Transition>
</template><script setup>
import { ref } from 'vue'
import 'animate.css'const show = ref(true)
</script><style>
.demo-text {font-size: 24px;margin: 20px 0;color: #42b983;
}
</style>

优势:

1. 无需手动编写复杂动画;

2. 可以轻松实现专业级动画效果;

3. 跨浏览器兼容性好;

推荐库

1. Animate.css:提供大量预设动画;

2. Motion One:轻量级高性能动画库;

3. GSAP:专业级动画解决方案;

7. 性能优化建议

1. 优先使用CSS过渡:浏览器对CSS动画的优化更好,性能更高;

2. 使用transform和opacity:这些属性不会触发重排,动画更流畅;

3. 避免使用height/margin等属性:这些属性会导致布局重计算;

4. 合理使用will-change:提前告知浏览器哪些属性会变化;

5. 减少同时运行的动画数量:过多动画会消耗大量资源;

6. 使用硬件加速:对移动设备特别重要;

.animated-element {transform: translateZ(0);
}

通过合理使用这些技术,可以在保证用户体验的同时,确保应用的性能表现。

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

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

相关文章

代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)

图论part03 孤岛的总面积 代码随想录链接 题目链接 视频讲解链接 思路&#xff1a;既然某个网格在边界上的岛屿不是孤岛&#xff0c;那么就把非 孤岛的所有岛屿变成海洋&#xff0c;最后再次统计还剩余的岛屿占据的网格总数即可。 dfs&#xff1a; import java.util.Scanner…

C#自定义扩展方法 及 EventHandler<TEventArgs> 委托

有自定义官方示例链接&#xff1a; 如何实现和调用自定义扩展方法 - C# | Microsoft Learn 1.静态类 2.静态方法 3.第一参数固定为this 要修改的类型,后面才是自定的参数 AI给出的一个示例&#xff1a;没有自定义参数 、有自定义参数的 using System; using System.Colle…

Zephyr OS 中的 FIFO 接口应用介绍

目录 概述 1 FIFO的接口函数 1.1 K_FIFO_DEFINE函数 1.2 k_fifo_init函数 1.3 k_fifo_put函数 1.4 k_fifo_get 函数 1.5 k_fifo_is_empty 函数 2 应用验证 2.1 UART中使用FIFO范例 2.2 生产-消费类型范例 3 注意事项 3.1 内存管理 3.2 线程安全边界 概述 Zephy…

Spring Boot 集成 Elasticsearch【实战】

前言&#xff1a; 上一篇我们简单分享了 Elasticsearch 的一些概念性的知识&#xff0c;本篇我们来分享 Elasticsearch 的实际运用&#xff0c;也就是在 Spring Booot 项目中使用 Elasticsearch。 Elasticsearch 系列文章传送门 Elasticsearch 基础篇【ES】 Elasticsearch …

Win11下轻松搭建wiki.js,Docker.desktop部署指南(mysql+elasticsearch+kibana+wiki.js)

Docker.desktop部署wiki.js指南 前言环境和要求介绍提前准备 1. elasticsearch1.1 部署容器1.2 参数说明1.3 验证容器是否部署成功 2. kibana2.1 部署容器2.2 验证是否部署成功2.3 安装IK分词器 3. MySql3.1 部署容器3.2 增加数据库和wiki.js所需要的账号 4. wiki.js4.1 部署容…

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…

【论文阅读 | AAAI 2025 | FD2-Net:用于红外 - 可见光目标检测的频率驱动特征分解网络】

论文阅读 | AAAI 2025 | FD2-Net&#xff1a;用于红外 - 可见光目标检测的频率驱动特征分解网络 1.摘要&&引言2. 方法2.1总体架构2.2特征分解编码器2.3多模态重建机制2.4训练损失 3.实验3.1实验设置3.2主要结果3.3消融研究 4.结论 题目&#xff1a;FD2-Net: Frequency-…

CAU人工智能class3 优化器

优化算法框架 优化思路 随机梯度下降 随机梯度下降到缺点&#xff1a; SGD 每一次迭代计算 mini-batch 的梯度&#xff0c;然后对参数进行更新&#xff0c;每次迭代更新使用的梯度都只与本次迭代的样本有关。 因为每个批次的数据含有抽样误差&#xff0c;每次更新可能并不会 …

webpack 学习

webpack打包流程及原理 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器&#xff08;module bundler&#xff09;。在 Web 开发中&#xff0c;它主要用于将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;打包成浏览器可以直接运行的文件。Webpack 的核…

HTML5中的Microdata与历史记录管理详解

HTML5中的Microdata与历史记录管理解析 一、Microdata结构化数据 核心属性 itemscope 声明数据范围itemtype 指定数据词汇表&#xff08;如http://schema.org/Product&#xff09;itemprop 定义数据属性 <div itemscope itemtype"http://schema.org/Book">…

《算法笔记》11.7小节——动态规划专题->背包问题 问题 A: 装箱问题

【问题描述】 有一个箱子的容量为V&#xff08;V为正整数&#xff0c;且满足0≤V≤20000&#xff09;&#xff0c;同时有n件物品&#xff08;0的体积值为正整数。 要求从n件物品中&#xff0c;选取若干装入箱内&#xff0c;使箱子的剩余空间最小。 输入&#xff1a; 1行整数&a…

Compose笔记(二十五)--Brush

这一节主要了解一下Compose中Brush,在Jetpack Compose里&#xff0c;Brush是一个重要的 API&#xff0c;它用于定义填充图形的颜色渐变或图案&#xff0c;能够为界面元素添加丰富的视觉效果。简单总结如下: 1 常见场景 填充形状&#xff08;圆形、矩形等&#xff09; 创建渐变…

离线服务器Python环境配置指南

离线服务器Python环境配置指南&#xff1a;避坑与实战 0. 场景分析&#xff1a;当服务器与世隔绝时 典型困境&#xff1a; 无法访问国际网络&#xff08;如PyPI、Conda官方源&#xff09;服务器处于内网隔离环境安全策略限制在线安装 解决方案矩阵&#xff1a; 方法适用场…

Mac下载bilibili视频

安装 安装 yt-dlp brew install yt-dlp安装FFmpeg 用于合并音视频流、转码等操作 brew install ffmpeg使用 下载单个视频 查看可用格式 yt-dlp -F --cookies-from-browser chrome "https://www.bilibili.com/video/BV15B4y1G7F3?spm_id_from333.788.recommend_more_vid…

常见的实时通信技术(轮询、sse、websocket、webhooks)

1. HTTP轮询&#xff1a;最老实的办法 刚开始做实时功能时&#xff0c;我第一个想到的就是轮询。特别简单直白&#xff0c;就像你每隔5分钟就刷新一次朋友圈看看有没有新消息一样。 短轮询&#xff1a;勤快但费劲 短轮询就是客户端隔三差五地问服务器&#xff1a;"有新…

Elasticsearch Fetch阶段面试题

Elasticsearch Fetch阶段面试题 🚀 目录 基础原理性能优化错误排查场景设计底层机制总结基础原理 🔍 面试题1:基础原理 题目: 请描述Elasticsearch分布式搜索中Query阶段和Fetch阶段的工作流程,为什么需要将搜索过程拆分为这两个阶段? 👉 点击查看答案 查询流程…

vr制作公司提供什么服务?

随着科技的迅猛进步&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术已经悄然渗透到我们的日常生活与工作中&#xff0c;成为推动数字化转型的重要力量。VR制作公司&#xff0c;作为前沿领域的探索者和实践者&#xff0c;以专业的技术和创新…

COCO数据集神经网络性能现状2025.5.18

根据当前搜索结果&#xff0c;截至2025年5月&#xff0c;COCO数据集上性能最佳的神经网络模型及其关键参数如下&#xff1a; 1. D-FINE&#xff08;中科大团队&#xff09; 性能参数&#xff1a; 在COCO数据集上以78 FPS的速度实现了59.3%的平均精度&#xff08;AP&#xff0…

Sentinel原理与SpringBoot整合实战

前言 随着微服务架构的广泛应用&#xff0c;服务和服务之间的稳定性变得越来越重要。在高并发场景下&#xff0c;如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件&#xff0c;提供了从流量控制、熔断降级、…

Ubuntu 20.04 报错记录: Matplotlib 无法使用 OpenCV 的 libqxcb.so

网上查了一下这个报错&#xff0c;有很多解决方案&#xff0c;但是都不是针对 OpenCV 触发的这种 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in " */lib/*/site-packages/cv2/qt/plugins" even though it was found. 本文的方案是牺牲 …