阅读器、编辑器、仪表盘、监控大屏——用户长时间盯屏、或在低光环境使用,跟随系统能直接提升舒适度。
产品与设计 · 排版与视觉样式
深色模式Dark Mode
为亮色和暗色各写一套语义 token,并提供亮 / 暗 / 系统三种策略,组件只引用 token,对比度逐对复核——不是一层全局反色。
深色模式实验台:整套 token 成对切换
任务是为「CodeNow 工作台·设置卡」切主题。选亮色 / 暗色 / 系统三种策略,切到系统时用模拟偏好看物件跟随;再点「套全局反色滤镜」看图表、代码块和对比度一起塌。结果长在物件上——背景、正文、边框、图表、代码块、阴影↔边框都跟着切换。
任务:给这张「CodeNow 工作台·设置卡」切主题。选「亮色 / 暗色 / 系统」三种策略;切到「系统」时用模拟偏好看物件跟随;再点「套全局反色滤镜」看图表、代码块和对比度为什么一起塌。结果长在物件上——背景、正文、边框、图表、代码块、阴影↔边框、对比度徽章都跟着整块切换。
主题与对比度
正文、边框、图表与代码块都从语义 token 读取。
const theme = tokens.light;- 策略
- 系统
- 来源
- 跟随系统
- 实际渲染
- 浅色
- 阴影策略
- box-shadow
- 对比度
- AA 通过
通过。当前策略「系统」,跟随 prefers-color-scheme(模拟 light);物件实际渲染浅色主题——背景、正文、边框、图表、代码块全部从语义 token 成对切换,阴影在暗色由边框接管。对照:点「套全局反色滤镜」,看图表与代码块为什么塌。下一步:切到「系统」并切换模拟偏好,看物件是否跟随。
面板里读到的结论
刚才物件上整套 token 的切换,对应的是这几条主线:成对切换、阴影改边框、系统与手动策略、对比度独立复核、不用全局反色。
- 整套语义 token 切换:背景、正文、边框、图表、代码块在浅色与暗色各有一套值,组件只引用 token,不是把页面反色。
- 阴影在暗色失效:黑色阴影压在深背景上几乎看不见,改用边框 + 弱阴影维持轮廓和层级,而不是把阴影加得更黑。
- 三种策略:亮色、暗色是手动覆盖;系统模式读取 prefers-color-scheme,手动选择优先级高于系统。
- 对比度逐对复核:浅色达标的搭配在暗色不一定成立,正文、辅助文字、图表、代码块都要单独验收(WCAG AA)。
- 图表与图片要重取色:直接反色会让品牌色错位、图片发灰;要为暗色单独定图表色板或加半透明底。
- 禁用全局反色滤镜:filter: invert(1) 看似一行搞定,但破坏语义 token、图片和对比度,不可维护。
什么时候专门做深色模式
看到夜间/低光阅读、用户希望跟随系统、OLED 省电或长时间盯屏疲劳时做;只为跟风加一层反色、不愿重校对比度的场景别做。
品牌色密集的营销页、图片画廊、打印导出——这些场景重取色成本高、反色损失大,不如把浅色做扎实。
怎么从组件走到两套 token
从「这个组件在暗色下每个部位各应该是什么」倒推 token,再逐对验收。
- 定义语义 token:用 --bg、--text、--border、--chart-1、--code-bg 等角色名,而不是写死色值。
- 为浅色和暗色各写一套值:浅色一套、暗色一套,用 [data-theme] 或 prefers-color-scheme 切换变量。
- 提供亮 / 暗 / 系统三种策略:系统模式默认读 prefers-color-scheme,手动选择写入存储并覆盖系统。
- 组件只引用 token:背景、文字、边框、图表、代码块都从变量取值,不在组件里写色值。
- 为暗色重定阴影与图表:阴影改边框 + 弱阴影,图表色板单独取色,图片加半透明底或暗色版本。
- 逐对复核对比度:在两种主题下实测正文、辅助文字、链接、图表、代码块对各自背景的对比度。
盯这些关注点
做深色模式时常只盯「背景够不够暗」,图表错位、阴影被吞、对比度塌掉更容易出问题。
- 盯图表与图片:直接反色会让品牌色和图表错位;要为暗色单独取色或提供暗色版图片。
- 盯阴影被吞:黑色阴影在深背景上不可见;改边框或提亮表面色,而不是加深阴影。
- 盯对比度:浅色达标的文字在暗色可能发灰;辅助文字、链接、代码块要逐对验收。
- 盯系统与手动:系统模式要跟随偏好,手动选择要显示来源并持久化,刷新后按产品规则恢复。
- 盯反色滤镜:filter: invert(1) 是应急不是方案;它会破坏 token、图片和可访问性。
同一张设置卡:正例与反例
目标都是让工作台在暗色下可读。差异只在用「token 成对切换」还是「全局反色滤镜」。
浅色与暗色各写一套 token:背景、正文、边框、图表、代码块成对切换,阴影在暗色改边框 + 弱阴影;每个组件只引用 token,对比度逐对复核。
差异:token 切换,物件成对成立。一层反色滤镜把图片、图表、代码块一起反转,原配色发灰、品牌色错位、边框糊掉;对比度无法独立验收,用户头像和图片还会闪。
差异:只改一处——用反色滤镜代替 token 切换。快速自测
你接手一个有彩色图表、代码块和阴影弹层的页面,要做暗色模式。下面哪种做法能让图表、代码块和弹层在暗色下都成立?
继续查证
术语的技术定义和行为以这些一手或权威资料为准。
下一步学
和本知识点经常一起出现的概念。