javascript实现树形菜单折叠展开动画的核心是用max-height过渡配合动态高度计算,通过toggle类切换、scrollheight测量和requestanimationframe确保平滑,同时兼顾可访问性与兼容性。

JavaScript DOM 操作实现树形菜单的折叠与展开动画,核心在于控制子菜单的 height 或 max-height 过渡、配合 CSS 动画,并通过类名或属性标记节点状态。关键不是“隐藏/显示”,而是“渐变高度”——这需要准确获取子菜单内容高度并动态设置。
用 max-height + CSS 过渡实现平滑动画
这是最常用且兼容性好的方式,避免直接操作 height: auto(它无法过渡)。原理是:给子菜单设一个足够大的 max-height 值(如 500px),再用 transition 过渡该属性。
示例结构:
CSS 设置:
.submenu {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-in-out;
}
.submenu.open {
max-height: 500px; /* 需大于实际内容高度 */
}
JavaScript 控制逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 点击
.toggle时,找到紧邻的.submenu - 检查是否已含
open类:有则移除,无则添加 - 为避免极端内容高度超出预设值,可先临时设
max-height: none获取真实高度,再设回具体像素值(见下一点)
动态计算真实高度以提升健壮性
当子菜单项数量不确定(比如异步加载、可增删项),固定 max-height: 500px 可能不够或过大,影响动画效果。此时可在 JS 中动态测量:
- 先移除
max-height(设为none),强制浏览器重排,读取scrollHeight - 立即设回
max-height: 0(触发收缩起点) - 使用
requestAnimationFrame确保样式已应用,再设目标高度(scrollHeight) - 动画结束后,清除内联
max-height,回归 CSS 控制
简化代码示例:
function toggleSubmenu(submenu) {
const isOpen = submenu.classList.contains('open');
if (isOpen) {
submenu.style.maxHeight = submenu.scrollHeight + 'px';
requestAnimationFrame(() => {
submenu.style.maxHeight = '0';
submenu.classList.remove('open');
});
} else {
submenu.style.maxHeight = '0';
submenu.classList.add('open');
requestAnimationFrame(() => {
submenu.style.maxHeight = submenu.scrollHeight + 'px';
});
}
<p>// 动画结束后清理内联样式
submenu.addEventListener('transitionend', () => {
if (!submenu.classList.contains('open')) {
submenu.style.maxHeight = '';
}
}, { once: true });
}</p>
用 height + getComputedStyle 实现更精准控制
若需更高精度(例如支持 margin/collapse),可用 height 替代 max-height,但必须手动处理 auto → px 的过渡起点:
- 初始设
height: 0; overflow: hidden; - 展开前:先设
height: auto,读取offsetHeight,再设回height: 0 - 接着设
height: [目标值]px触发动画 - 收起时直接设
height: 0
注意:此方式在元素含 padding/border 时需额外处理 box-sizing,推荐统一用 border-box。
辅助体验优化点
让交互更自然、可访问:
- 为
.toggle添加aria-expanded属性,值随展开状态同步("true"/"false") - 用
aria-controls关联子菜单的id,提升屏幕阅读器支持 - 禁用过渡期间阻止重复点击(如加
data-transitioning标记) - 键盘支持:Enter/Space 键触发切换,方向键可选中子项(进阶)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










