系统强制的高对比模式可能覆盖自定义颜色导致设计失真
别名: 强制色彩 · Windows contrast themes · forced-colors
概念解释
操作系统可以把页面上的自定义颜色换成一套系统高对比色板。按钮的品牌底色可能变成系统背景,描边可能消失,依赖品牌色才能看见的图标会一起没。强制高对比(forced colors)不是产品主题里的又一个深色开关,它会覆盖你写的颜色。设计在这一模式下失真是预期机制,要处理的是失真之后信息还在不在,而不是保住品牌色。
测了产品内的深色主题,不等于测了系统强制高对比。两套开关改写颜色的方式不同。
机制
强制色彩把 CSS 颜色映射到有限的系统色(文本、背景、链接、按钮边、高亮)。映射会丢掉你选的色相,只保留「这是文本 / 这是背景 / 这是按钮」这类角色。用背景色当唯一边界的卡片,映射之后可能与页面背景变成同一系统色,边界蒸发。用 box-shadow 当焦点环的控件,阴影往往不在映射表里,焦点图形会一起蒸发。为了保住品牌而写 forced-color-adjust: none 等于拒绝用户的对比色板,把强制模式的意义抵消掉。
失真本身不是缺陷。缺陷是:映射之后,按钮不再像按钮、链接不再像链接、焦点不再可见、状态不再可分。系统给的那几个角色色,必须还够用来辨认零件。
怎么研究
在 Windows 对比主题(或浏览器的强制色彩仿真)下打开产品,对照一张「自定义色被映射之后还剩下什么」的清单:按钮边、输入边、焦点、链接下划线、选中态、图标。
自变量:是否启用强制色彩、是否用 forced-color-adjust: none 锁住色板、控件边界是否依赖阴影或纯填充。
因变量:零件在映射后是否仍可辨认、焦点是否还在、有多少控件与背景融成一块。
不要只截一张首页。表单、菜单、对话框、选中的标签页在映射下失败率更高。把系统高对比与产品深色主题交叉:有人两套都开,有人只开系统那套。
边界
macOS 的增加对比度、iOS 的智能反转,与 Windows 对比主题不是同一管道,不能用其中一种代替另一种的结论。印刷、原生游戏全屏、部分 Canvas / WebGL 内容不受 CSS 映射约束,要走它们自己的高对比路径。用户选的是「低对比」而不是高对比时,这条覆盖机制不适用。邮件客户端对 HTML 邮件的强制色彩支持参差,网页上过了不等于收件箱里过了。
怎么落地
- 在系统强制高对比下验收:控件要用系统能映射的边或焦点线,不要把唯一边界做成阴影或纯品牌填充。
- 不要为了保住品牌色而关闭强制色彩调整;品牌在这一模式下本来就会让路。
- 链接、焦点、选中在映射后仍要有非色相的形状(下划线、环、对钩),因为色相已经被换成系统色。
- 验证:打开系统对比主题,走完登录或结账。每一个与背景融掉的按钮、每一个看不见的焦点、每一处关掉强制调整才「恢复」的品牌块,记为失真后信息丢失。