是唯一原生支持折叠/展开且语义正确、键盘可访问的HTML元素,无需JS即可实现;需确保为首个子元素,用open属性控制默认状态,样式定制应避开::marker而改用::before伪元素,互斥手风琴效果需JS监听toggle事件处理。

是唯一能不写 JS 就实现语义正确、键盘可访问、屏幕阅读器友好的折叠按钮的原生方案。其他所有“按钮式”做法(比如用 + JS 切换 display)都会破坏可访问性,且在 Safari 或 WebView 中容易失效。
为什么点不动?常见结构错误
不是浏览器不支持,而是 DOM 结构被悄悄破坏了:
-
必须是的第一个子元素——中间插个、注释、甚至空格都会让点击失效- 别把
当成普通按钮加onclick或手动设display: none,这会绕过浏览器原生折叠逻辑- 嵌套另一个
在部分 Safari 版本中不响应,多级菜单建议改用 JS +classList自定义箭头图标和展开动画的可靠写法
原生
::marker在 Safari 中不可靠,强行覆盖会失效。必须用::before替代:- 先隐藏默认箭头:
summary { list-style: none; } - 插入自定义图标:
summary::before { content: "▶"; transition: transform 0.2s; } - 展开时旋转:
details[open] summary::before { transform: rotate(90deg); } - 别给
设height过渡——它会压垮内部布局;需要高度动画就得切到 JS +max-height方案
需要“一键展开全部”或记忆状态怎么办
纯 CSS 无法持久化状态,但也不必全靠 JS:
- 用
+:checked ~ .item可实现“全局折叠/展开”,状态刷新不丢失(前提是input放 DOM 最前,且紧邻所有目标元素) - 若需 URL 参数控制初始展开(如
?faq=3),才值得用 JS 调用el.setAttribute('open', '')—— 注意 Safari 15.4 前不认el.open = true - 微信/QQ 内置 WebView(尤其安卓旧版)可能完全忽略
open属性,真机测试不能跳过
最易被忽略的点:折叠后仍能被 Tab 键聚焦的元素,必须同步设
tabindex="-1"和aria-hidden="true",否则对键盘和屏幕阅读器用户就是障碍。 - 别把
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











