← 全部文章

只用一个强调色

界面配色最容易失控的地方不是主色,而是主色的亲戚。把彩色压到只剩一种,剩下的麻烦会自动消失。

一只特立独行的熊猫 · · 约 3 分钟读完 · · #design #css

我做过一个后台系统,主色是蓝。上线之后,页面上陆续出现了:链接蓝、按钮蓝、标签蓝、图表蓝、进度条蓝、错误提示旁边的浅蓝。

它们其实是同一个蓝的七个变体,因为每次新增一个元素,都有人凭感觉挑一个「看起来差不多」的蓝。

这不是审美问题,是制度问题。

灰阶负责结构,彩色负责意义

一个界面的层次——背景、卡片、边框、正文、次要文字——全部由灰阶承担就足够了。人眼对明度差的区分能力远强于对色相的区分能力,八级灰阶能表达的层次,比八种近似的蓝要多。

彩色因此可以空出来,只承担一件事:告诉用户这里有可以做的事,或者这里出事了

于是规则变得非常短:

  • 可交互的强调:一种颜色
  • 语义警告:留给系统,不用主题色
  • 其余全部:灰阶

落地的时候会遇到什么

第一个问题:链接和正文怎么区分。

答案是不要靠颜色。链接用一条下划线,悬停时下划线变粗。颜色留给真正的强调,链接本身不需要额外喊叫。

.link {
  background-image: linear-gradient(var(--accent), var(--accent));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 1px;
  transition: background-size 0.22s ease;
}

.link:hover {
  background-size: 100% 2px;
}

第二个问题:选中状态怎么表达。

下划线、左边框、字重。三种都可以,选一种,全站一致。不要今天用背景块、明天用左边框。

第三个问题:深色模式。

这是单色方案真正的红利。因为只有一组灰阶和一个强调色,深色模式只需要重定义这几变量:

变量浅色深色
背景#FAFAF8#0C0C0D
卡片#FFFFFF#141417
正文#0E0E10#F1F1EE
次要文字#5A5A63#A3A3AC
强调#2F6B45#6FBF87

注意强调色在深色下要提亮。深绿放在黑底上对比度不够,读起来像没加载完。

那个颜色是怎么定的

规则说「只留一个强调色」,但它没有回答最难的那个问题:留哪一个。

我的方法是先确定背景的明度,再让强调色和它拉开足够的距离。

浅色主题的背景接近白。如果强调色也用高明度的绿,它会沉进背景里,所以浅色下要压暗成 #2F6B45——这样它和正文的对比度在 5:1 以上,既能做链接色,也能做按钮底色。

深色主题正好相反。背景已经接近黑,强调色必须提亮成 #6FBF87。黑底上的深绿对比度不够,读起来像没加载完。

这两个值不是同一个颜色的深浅变体,而是各自在自己的背景之上单独选出来的。用相同的色相保证它们是同一种颜色,用不同的明度保证各自都看得清。

还有一条额外的约束:这个颜色要能同时承担三种角色——文字色(链接)、描边色(聚焦圈)、填充色(按钮背景)。做填充时它要和文字配对,所以饱和度不能太高,否则色块上的字会糊成一片。

至于为什么是绿而不是蓝,有一部分是审美:这个站点想表达的是一种慢下来的气质,绿色比蓝色更接近它。但审美不能当唯一的理由,所以最终拍板的是上面那几条可以验证的约束——对比度达标、经得起当填充色、在深色主题里有对应的提亮版本。

约束带来的东西

限制颜色的另一个效果是:当你想强调一件事,你只剩一种手段。这会逼你把注意力放回内容本身——如果一句话需要靠红色加粗来让人注意,那多半是这句话写得不够清楚。

我现在判断一个界面配色是否失控,只看一个问题:页面上有几种颜色在抢注意力。答案是「一种」时,通常不用再改了。

全文完