HTML原生折叠仅支持,轻量且无障碍友好但无CSS动画;需动画或兼容旧浏览器时,须用JS控制max-height或visibility+transform,但后者语义性差、适用场景受限。
HTML 本身没有原生的“展开/折叠”组件,必须靠 + 或 JavaScript 配合 CSS 实现;用原生 最轻量、无障碍友好,但样式和行为受限;需要自定义动画或兼容旧浏览器时,得自己写 JS 控制 max-height 或 display。
这是唯一被 HTML 标准支持的语义化折叠方案,自带 ARIA 属性、键盘支持(空格/回车触发)、无需 JS。
内容默认显示,点击后展开/收起 的其余子内容::marker 或 list-style 覆盖open 属性可默认展开:
height 无法过渡),如需淡入/滑动效果,必须换方案点击查看说明
这里是被折叠的详细内容,支持任意 HTML 元素。
t 实现带动画的展开收起当需要平滑高度过渡(比如从 0 → 自适应高度)时,不能直接对 height: auto 做 transition,得用 max-height 模拟,或用 JS 测量真实高度。
max-height: 0,溢出隐藏;展开时设为一个足够大的值(如 max-height: 500px),再用 transition 过渡height: auto,读取 offsetHeight,再设回 max-height 并触发 transitionmax-height 并设 overflow: hidden,否则影响布局const toggleBtn = document.querySelector('.toggle-btn');
const content = document.querySelector('.fold-content');
toggleBtn.addEventListener('click', () => {
const isOpen = content.style.maxHeight;
if (isOpen) {
content.style.maxHeight = '0';
content.style.overflow = 'hidden';
} else {
content.style.maxHeight = content.scrollHeight + 'px';
content.style.overflow = 'visible';
}
});
如果折叠区域高度固定(比如统一 120px),可以用 visibility + transform: scaleY() 实现带缩放感的展开动画,性能比 max-height 更好。
transform: scaleY(0) 配合 visibility: hidden 完全隐藏,且不占文档流transform 和 visibility(visibility 不能过渡,需配合 opacity 或延迟切换)scaleY(0) 会压缩内部文字,可能影响可读性
.fold-content {
transition: transform 0.3s ease, opacity 0.3s ease;
}
.fold-content.closed {
transform: scaleY(0);
opacity: 0;
visibility: hidden;
}
.fold-content.open {
transform: scaleY(1);
opacity: 1;
visibility: visible;
}
真正难的不是让内容“动起来”,而是处理边界情况:异步加载的内容高度未定、屏幕阅读器播报逻辑、键盘焦点管理、移动端点击穿透、动画中断时的状态残留——这些往往比写个 toggle 函数花的时间多得多。