本文详解如何通过 css `transition` 和合理状态控制,为水平排列的可折叠容器组实现流畅的展开/收起动画,解决 `flex-basis: auto` 与 `display: none/block` 无法过渡的核心痛点。
在构建响应式信息展示界面时,常需设计一组并排的“可展开容器”(如仪表盘卡片、知识库分类栏),点击任一标题时,该容器展开显示详情,其余自动收缩——但若直接使用 flex-basis: auto 或切换 display 属性,动画将失效。根本原因在于:CSS transition 不支持 auto 值和 display 的离散变化。
避免 auto → 使用确定数值
将 .collapsed 的 flex-basis 设为 0%(而非 auto),.expanded 设为 40%,确保 flex-basis 可被过渡。
避免 display: none ↔ block
改用 opacity: 0 + width: 0% + overflow: hidden 配合 transition: all 模拟隐藏/显示效果,保持动画连贯性。
统一过渡控制
对 .container 应用 transition: all 3s ease,覆盖 flex-basis、opacity、width 等关键属性;同时为 .opis 单独设置 transition: all 3s,确保文本区域宽度与透明度同步变化。
布局兜底优化
给 .row 添加 overflow-x: hidden,防止收缩时内容溢出造成滚动条闪烁;移除 animation: fadeIn(因其 forwards 行为与 transition 冲突),完全依赖 transition 实现更可控的渐变。
.row {
overflow-x: hidden; /* 防止收缩抖动 */
}
.container {
transition: all 3s ease; /* 同时过渡 flex-basis, opacity, width */
}
.container.collapsed { flex-basis: 0%; }
.container.expanded { flex-basis: 40%; }
.opis {
display: block; /* 始终可见,靠 width/opacity 控制表现 */
opacity: 0;
width: 0%;
max-width: 50%;
transition: all 3s ease;
}
.container.expanded .opis {
opacity: 1;
width: 50%;
}// 保持原有逻辑,仅需确保 class 切换正确
containers.forEach(container => {
const header = container.querySelector('.header');
header.addEventListener('click', () => {
containers.forEach(c => {
if (c !== container) {
c.classList.replace('expanded', 'collapsed'); // 更安全的替换
}
});
container.classList.toggle('expanded');
container.classList.toggle('collapsed');
});
});
用垂直堆叠布局(flex-direction: column),并调整 flex-basis 为 100%,保证体验一致性。通过以上调整,原本生硬的展开/折叠操作将变为丝滑的弹性动画——既符合现代 UI 动效规范,又无需引入 JavaScript 动画库,纯 CSS 即可达成专业级交互动效。
# css
# javascript
# java
# js
# ssl
# ai
# 移动端适配
# 排列
# overflow
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
c# 如何用c#实现一个支持优先级的任务队列
短链接还原php提示内存不足_调整PHP内存限制设置【技巧】
c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】
Win11怎么设置系统还原_Windows11系统属性保护设置
Python网络超时处理_健壮性设计说明【指导】
php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】
MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】
为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
零基础学会Python自动化办公_高效处理Excel与PDF文档
Win11怎么开启专注模式_Windows11时钟应用Focus Session
VSC怎么创建PHP项目_从零开始搭建项目的步骤【操作】
Python 模块的 __name__ 属性如何由导入方式决定?
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
Python装饰器设计思路_功能增强机制说明【指导】
c++如何获取map中所有的键_C++遍历键值对提取所有key的方法
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
mac怎么安装adb_MAC配置Android ADB开发环境【详解】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
Windows 10怎么录屏_Windows 10使用Xbox Game Bar录制屏幕视频教程
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
海外搜索引擎推广效果怎么样,怎么分析效果!
Go 中实现 Python urllib.quote() 功能的等效方法
Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Python与Docker容器化部署实战_镜像构建与CI/CD流程
Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】
LINUX如何删除用户和用户组_Linux userdel和groupdel命令用法【系统管理】
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
PyTorch DDP 多进程训练在 Kaggle 笔记本中的正确启动方式
如何使用Golang开发基础文件下载功能_Golang HTTP文件响应与缓存实现
Win11无法安装软件怎么办_Win11解除应用安装限制设置【修复】
Win10怎样安装PPT模板_Win10安装PPT模板教程【步骤】
如何使用Golang table-driven基准测试_多组数据测量函数效率
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Win10如何更改网络连接_Windows10以太网属性IP配置
How to Properly Use NumPy in VS Code
如何在Golang中处理模块包路径变化_Golang包重命名与导入方法
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】
Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】
Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】
c++如何利用doxygen生成开发文档_c++ 代码注释规范与HTML文档导出【案例】
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
Win11怎样安装企业微信_Win11安装企业微信教程【步骤】
如何在 Go 中创建包含 map 的 slice(嵌套数据结构)
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
2025-12-29
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。