当前位置: 首页 > article >正文

Vue动态高度展开收起组件:平滑过渡与自适应布局实战

1. 为什么需要动态高度展开收起组件在开发后台管理系统或者移动端应用时经常会遇到需要折叠内容的场景。比如一个长长的表单、一堆用户评论、或者一个复杂的配置面板。传统的做法是直接使用v-show或者v-if来控制显示隐藏但这样切换会显得很生硬用户体验不佳。更糟糕的是当内容高度不固定时简单的CSS过渡动画往往无法正常工作。比如一个评论区每条评论的长度可能都不一样直接使用max-height过渡会出现卡顿或者速度不一致的问题。这时候就需要一个能够动态计算高度并且实现平滑过渡的解决方案。我在实际项目中就遇到过这样的需求一个后台管理系统的配置面板里面的选项会根据用户权限动态变化导致每次展开时高度都不一样。最初用max-height硬编码了一个很大的值结果动画效果非常奇怪展开时快得像闪电收起时又慢得像蜗牛。2. 基础实现方案transition 动态高度计算2.1 核心思路解析要实现一个真正平滑的动态高度展开收起效果关键在于三点准确获取内容元素的真实高度在展开前要知道最终要过渡到的高度使用JavaScript动画库处理过渡CSS过渡对动态高度支持有限保持周边布局的协调性展开收起时不影响页面其他元素的布局这里我推荐使用velocity-animate这个轻量级动画库它比直接使用CSS过渡更灵活性能也更好。下面是一个基础实现template div classcontainer transition enterenter leaveleave before-leavebeforeLeave div v-showisExpanded classcontent refcontent !-- 动态内容区域 -- slot/slot /div /transition button clicktoggle{{ isExpanded ? 收起 : 展开 }}/button /div /template script import velocity from velocity-animate export default { data() { return { isExpanded: false, contentHeight: 0 } }, methods: { toggle() { this.isExpanded !this.isExpanded }, enter(el, done) { velocity(el, { height: this.contentHeight }, { duration: 300, complete: done }) }, beforeLeave(el) { this.contentHeight el.clientHeight }, leave(el, done) { velocity(el, { height: 0 }, { duration: 300, complete: done }) } } } /script style scoped .content { overflow: hidden; } /style2.2 关键点解析这个实现有几个关键点需要注意beforeLeave钩子在收起动画开始前先记录下当前内容的高度这样下次展开时就知道要过渡到什么高度overflow: hidden必须设置这个样式否则内容会在过渡期间溢出velocity的complete回调确保动画完成后Vue能正确更新状态我在实际使用中发现如果不使用beforeLeave记录高度而是每次都在enter中实时计算有时会因为DOM更新延迟导致高度计算不准确。这个坑我踩了好几次才找到原因。3. 进阶技巧与周边布局联动3.1 自适应布局问题单纯的展开收起效果实现起来不难但当这个组件是页面布局的一部分时就会出现新问题展开收起会影响周围元素的位置。比如下面这种常见布局------------------- | 头部 | ------------------- | | | 可折叠内容区 | | | ------------------- | 底部 | -------------------当中间的内容区展开收起时我们希望底部区域能平滑地上下移动而不是突然跳变。这就需要我们在做高度过渡的同时也调整底部区域的位置。3.2 实现方案这里的关键是要在高度变化时实时计算并调整相关元素的位置。我们可以利用Vue的响应式特性和CSS过渡来实现methods: { enter(el, done) { velocity(el, { height: this.contentHeight }, { duration: 300, progress: () this.updateLayout(), complete: done } ) }, leave(el, done) { velocity(el, { height: 0 }, { duration: 300, progress: () this.updateLayout(), complete: done } ) }, updateLayout() { // 根据当前高度实时更新周边布局 const contentHeight this.$refs.content.clientHeight this.$refs.footer.style.marginTop ${contentHeight}px } }在实际项目中我通常会把这个逻辑封装成一个mixin这样不同的布局组件都可以复用这个行为。特别是在移动端H5页面中这种平滑的布局调整对用户体验提升非常明显。4. 性能优化与边界情况处理4.1 减少重排重绘动态高度计算和布局调整会触发浏览器的重排(reflow)和重绘(repaint)如果处理不当会导致页面卡顿。经过多次实践我总结了几个优化点使用will-change提前告知浏览器哪些属性会变化.content { will-change: height; }节流高频操作如果内容高度会随窗口大小变化要适当节流避免同步强制布局不要在连续操作中多次读取布局属性4.2 处理动态内容变化有时候展开的内容本身也会变化比如异步加载更多数据。这时候需要特别注意高度重新计算的问题。我的做法是watch: { async contentData() { if (!this.isExpanded) return await this.$nextTick() this.contentHeight this.$refs.content.scrollHeight // 需要重新触发过渡动画 } }这里有个小技巧可以先用display: none隐藏内容区等高度计算完成后再触发动画这样用户不会看到闪烁。5. 与UI框架集成实践5.1 ElementUI集成方案如果项目中使用ElementUI可以直接使用它的el-collapse-transition组件这是官方提供的折叠过渡组件。不过它默认只处理高度过渡不处理周边布局调整。我通常会在它的基础上进行二次封装template div classcustom-collapse el-collapse-transition div v-showexpanded classcontent-wrapper div classcontent refcontent slot/slot /div /div /el-collapse-transition !-- 其他布局元素 -- /div /template5.2 响应式设计考虑在移动端还需要考虑横竖屏切换时的表现。我通常会添加一个resize观察器mounted() { this.resizeObserver new ResizeObserver(() { if (this.isExpanded) { this.contentHeight this.$refs.content.scrollHeight } }) this.resizeObserver.observe(this.$refs.content) }, beforeDestroy() { this.resizeObserver.disconnect() }这样无论内容是因为数据变化还是屏幕旋转导致尺寸变化高度都能及时更新。

相关文章:

Vue动态高度展开收起组件:平滑过渡与自适应布局实战

1. 为什么需要动态高度展开收起组件? 在开发后台管理系统或者移动端应用时,经常会遇到需要折叠内容的场景。比如一个长长的表单、一堆用户评论、或者一个复杂的配置面板。传统的做法是直接使用v-show或者v-if来控制显示隐藏,但这样切换会显得…...

利用CoPaw构建智能内容审核系统:识别违规与敏感信息

利用CoPaw构建智能内容审核系统:识别违规与敏感信息 1. 内容审核的挑战与机遇 在社交媒体和论坛平台上,每天都有海量的用户生成内容需要审核。传统的人工审核方式面临着巨大压力:审核员需要长时间盯着屏幕,处理大量重复性工作&a…...

(119页PPT)年终绩效考核与激励性薪酬设计(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 (119页PPT)年终绩效考核与激励性薪酬设计.pptx_智能仓储管理系统集成资源-CSDN下载 资料解读:(119 页)年终绩效考核与激励性薪酬设计 …...

RMBG-2.0与MySQL集成:图像处理结果存储方案

RMBG-2.0与MySQL集成:图像处理结果存储方案 1. 引言 电商平台每天需要处理成千上万的商品图片,背景去除是其中最关键的一步。传统的人工处理方式不仅效率低下,成本高昂,而且难以保证一致性。RMBG-2.0作为目前最先进的开源背景去…...

WuliArt Qwen-Image Turbo基础教程:Web UI界面功能逐项解析与操作逻辑

WuliArt Qwen-Image Turbo基础教程:Web UI界面功能逐项解析与操作逻辑 想体验极速文生图的魅力,却对复杂的参数和界面望而却步?今天,我们就来手把手拆解WuliArt Qwen-Image Turbo的Web UI界面。这个基于Qwen-Image-2512和Turbo L…...

为什么90%的Unity开发者都在用SQLite?这5个优势你必须知道

为什么90%的Unity开发者都在用SQLite?这5个优势你必须知道 在游戏开发的世界里,数据存储方案的选择往往决定了项目的可扩展性和维护成本。作为一名长期奋战在Unity开发一线的技术老兵,我见证了太多团队在数据持久化方案上的纠结与反复。今天&…...

8-MySQL_表的内连和外连

✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏: 小伞的主页: gitee:许星让 (xu-xingrang) - Gitee.com 制作不易!点个赞吧!!谢…...

使用OFA图像英文描述模型增强MySQL图像数据库的检索能力

使用OFA图像英文描述模型增强MySQL图像数据库的检索能力 1. 场景痛点与解决方案 你有没有遇到过这样的情况:公司图库里有几万张产品图片,老板让你找"那个红色背景的笔记本电脑海报",你只能一张张翻看,眼睛都快看花了&…...

Python+OpenCV图像去噪指南:如何用中值滤波拯救你的椒盐噪声照片(附完整代码)

PythonOpenCV图像去噪实战:中值滤波拯救椒盐噪声照片的完整指南 每次翻看手机相册时,那些被"雪花点"毁掉的重要照片总让人懊恼——毕业典礼上的集体照、旅行时抓拍的绝美瞬间,因为突如其来的噪点变得难以辨认。这种黑白杂点正是图像…...

Granite TimeSeries FlowState R1赋能智慧农业:大棚环境因子预测与自动调控

Granite TimeSeries FlowState R1赋能智慧农业:大棚环境因子预测与自动调控 最近和一位做现代农业的朋友聊天,他正为自家几十亩的智能温室大棚发愁。大棚里传感器装了不少,温度、湿度、光照数据实时都能看到,但问题来了&#xff…...

(学习笔记)3.6 控制(3.6.8 switch语句)

文章目录线索栏笔记栏1.跳转表:高效多重分支的核心2. 编译实现通用步骤(以图3-22/3-23示例 switch_eg为例)3. 跳转表数据结构(汇编片段)4. GCC对C语言的扩展(计算goto)5. 练习题练习题3.30练习题…...

Qwen-Image开源模型教程:RTX4090D镜像支持Qwen-VL与Whisper多模态对齐

Qwen-Image开源模型教程:RTX4090D镜像支持Qwen-VL与Whisper多模态对齐 1. 环境准备与快速部署 1.1 硬件与系统要求 在开始之前,请确保您的设备满足以下基本要求: GPU型号:RTX 4090D(24GB显存)操作系统&…...

Agentic AI技术挑战的人工智能治理,提示工程架构师如何参与?

当AI学会自己做决定:Agentic AI的治理挑战与提示工程架构师的破局之路关键词:Agentic AI、人工智能治理、提示工程、自主智能体、价值对齐、风险防控、决策透明性 摘要:Agentic AI(自主智能体)的崛起,标志着…...

Spring容器启动流程解析

lookup注解源码分析 核心功能概述lookup注解用于解决原型(prototype)作用域Bean在单例Bean中的依赖注入问题,每次调用带有lookup注解的方法时都会从Spring容器中获取一个新的Bean实例。实现原理Spring在创建Bean的过程中会检查方法是否标注Lookup。若存在该注解&…...

1985-2026.3人工智能专利数据库

参考《数量经济技术经济研究》乔刚(2025)关于人工智能专利识别与筛选的研究思路,本文依据国家知识产权局办公室印发的《关键数字技术专利分类体系(2023)》所界定的人工智能专利国际专利分类号(IPC&#xff…...

2001-2025年全国各省、市、县最低工资标准数据

数据简介 最低工资标准数据库是基于中国各省市人力资源和社会保障厅各年度所公布的最低工资标准文件整理而成的,反映我国各省市最低工资标准情况的专业数据库。 最低工资标准是劳动者在法定工作时间内提供正常劳动的前提下,企业用人单位依法支付给劳动…...

Spring Aop底层源码实现(一)

动态代理基础与实现 动态代理的作用在不修改目标类的前提下,为目标类的方法添加额外逻辑。两种代理方式:JDK动态代理与CGLIB代理JDK动态代理:基于接口,使用java.lang.reflect.Proxy。CGLIB代理:基于继承,适…...

智能排班系统在不同行业中的应用实践与价值分析

在现代企业管理体系中,排班管理是运营管理的重要组成部分。 无论是零售业、服务业还是制造业,科学合理的排班都是确保企业高效运营的基础。 然而,传统的手动排班方式由于效率低下、容易出错等问题,已经难以满足现代企业的管理需求…...

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动 你是不是也遇到过这样的烦恼?下载了一部精彩的海外剧集或者技术分享视频,但字幕文件总是对不上口型,要么快几秒,要么慢半拍,手动调整起来…...

m3u8live.cn 在线M3U8播放器,免安装高效验流排错

在直播、点播、Web视频、在线教育、IPTV等流媒体业务常态化的今天,HLS(HTTP Live Streaming)协议已成为跨平台流媒体传输的主流选择,而M3U8作为HLS协议的核心载体,其地址有效性、播放稳定性的快速验证,成为…...

leetcode 1437. 是否所有 1 都至少相隔 k 个元素-耗时100

Problem: 1437. 是否所有 1 都至少相隔 k 个元素 耗时100%,统计连续0的个数,若存在11返回false, 若k0返回false,若前后是10则频次1,若前后是00则频次累加cnt,若前后是01则计算最小值 Code class Solution …...

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南 你是不是也曾经对AI视频生成充满好奇,但一看到复杂的参数和不确定的结果就望而却步?或者已经尝试过Wan2.1,但生成的视频总是不尽如人意,不是画面模糊就是内容跑偏…...

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃 最近在折腾一个安卓录音应用的原型,核心目标很简单:让手机录出来的声音,能干净得像在专业录音棚里处理过一样。我们都知道,手机录音最大的敌人就是环境噪音——…...

如何通过淘宝API接口根据商品ID获取商品评论

淘宝开放平台(Taobao Open Platform)为开发者提供了丰富的API接口,允许开发者通过商品ID获取商品评论数据。这在电商分析、用户反馈收集等场景中非常有用。本文将逐步介绍如何实现这一功能,包括注册平台、调用API、处理响应等。整…...

Nanbeige 4.1-3B快速上手:树莓派5+USB GPU部署轻量像素终端可行性实测

Nanbeige 4.1-3B快速上手:树莓派5USB GPU部署轻量像素终端可行性实测 1. 项目背景与目标 Nanbeige 4.1-3B是一款轻量级的大语言模型,其独特的像素游戏风格对话界面让AI交互变得生动有趣。本文将探索如何在树莓派5这样的小型设备上,通过外接…...

美食点评平台测试用例

本文档基于项目需求,针对基于SpringBoot搭建的美食点评平台编写了100个测试用例(包含功能、安全、性能等方面)。测试用例覆盖了用户登录、商户查询、优惠券秒杀、用户关注/点赞、收藏等核心功能模块,并运用等价类划分边界值分析、…...

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南 1. 镜像核心优势与适用场景 Z-Image-Turbo是阿里达摩院推出的高性能文生图模型,基于DiT(Diffusion Transformer)架构开发。本镜像已预置完整的32.88GB模型权重文件&#xff0…...

【从零开始实现STM32步进电机驱动】(二)搭建硬件环境

1. 硬件准备全程自费无广,你买任何家的产品都可以,代码完全通用,只用到几个IO引脚而已。野火STM32F103C8T6核心板双USB野火小智DAP下载器模块42电机A4988电机驱动板A4988扩展板直流可调电压源洞洞板杜邦线2. 连接PA4→DIRPA5→STEPPA6→EN要点…...

ZigBee开发环境实战 -- IAR for 8051 10.30.1 安装与避坑指南

1. 为什么选择IAR for 8051开发ZigBee? 说到ZigBee开发环境搭建,很多新手都会纠结工具链的选择。我当年从STM32转向ZigBee开发时,花了整整两周时间对比各种方案,最终发现IAR for 8051 10.30.1这个版本在稳定性和兼容性上表现最好。…...

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码)

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码) 在嵌入式开发中,旋转编码器作为一种常见的人机交互输入设备,其稳定性和精确度直接影响用户体验。SIQ-02FVS3作为一款迷你型编码器,虽然体积…...