details与summary是原生HTML折叠面板,无需JavaScript即可实现展开收起,支持键盘和无障碍访问。基础用法中,details默认折叠,加open属性可展开;summary可含文字或内联元素。自定义样式需隐藏原生箭头并添加图标。JS操作时注意open属性与DOM属性的区别,toggle事件仅用户交互触发。嵌套建议不超过两层,兼容主流浏览器,

details 默认折叠,添加 open 属性可使其默认展开。
- summary 可包含文字、图标甚至内联元素(如 或 ),但不宜放置 等块级元素,否则会破坏语义与渲染。
- 点击 summary 触发切换,空格键和回车键均支持键盘导航,无障碍友好。
最简单的示例:
自定义 summary 的样式与箭头
浏览器为 summary 添加了默认箭头( / ▼),但不同浏览器样式各异,且直接用 CSS 伪元素 ::marker 覆写效果有限。更可靠的方法是:隐藏原生箭头,再自行添加图标。
操作要点:
- 使用 summary::marker { content: none; } 移除默认符号,注意 Safari 15.4+ 才稳定支持该技巧。
- 更兼容的方案:在 summary 内手动放置 ,再配合 details[open] .toggle-icon 切换旋转或内容。
- 特别提醒:不要用 float 或 display: flex 破坏 summary 的内联特性,否则可能影响点击区域。
示例:
配置选项
…
JS 控制展开状态的注意事项
虽然 details 通过 open 属性即可控制,但用 JavaScript 操作时容易踩坑:
- 直接设置 element.open = true 有效,但 DOM 中不会同步显示 open 属性(仅为 JS 属性变化)。
- 检测是否展开,应优先使用 element.hasAttribute('open'),而非 element.open —— 后者始终返回布尔值,但属性是否存在才是实际渲染的依据。
- 绑定 toggle 事件时注意:它仅在用户交互时触发,若用 JS 修改 open 不会触发该事件。如需监听所有变化,需手动调度事件。
示例:
const el = document.querySelector('details');
el.addEventListener('toggle', () => {
console.log('用户点击了 summary');
});
嵌套、性能与兼容性底线
details 允许嵌套,但过深层级会影响无障碍与触控体验。实际项目中,最多嵌套两层即可。
兼容性方面:IE 不支持,但 Edge 79+、Chrome 12+、Firefox 49+、Safari 6.1+ 均支持良好。
不推荐用 details 实现复杂动画——CSS transition 对 details 内容高度完全无效,因其本质是 display 切换,而非 height 动画。若有淡入、滑动效果需求,需配合 JavaScript 与 max-height 或 transform 模拟,此时直接使用 div + ARIA 反而更可控。
最后,重要提醒:不要将重要操作按钮或关键信息藏在默认折叠的 details 中——用户可能根本看不到。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述