深色主题上线后,折叠面板的标题文字经常整块消失。原因不在 details 本身,而在它默认继承系统控件样式,不跟随页面主题切换,背景变深而文字色未变。

四处必须显式声明
- 文字色与背景色。summary 与内容区各自给出明确取值,不依赖继承。
- marker 颜色。展开标记由
summary::marker或::-webkit-details-marker渲染,颜色跟随文字而非背景,需要单独设置。 - hover 与 focus 状态。系统控件的悬停与焦点反馈在自定义配色后失效,要手写。
- 子元素的背景与边框。内容区里的卡片、表格沿用浅色底色时会出现视觉断裂。
主题变量联动
:root {
--panel-bg: #ffffff;
--panel-fg: #1f2328;
--panel-border: #d0d7de;
}
:root[data-theme="dark"] {
--panel-bg: #161b22;
--panel-fg: #e6edf3;
--panel-border: #30363d;
}
details {
background: var(--panel-bg);
color: var(--panel-fg);
border: 1px solid var(--panel-border);
}
summary::marker { color: var(--panel-fg); }
summary:hover { background: color-mix(in srgb, var(--panel-fg) 8%, transparent); }
summary:focus-visible { outline: 2px solid #58a6ff; outline-offset: 2px; }
颜色全部走变量,主题切换时只改根节点的一组取值,不需要为每个组件写两套规则。
两个细节
- 去掉默认三角时不要顺手删掉 focus 样式,键盘可达性依赖这一条;
- 自定义标记用
list-style: none隐藏原有符号后,另加旋转图标表示展开状态,图标颜色同样走变量。
检查清单
- 两套主题下都能读清 summary 文字;
- 展开标记颜色与文字一致;
- 键盘 Tab 到 summary 时有可见焦点框;
- 内容区里的表格与卡片不留浅色底;
- 打印样式不继承深色取值。
