details 折叠功能无需 JS,但需确保 summary 是 details 的首个子元素、用 summary::before 自定义箭头、通过 open 属性控制状态、手动暂停内部媒体,并注意 iOS Safari 兼容性及表单同步。

details 标签本身就能实现折叠,不需要 JS,但写错结构、加错 CSS 或忽略兼容性细节,就会点不动、不收起、图标错位甚至在 Safari 里默认展开关不掉。
summary 必须是 details 的第一个子元素
这是最常踩的坑。只要 内容 内容 DOM 解析时的“第一个子节点”必须是 直接改 summary 被 、
标题
标题
标题
summary 元素节点,不能是文本节点(包括换行、空格)。自定义箭头必须用
summary::before,别碰 ::marker
::marker 在 Safari ≤15.6、部分 Edge 和旧 Firefox 中不生效;::-webkit-details-marker 又只限 WebKit。统一用 summary::before 才能跨浏览器稳定显示和旋转。
summary { list-style: none; }
summary::before { content: "▶"; margin-right: 6px; transition: transform .2s; }
details[open] > summary::before { transform: rotate(90deg); }
summary 设 display: inline-block 或 float,会破坏点击热区JS 控制必须操作
open 属性,不是 style.display
style.display = 'block' 看似有效,但会绕过浏览器内置状态管理:屏幕阅读器读不出当前是否展开,toggle 事件不触发,键盘 Enter / Space 也无法切换。
el.open = !el.open 或 el.toggleAttribute('open')
el.addEventListener('toggle', () => console.log(el.open))
el.style.display = el.open ? 'none' : 'block'
open 属性初始值,需 JS 补:if ('open' in el && !el.hasAttribute('open')) el.open = false
折叠后的内容仍在运行,关键逻辑要手动暂停
details 只控制显隐,不暂停内部脚本、视频、音频或 iframe。比如折叠区域里有个 ,收起后依然在播放、消耗带宽。
toggle 事件,在 !el.open 时手动 .pause()、.remove() 或 .src = ''
details 包裹字段时,注意它不参与提交——需要同步状态得额外加
open,可能出现“先闪一下收起再展开”,建议用 CSS 配合 :not([open]) > *:not(summary) 提前隐藏
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











