标签中必须是其第一个直接子元素,否则无法触发展开收起;应使用toggle事件监听状态变化,而非click;默认展开用open属性,样式定制需注意浏览器兼容性。
单独写 不会生效,它只是 的第一个子元素,且浏览器只识别其作为触发器。如果 前面有其他内容(比如空格、换行或文本节点), 会忽略它,导致点击无反应或控制逻辑错乱。
点击展开
这里是隐藏内容
(此时一段说明
点击展开
隐藏内容
不被识别为控制节点) 是 的**直接子元素**且**排第一**;哪怕加个 在它前面也会失效浏览器对 内置了 ::marker(显示折叠/展开箭头),但它的渲染行为不统一:Firefox 支持 list-style: none 和 ::marker 控制,Chrome 目前仅部分支持 ::marker,Safari 则基本忽略样式修改。强行用 text-indent 或 padding-left 掩盖箭头容易导致点击热区偏移。
display: flex + justify-content: space-between 把文字和自定义图标分开布局summary {
list-style: none;
}
summary::marker {
content: "";
}(注意 Safari 16.4+ 才支持 ::marker,旧版需 JS 检测降级)background-image,避免字体图标在缩放时模糊或错位open 属性是布尔属性,写上即生效(如 ),但它和 JS 的 details.open = true/false 并非完全同步——比如通过 JS 设置后,再手动点击 summary,某些版本 Safari 会重置状态异常;另外,服务端渲染时若初始设 open,但 JS 后续又调用 details.toggle(),可能触发两次事件。
toggle 事件(不是 click):details.addEventListener('toggle', () => {
console.log('当前状态:', details.open);
}); 即可;需要“默认关闭但首次加载后自动展开”,请在 DOMContentLoaded 后执行 details.open = true,并确保没重复触发 天然支持键盘操作(空格/回车触发展开),但若用 div + JS 模拟,就得手动补 role="button"、tabindex="0"、aria-expanded 等,成本高且易出错。原生 是 WAI-ARIA 推荐的轻量级折叠组件,屏幕阅读器能正确播报状态变化。
加 onclick 或 addEventListener('click') —— 它已有完整交互逻辑),确保 details 展开后再聚焦,否则 Chrome 可能跳过未渲染的控件细
节在于 必须是 的第一个子节点,以及 toggle 事件才是状态变更的唯一可信信源。其他所有样式或 JS 干预,都该以不破坏这个前提为底线。