新闻中心
如何用css animation制作折叠菜单展开动画
用CSS animation实现折叠菜单动画需通过max-height和opacity变化配合keyframes,结合JS控制类名切换状态。首先设置.menu-list默认max-height:0并隐藏溢出,定义expand和collapse两个关键帧动画分别处理展开与收起的过渡效果,其中expand从max-height:0到500px并增加透明度,collapse反之。当点击按钮时,J*aScript为.menu-list添加或移除expanded类,触发动画。为适应不同内容高度,可将max-height设为较大值如999px以兼容动态项数,同时确保overflow:hidden防止内容溢出。最终通过animation的forwards保持动画结束后的状态,实现平滑展开收起效果。

制作折叠菜单的展开动画,关键在于用 CSS 控制高度变化并配合 transition 或 animation 实现平滑效果。虽然使用 transition 更常见也更简单,但如果你希望用 CSS animation 来实现,下面是一个实用方案。
1. 基本结构:HTML 搭建菜单
先写一个简单的折叠菜单结构:
<div class="menu">
<button class="menu-toggle">展开/收起</button>
<ul class="menu-list">
<li>菜单项 1</li>
<li>菜单项 2</li>
<li>菜单项 3</li>
</ul>
</div>
2. 使用 CSS animation 控制展开与收起
CSS 动画不能直接对 height: auto 做动画,所以需要设定一个最大高度(max-height),通过改变 max-height 触发动画。
定义两个状态的 animation:
- 展开时:从 max-height: 0 到一个足够大的值(如 500px)
- 收起时:反向动画
.menu-list {
max-height: 0;
overflow: hidden;
background: #f0f0f0;
list-style: none;
padding: 0;
margin: 0;
animation: collapse 0s forwards; /* 默认收起 */
}
<p>/<em> 展开动画 </em>/
@keyframes expand {
from { max-height: 0; opacity: 0; }
to { max-height: 500px; opacity: 1; }
}</p><p>/<em> 收起动画 </em>/
@keyframes collapse {
from { max-height: 500px; opacity: 1; }
to { max-height: 0; opacity: 0; }
}</p><p>/<em> 当添加展开类时触发展开动画 </em>/
.menu-list.ex
panded {
animation: expand 0.3s ease-in-out forwards;
}</p>3. 用 J*aScript 切换类名控制动画
通过 JS 添加或移除 expanded 类来触发动画:
青泥AI
青泥学术AI写作辅助平台
360
查看详情
document.querySelector('.menu-toggle').addEventListener('click', function() {
const list = document.querySelector('.menu-list');
if (list.classList.contains('expanded')) {
list.classList.remove('expanded');
} else {
list.classList.add('expanded');
}
});
点击按钮时,.expanded 类被添加,触发 expand 动画;再次点击则移除类,回到 collapse 状态。
4. 可选优化:避免 max-height 固定值问题
如果菜单项数量不确定,固定 max-height 可能不够灵活。可以结合 JS 动态设置:
- 在 JS 中计算实际高度
- 将 max-height 设为实际高度 + 动画时间
但若追求简洁,设一个较大的 max-height(如 999px)也能满足大多数场景,只要 overflow: hidden 能隐藏超出部分即可。
基本上就这些。用 CSS animation 做折叠菜单的核心是借助 max-height 和 opacity 配合 keyframes 实现视觉上的展开收起效果,再通过 JS 控制类名切换动画状态。不复杂但容易忽略细节,比如忘记 overflow: hidden 或 forwards 保留最终状态。
以上就是如何用css animation制作折叠菜单展开动画的详细内容,更多请关注其它相关文章!
# css
# 医疗网站建设好么
# 搜索关键词排名咨询g火14星
# 项目推广网站建设流程表
# 优秀seo
# 沈阳正规seo优化厂家
# 推广流量卡网站是什么
# 也能
# 选择器
# 如果你
# 是一个
# 背景色
# 设为
# 移除
# 如何用
# 菜单项
# 如何实现
# overflow
# ai
# ssl
# js
# html
# java
# javascript
# 折叠菜单
# 专业微信网站建设价格
# 神农架林区整合营销推广
# 安宁视频营销推广怎么做
# 合肥企业营销推广找哪家
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
mc.js免安装版 mc.js一键畅玩入口
韩剧圈正版入口页面_韩剧圈官网登录链接
限制HTML日期输入框的日期选择范围
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
优化Log4j2控制台输出性能:解决异步日志瓶颈
邮政快递包裹最新位置 邮政快递实时追踪入口
Android Studio计算器C键功能异常排查与修复教程
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
服务端验证_j*ascript输入检查
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
抖音从哪里进入网页版_抖音官方入口链接
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
解决Python logging 中 datefmt 导致时间戳固定不变的问题
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
将HTML动态表格多行数据保存到Google Sheet的教程
126邮箱账号注册 电脑版登录入口
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
微信网页版官方快速登录入口 微信网页版网页版账号直达
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
Lar*el Form Request中唯一性验证在更新操作中的正确实现
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
Python getattr() 异常处理深度解析:避免程序意外退出
《主播少女的秘密账号迷宫》首支宣传片
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
html5 app怎么运行环境_配html5 app运行环境【教程】
J*aScript Promise链中如何正确终止后续.then执行并处理错误
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
响应式容器内容自动缩放与宽高比维持教程
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
Golang指针如何与map组合使用_Golang map指针组合实践
Win11怎么关闭快速启动_Win11彻底关机设置教程
Go语言中JSON数据解析与字段访问教程
极兔快递快件信息查询系统 极兔快递官网运单号追踪
《噬血代码2》新预告片发布 展示游戏剧情
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
PHP中高效并行检查多链接状态的教程
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
如何提高微信支付的安全性_微信支付安全防护与设置建议
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId


2025-10-09
浏览次数:次
返回列表
panded {
animation: expand 0.3s ease-in-out forwards;
}</p>