details和summary是html5原生语义化标签,details为可折叠容器,默认收起,summary为其必选首子元素并作为点击触发标题;浏览器自动管理open属性切换、键盘操作及aria支持,无需javascript即可实现基础折叠交互。

details 和 summary 是什么,为什么能直接折叠
details 是 HTML5 原生的语义化标签,代表一个可展开/收起的交互式控件;summary 必须是它的第一个子元素,作为触发标题。浏览器自动为其添加展开状态管理、键盘支持(空格/回车切换)、ARIA 属性(如 aria-expanded),且默认不依赖 JS。
-
summary会自带一个三角形指示符(可通过details > summary::marker覆盖) - 点击
summary时,details元素会切换open属性的有无(不是布尔值,而是存在即为 true) - 不写
open属性时默认收起;加了就默认展开:<details open></details>
多个 details 怎么做成手风琴(点一个、其他自动收起)
原生 details 默认互不干扰,要实现手风琴效果,必须用 JS 监听点击并手动控制其他项的 open 属性。
- 所有
details需包裹在同一个容器里(如<div class="accordion">),便于批量操作<li>给每个 <code>details绑定click事件,触发时遍历同级所有details,清空它们的open属性,再给当前项设open - 注意:不要用
removeAttribute('open')后立刻setAttribute('open', ''),因为 DOM 可能未重排;推荐统一用element.open = true/false(更可靠)
示例关键逻辑:
document.querySelectorAll('.accordion details').forEach(panel => {
panel.addEventListener('click', () => {
document.querySelectorAll('.accordion details').forEach(p => p.open = false);
panel.open = true;
});
});
为什么不能对 details 做 height 过渡动画
因为 details 展开时高度由内容决定,CSS 的 transition: height 无法作用于 height: auto——浏览器不知道目标值是多少。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
你没法写
transition: height 0.3s并期望它平滑过渡替代方案只有两个:
• 改用max-height+overflow: hidden(需预估最大高度,比如max-height: 500px)
• 或放弃原生details,改用div+max-height+ JS 控制(才能真正做动画)如果只想要“展开后推移下方内容”,原生
details天然支持(因为它始终在文档流中),这点比纯 CSS 的max-height方案更稳
兼容性和容易被忽略的细节
Safari 在 15.4 之前对 details[open] > summary:focus 的样式支持有问题,focus outline 可能不显示;现在(2026 年)主流浏览器(Chrome/Firefox/Edge/Safari 15.4+)都已稳定支持。
-
summary里不能放交互元素(如button、a),否则点击这些子元素不会触发展开(浏览器会阻止冒泡) - 不要用
display: contents或visibility: hidden包裹summary,会导致语义丢失和键盘不可访问 - 如果内容含表单、视频或 iframe,展开后它们会正常加载/播放——这点和
display: none完全不同,要注意资源消耗
真正麻烦的从来不是“怎么让它动起来”,而是“怎么让它动得自然又不影响可访问性”。原生 details 在这两者间做了取舍:省代码、保语义、弃动画。选它,就得接受这个边界。










