web design uiOctober 30, 20268 min read

浅色模式背景色:为什么 #FFFFFF 不够用,以及该用的 8 种颜色

全白的屏幕没有地方表现层次。改用这个浅色模式背景色(白色卡片后面放 #F2F2F7),搭配更柔和的文字色、更深的强调色,以及可以直接交给开发的 8 个色值。

By Boone
XLinkedIn
Light Mode Background Color: Why #FFFFFF Isn't Enough, and 8 Colors to Use

最好的浅色模式背景色不是 #FFFFFF。把页面放在 #F2F2F7 这样的柔和灰色上,把白色留给上面的卡片,这样各个表面才有可以“浮起来”的底。下面讲讲全白屏幕为什么会失败、三个修正办法,以及可以直接交给开发的八种颜色。

为什么全白的屏幕会显得扁平

大多数设计师做浅色模式时,第一步就是把所有东西刷成白色。这是每个设计工具的默认填充色,也是每个浏览器的默认背景,所以感觉很“中性”。其实不是。这恰恰是唯一一个让你无法表现深度的选择。

卡片必须和它所在的页面看起来不一样。当两者都是 #FFFFFF 时,能用来区分它们的只剩边框或阴影,于是这两个细节被迫承担全部工作。再多加几张卡片,屏幕就变成一堆轮廓线的网格。

深色模式早就解决了这个问题。在那里,越亮的表面代表越高的层级,每一层都比下面一层亮一档。我们的文章 深色模式色彩系统 讲了这条色阶,深色模式设计 讲了调色板的其余部分。浅色模式在白色之上没有更亮的一档,所以需要换一招:把地板降低。

修正 1:页面从 #F2F2F7 开始

#FFFFFF 页面

页面和卡片都是 #FFFFFF

#F2F2F7 页面

页面 #F2F2F7,卡片 #FFFFFF

左:页面和卡片同色,卡片没有边缘。右:柔和的灰色页面,白色卡片因此突显出来。

#F2F2F7 是 iOS 放在分组列表后面的那种灰。它是浅色模式下 Apple 的 system gray 6,Apple 自己的指南也建议分组表视图使用分组背景色。设置 App 就是经典例子:淡灰色页面,白色行。

这一个改动就给了你地板和天花板。页面是地板,卡片和面板是天花板,两者之间的落差不用画一条线就能看见。

适用位置:

  • 页面背景,所有包含卡片、列表或分区的屏幕。
  • 分组列表和设置页,行是白色,间隙是灰色。
  • 白色卡片内部的输入框,可以用页面灰,让它们看起来是凹进去的。

如果你的屏幕只是一整篇白色长文,没有任何卡片,白色就没问题。这条规则是给由多个表面构成的界面用的。

修正 2:让阴影来托起层级

在深色模式里,层级高度靠更亮的颜色表达。在浅色模式里,表面保持白色,阴影变大。静止的卡片用小而柔和的阴影;浮在其上的菜单或对话框用更大、更柔的阴影。

两个习惯能让效果看起来对:

  • 用你的墨色给阴影染色,不要用纯黑。 与文字同色的阴影(原帖用的是 #1B1530,一种深紫罗兰色)看起来是界面的一部分。纯黑看起来像一块污渍。
  • 越大代表越高。 用一个四档的小色阶,从小到大,把每一档对应一个用途:卡片、抬起的卡片、菜单、对话框。然后永远不要发明第五档。
css
/* A starting point, not a platform spec. Tune the values to your brand. */ :root { --shadow-ink: 27 21 48; /* #1B1530 */ --shadow-sm: 0 1px 2px rgb(var(--shadow-ink) / 0.08); --shadow-md: 0 4px 12px rgb(var(--shadow-ink) / 0.10); --shadow-lg: 0 12px 32px rgb(var(--shadow-ink) / 0.14); } .card { background: #FFFFFF; box-shadow: var(--shadow-sm); } .menu { background: #FFFFFF; box-shadow: var(--shadow-md); } .dialog { background: #FFFFFF; box-shadow: var(--shadow-lg); }

灰色页面让这一切成立。在白色页面上,柔和的阴影几乎看不见,所以人们只好用更深的阴影或边框来补救。在 #F2F2F7 上,浅阴影就够了。

修正 3:柔化你的黑,再加深你的强调色

在白色或接近白色的页面上使用纯 #000000 文字,比必要的更刺眼,还会让旁边其他所有颜色显得无力。Material 3 把它的浅色文字调得更柔和了一档。

#1D1B20 文字

文字

#49454F 次要

次要文字

#A9A8AA 禁用

禁用,38%

同一种墨色衍生的三种文字颜色。禁用色就是 #1D1B20 的 38% 不透明度。
  • #1D1B20 用于文字。它是 Material 3 的 on-surface 颜色,近乎黑色,带一丝紫罗兰,在白色和灰色上都很协调。
  • #49454F 用于次要文字,比如说明、辅助提示和时间戳。依然容易阅读,又明显比正文安静。
  • 同一墨色的 38% 用于禁用的标签和图标。在白色上它会变成 #A9A8AA,Material 用的正是这个不透明度。禁用文字是唯一低对比度恰恰是目的的地方,WCAG 也对其豁免。

强调色需要相反的修正。一个在深色屏幕上很好看的明亮浅色品牌色,放到白色上就消失了。

#BB86FC

白色上的浅色强调色

#6200EE

白色上的深色强调色

同一色相,两种深度。浅紫色融进了页面;深紫色一眼就能看到。

#BB86FC 是 Material 深色主题的基准紫。放在白色上它几乎消失,而对于必须被识别为按钮或链接的元素,这是个问题。

#6200EE 是 Material 浅色主题的基准紫,同一家族,足够深,撑得住场面。构建浅色主题时,不要沿用深色主题的强调色。从同一色相里选更深的那一档。

8 种浅色模式颜色

点击任意色块即可复制色值。

浅色主题。点击颜色即可复制色值。
角色值用途
底色#F2F2F7页面,位于卡片和分组列表后面
卡片#FFFFFF卡片、面板、菜单、行
分隔线#E5E5EA行与行之间的线。不用于输入框边框
文字#1D1B20标题和正文
次要文字#49454F说明、辅助文字、时间戳
禁用#A9A8AA禁用的标签和图标(38% 不透明度的文字)
主色#6200EE按钮、链接、选中状态
错误#B00020错误文字、边框和图标

#E5E5EA 是 iOS system gray 5,适合做分隔线,因为分隔线只需要被注意到,不需要被阅读。输入框边框需要的更多。我们的文章 占位符与标签 给出了应该改用的边框颜色。

把这些交给你的开发

同样的八种颜色,写成 CSS 自定义属性:

css
:root { --color-base: #F2F2F7; --color-card: #FFFFFF; --color-divider: #E5E5EA; --color-text: #1D1B20; --color-text-secondary: #49454F; --color-text-disabled: #A9A8AA; --color-primary: #6200EE; --color-error: #B00020; } body { background: var(--color-base); color: var(--color-text); } .card { background: var(--color-card); } .caption { color: var(--color-text-secondary); } .card + .card { margin-top: 12px; } hr { border: 0; border-top: 1px solid var(--color-divider); }

如果你同时提供深色主题,请在 @media (prefers-color-scheme: dark) 下给这每个名称再设一个值,就像 深色模式 token 映射 里那样。名称不变,只换值,这样浅色模式才不会沦为“反色的深色模式”。

“容易看见”背后的数字

原帖说了“容易看见”和“很难看见”。为了让在评审中为这个选择辩护的人有据可依,这里是数字(WCAG 2 对比度,基于白色计算):

配对对比度结论
#FFFFFF 上的 #1D1B20 文字17.1 比 1远高于 4.5 比 1 的最低要求
#FFFFFF 上的 #49454F 文字9.3 比 1用作次要文字很舒适
#FFFFFF 上的 #A9A8AA 禁用2.4 比 1豁免,禁用本来就该安静
#FFFFFF 上的 #BB86FC2.65 比 1低于按钮形状所需的 3 比 1
#FFFFFF 上的 #6200EE7.63 比 1容易看见

还有一个值得知道的事实:Material 3 自己的浅色 surface 也不是 #FFFFFF,而是 #FEF7FF,一种几乎察觉不到的带色白。就连大多数团队当作默认的设计系统,也没有把屏幕刷成纯白。

FAQ

浅色模式最好的背景色是什么?

页面用 #F2F2F7 这样的柔和浅灰,上面的卡片用 #FFFFFF。灰色给白色表面提供了可以突显的底,所以你需要的边框和阴影更少。

#FFFFFF 是不好的背景色吗?

不一定,但全白的屏幕没有办法表现深度。卡片会融进页面,边框和阴影被迫承担全部工作。白色最适合用作表面的颜色,而不是整个屏幕的颜色。

#F2F2F7 是什么?

它是浅色模式下的 iOS system gray 6,是 Apple 在设置 App 等分组列表后面使用的灰色。Apple 建议分组表视图使用分组背景色。

白色背景上应该用什么文字颜色?

文字用 #1D1B20 这样柔和的近黑色,次要文字用 #49454F。两者都是 Material 3 的颜色,在白色和 #F2F2F7 上都很易读。

浅色模式下如何表现层级高度?

用阴影。在深色模式里,更亮的表面意味着更高,但浅色模式在白色之上没有更亮的一档,所以表面保持白色,阴影随高度变大。

强调色应该在浅色和深色模式之间变化吗?

应该。像 #BB86FC 这样的浅色强调色适合深色屏幕,但在白色上几乎消失。在浅色表面上,请使用同一色相更深的一档,比如 #6200EE。

来源

  • Apple Human Interface Guidelines,Color:#F2F2F7 在浅色模式下是 systemGray6(R242 G242 B247),分组背景色用于分组表视图。
  • Material 3 颜色角色,取自 androidx Compose 的 ColorLightTokens 和 PaletteTokens:on surface #1D1B20(Neutral10),on surface variant #49454F(NeutralVariant30),浅色 surface #FEF7FF。参见 Material color roles。
  • 禁用标签和图标的 0.38 不透明度来自 Material 3 组件 token。#1D1B20 在 #FFFFFF 上 38% 不透明度的结果是 #A9A8AA。
  • #BB86FC 和 #6200EE 是 Material 的基准深色和浅色主色。#B00020 是 Material 的基准浅色错误色。#E5E5EA 是浅色模式下的 iOS system gray 5。
  • WCAG 2.2, 1.4.3 Contrast (Minimum) 和 1.4.11 Non-text Contrast。比率使用 WCAG 相对亮度公式计算。禁用文字不受最低要求约束。
  • 阴影墨色 #1B1530 和四档阴影是我们自己的建议,不是平台数值。
  • 最初以轮播图形式发布于 UX Brainy。

Want a light and a dark theme designed as one system, not a theme and its inversion? Our team builds product UI and design systems that hold up in both.

Get Started

More from Brainy Papers

Keep reading