summary 样式难改因浏览器将其视为特殊控件:默认 display: list-item,::marker 兼容性差,padding/margin 不扩大点击热区,嵌套块元素会降级渲染;自定义图标推荐 ::before + transform 动画,互斥需 js 监听 toggle 事件,展开动画用 max-height 过渡,无障碍要求语义化文本与键盘可访问性。

summary 标签的样式改不动,不是你 CSS 写错了,而是浏览器对它的渲染机制太特殊——直接写 summary { padding: 10px; } 大概率失效,color 可能生效但 font-size 在 Safari 里常被忽略,display: block 甚至会破坏键盘可访问性。
为什么 summary 的样式总“不听使唤”
浏览器把 summary 当作一种特殊控件:Chrome/Safari 默认用 ::-webkit-details-marker 渲染三角,Firefox 129+ 才支持 ::marker,旧版 Firefox 几乎无视;它天生是 display: list-item,且点击热区严格绑定文字+原生图标区域。你加 padding 或 margin,很可能只撑开视觉区域,却不扩大实际可点击范围。
- 别指望
summary::marker { color: red; }能在所有浏览器生效——必须双写:summary::-webkit-details-marker { content: none; }和summary::marker { content: ""; } -
summary里嵌套<div> 或 <code><p></p>会触发降级为 inline 渲染,导致padding失效、热区断裂 - 想调大小?优先用
line-height+padding-inline,而不是height或display: flex - 用
summary::before插入 Unicode 箭头:content: "▶"; display: inline-block; margin-right: 8px; - 展开态切换靠
details[open] summary::before { transform: rotate(90deg); },不能写成summary:hover::before - 必须给
summary::before加transition: transform 0.2s ease;,且初始态写transform: rotate(0deg),否则第一次展开不触发过渡 -
transition: content完全无效——CSS 不支持对content做动画 - 监听
toggle,不是click——后者无法响应键盘(Space/Enter)操作 - 判断
detail.open再关闭其他项,避免用.removeAttribute('open'),否则 Safari 下可能触发二次toggle - 别用
other.open = false,这会再次触发toggle事件,形成循环 - 多个
details共享同一 DOM 查询结果,记得用Array.from()或展开运算符确保遍历的是实时节点列表 - 内容必须包在
<div class="details-content"> 里,不能直接放 <code><p></p>或<ul></ul> -
.details-content初始设max-height: 0; overflow: hidden;,展开时设max-height: 300px;(需预估或 JS 测量) -
summary文本必须语义明确,比如 “错误日志(7 条)”,而不是 “点击查看” - 键盘用户依赖 Tab → Space/Enter 触发,所以千万别加
pointer-events: none或覆盖onclick
如何安全地自定义 summary 的图标和状态动画
靠 ::marker 做图标最干净,但兼容性不够稳;::before 更可靠,但得手动控制位置和旋转逻辑。关键是:动画只能作用在伪元素上,且初始态必须显式声明 transform。
details 实现手风琴时,互斥逻辑为什么不能只靠 HTML
details 之间默认完全独立,加 name 属性在部分浏览器(如 Chrome)看似能互斥,但这是非标准行为,Safari 和 Firefox 并不识别。真正可靠的互斥,必须用 JS 监听 toggle 事件。
动画和无障碍最容易被忽略的硬约束
想加展开动画?height: auto 不能过渡,max-height 是唯一可行方案,但必须包裹一层容器,且值要略大于内容真实高度。而无障碍方面,summary 的文本就是屏幕阅读器播报的控件名,不是装饰。
真正麻烦的从来不是怎么让箭头转起来,而是转完之后,盲人用户是否知道它已展开、移动端手指是否点得中、Safari 里换行空格是否让整个交互失效——这些细节不处理,再漂亮的样式也是空中楼阁。











