你在作图软件里给所有卡片的正文都设成了同一个灰色,色值是 #666666,你确认过不止一次。但设计稿拼到一起之后,放在白色底上的卡片,文字看起来是正常的灰;放在浅蓝色底上的卡片,同样的灰看起来偏暖了,甚至有一点点发黄。你用取色器去吸,色值没错,确实是同一个 #666666。但眼睛可不这么认为。
于是你开始调色。给浅蓝背景上的灰加了一点蓝,看起来舒服多了。但这个调整过的灰放到白色背景上,又偏冷了。你再新建一个灰。两种背景各一个灰,后来又加了深色卡片的灰、浅灰卡片上的灰。设计稿里的灰色从一个变成四个,四个变成七个,每个色的色值只差一两个数字,你自己都分不清哪个该用在哪里。
这个过程里,你并没有犯任何设计错误。你的色值定义是对的,你的取色器也没坏。问题出在你和颜色之间的那个中间环节——你的视觉系统。它在你观察颜色的时候,主动改变了你的感知。这个现象有一个名字,叫同时对比。
要理解同时对比,得先知道人的视觉系统是怎么处理颜色的。
人眼不是一台精密的测色仪。测色仪看到 #666666 就输出 #666666,不管旁边放了什么颜色,结果都一样。但人眼不是这样工作的。人眼在接收颜色信息的同时,会自动拿当前颜色和它周围的颜色做比较,然后根据比较结果调整你的感知。这个调整不经过你的意识,你没办法控制它,也没办法关掉它。
这种机制在日常生活中其实非常有用。想象一下,你从一个明亮的室外走进一个昏暗的咖啡馆,如果你的眼睛不做调整,咖啡馆里所有东西都应该看起来是一片漆黑。但你走进去几秒钟后就能看清桌椅的颜色、墙面的质感、菜单上的文字。这是因为你的视觉系统根据环境光线重新校准了所有颜色的感知基准。你看到的不是颜色的绝对值,而是颜色之间的相对关系。
同时对比就是这个机制在微观层面的表现。当两个颜色紧挨着出现时,你的视觉系统会自动放大它们之间的差异。如果一个灰色旁边是深色,视觉系统会让灰色看起来比实际更亮;如果同一个灰色旁边是浅色,视觉系统会让它看起来比实际更暗。你看到的不是颜色"本来的样子",而是颜色"相对于周围环境的样子"。
这个过程发生在视网膜和大脑视觉皮层的信号处理阶段。视网膜上的感光细胞在接收光信号时,会受到周围细胞的抑制作用——旁边的细胞越活跃(接收的光越强),当前细胞的信号就会被压低。这种机制叫侧抑制。侧抑制让你感知到的颜色永远是一个"经过邻居影响"的版本,而不是颜色的物理真实值。
所以当你觉得"这两个灰色看起来不一样"的时候,你的判断在感知层面是对的——它们在你的视觉体验里确实不一样。但在物理层面,它们的色值没有任何变化。这个矛盾就是同时对比的核心。
同时对比不是只有一种效果。它会在明度、色相、饱和度三个维度上分别发生,每种表现在界面设计中造成的困扰各不相同。
明度对比是最常见、最容易感知到的一种。
拿一个中等灰色举例,比如 HSB 色彩模式下明度值 50% 的灰。把这个灰色放在一个深色背景上(明度 15%),你会觉得它相当亮,甚至有一点"发光"的感觉。把同一个灰色放在白色背景上(明度 100%),你会觉得它暗了不少,沉稳了很多。色值完全一样,但你的感知差异非常明显。

视觉系统在做的事情是:在深色环境里,它把你的感知基准拉低了,所以中灰色相对于基准显得亮;在浅色环境里,基准被拉高了,同样的中灰色相对于基准就显得暗。
这种效应在界面设计中出现的典型场景是跨背景复用颜色。比如你有一个页面,顶部是深色的 hero 区域,下面是白色的内容区域。两个区域都用了同一个灰色作为辅助文字色。在深色 hero 区域,这个灰色看起来清晰可读;到了白色内容区域,同样的灰色看起来变淡了,和背景的对比度感知上降低了。如果你为了让白色区域的灰色"看起来和上面一样深"而去调暗它,这个调暗后的灰色放到深色 hero 区域又会显得太重。
另一个常见场景是卡片设计。当卡片背景是白色,放在浅灰色页面背景上时,卡片内部的元素颜色看起来是一种感觉;同样的卡片放在深色模块里,内部颜色的感知立刻发生变化。你以为是卡片的配色出了问题,其实是卡片周围的环境变了。
色相对比比明度对比更隐蔽,也更容易让人困惑。
当一个颜色和另一个有明确色相的颜色紧挨在一起时,视觉系统会把这个颜色往相邻色相的反方向推。听起来有点抽象,用具体例子说:一块纯灰色(没有任何色相倾向,饱和度为零),放在蓝色背景上,你会觉得这个灰色微微偏暖,带一点黄橙的味道。把同一块灰色放在橙色背景上,你会觉得它微微偏冷,带一点蓝的倾向。灰色本身的色值没有变,但你的视觉系统在"减去"周围的颜色,结果就是让你感知到一个偏向互补色方向的色相偏移。

这种效应在界面设计中容易出问题的地方是导航栏和内容区的颜色衔接。假设你的产品用了一个蓝色的顶部导航栏,导航栏里的图标用了浅灰色。用户往下滚动后,同样的浅灰色图标出现在白色背景的工具栏里。因为导航栏的蓝色背景让灰色图标看起来偏暖,而白色背景上的灰色图标没有这个偏移,两组图标放在一起就会让人觉得颜色不统一。
色相对比还会影响中性色系统的感知。你精心定义了一组"无色相倾向"的灰色用于文字和分割线,但如果这些灰色频繁出现在某个彩色区域附近,它们在感知上就不再中性了。设计师有时候会说"我的灰色发蓝"或者"我的灰色发黄",很多时候不是灰色本身有色相偏移,而是周围的颜色通过同时对比"染"上去的。
饱和度对比的规律和前两种类似:视觉系统会放大相邻颜色在饱和度上的差异。
一个中等饱和度的颜色,放在高饱和背景上会显得灰、显得暗淡;放在低饱和或无彩色背景上会显得鲜艳、显得跳。这就是为什么你在作图软件里调好的品牌色按钮,放到纯白页面上觉得很醒目,但放到一个同色系的浅色背景板块里就觉得"融进去了",不够突出。按钮的颜色没变,但浅色背景板块本身带有一定的饱和度,拉低了你对按钮颜色饱和度的感知。

饱和度对比在数据可视化中也经常制造麻烦。仪表盘里如果有一个高饱和的图表区域紧挨着一个低饱和的图表区域,低饱和区域的颜色会被衬得更灰、更无力。如果这个低饱和区域传递的是重要信息,它的视觉存在感会被旁边的高饱和邻居"吃掉"。
饱和度对比还有一个容易被忽略的影响:它会改变你对颜色"活力"的判断。同一个绿色,在灰白色背景上你觉得它清新、有活力;在一个高饱和的插画旁边,你会觉得这个绿色有点脏、有点灰。不是绿色变了,是参照系变了。
在实际的界面设计中,明度对比、色相对比和饱和度对比很少单独出现。它们几乎总是同时作用在你的感知上,只是某一种的效果更明显而已。
比如一个中灰色文字放在蓝色卡片上,你同时会感受到三件事:灰色因为蓝色背景的中低明度而显得更亮(明度对比);灰色因为蓝色背景而微微偏暖(色相对比);灰色因为蓝色的饱和度而显得更加无彩色(饱和度对比)。这三种效应叠加在一起,你看到的"灰色"已经和它在白色背景上的样子差了很远。
理解这一点很重要,因为它意味着你在处理跨背景颜色问题时,不能只考虑一个维度。如果你只补偿了明度,但忽略了色相偏移,颜色看起来还是会"不对"。你需要判断在当前场景下,哪种对比效应是主导的,然后针对性地处理。
理解了原理之后,来看它在实际设计工作中具体会造成什么麻烦。
这是同时对比带来的最根本的认知冲击。设计系统里定义好的颜色,在不同的使用场景下看起来就是不一样。你没有搞错,色值确实是统一的,但用户看到的不是色值,是感知。
这意味着"颜色统一"这件事,不能只在色值层面保证。两个按钮用了同一个蓝色,但一个放在白色表单里,一个放在深色弹窗里,用户会觉得这是两种蓝。如果你的设计目标是让用户感知到"这两个按钮是同一种蓝",你可能需要在色值上做出差异来补偿感知上的差异。这听起来违反直觉,但这就是视觉系统的工作方式。
很多设计师在发现颜色"看起来不对"之后的第一反应是去调色值。这个反应在多数情况下会让事情变得更糟。
因为你调的不是颜色问题,而是感知问题。你给 A 背景上的灰色加了一点蓝来补偿色相偏移,但这个调整后的灰色到了 B 背景上又会产生新的感知偏差,你又要再调一次。每调一次就多一个色值,色板越来越臃肿,而且这些微调过的色值之间没有系统性的关系,维护成本越来越高。
更麻烦的是,当你的色板里有七八个"差不多的灰"时,团队里其他设计师根本不知道该用哪个。他们要么随便选一个,要么再创建一个新的。色板的混乱就是这么开始的。
同时对比还会在设计评审环节制造不必要的返工。评审人员看到两个区域的颜色"不一致",指出这是配色问题,要求设计师修改。设计师去查色值,发现是一样的,但又没办法向评审人员解释"这个不用改",因为评审人员看到的确实不一样。
如果设计师不理解同时对比,就会陷入一个循环:改了 A 区域的颜色让它在评审时看起来和 B 区域一致,但改完之后放到另一个页面上又不一致了。每次评审都在处理同一类问题,但每次的处理方式都不同,因为没有抓到问题的根源。
不是所有的同时对比效应都需要处理。有些情况下感知差异很小,处理它的成本远高于放着不管的代价。有些情况下感知差异确实会影响用户体验,必须介入。判断的依据凭借两个因素:感知差异有多大,以及这个差异会不会影响用户对信息的理解。
颜色在单一背景内使用,背景保持不变。 如果你的灰色文字只出现在白色背景上,不管它旁边有没有其他彩色元素,同时对比的影响都很有限。因为文字的背景是统一的,视觉系统的感知基准是稳定的。小范围的色相偏移(比如旁边有个蓝色图标导致灰色文字微微偏暖)在正常阅读距离下几乎不会被注意到。
同一页面内的背景差异很小。 如果你的页面背景是 #FFFFFF,卡片背景是 #FAFAFA,这两者之间的明度差非常小,同时对比在这个级别的差异下产生的感知偏移可以忽略不计。你不需要为卡片内部和卡片外部分别定义两套灰色。
颜色之间有足够的物理间距。 同时对比的强度和两个颜色之间的距离直接相关。颜色越紧挨在一起,对比效应越强;距离拉开之后,效应快速减弱。如果两个区域之间隔了足够的留白或者其他内容,即使它们的背景明度差很大,同时对比的影响也会大幅降低。
颜色差异不会导致信息误读。 即使同时对比让两个灰色看起来有一点点不同,但用户不会因此产生误解(比如不会以为一个是可点击的、一个是禁用的),那就不需要处理。判断标准不是"颜色看起来是不是完全一样",而是"颜色的差异会不会传递错误的信号"。
同一个颜色跨越了明度差异大的背景区域。 这是同时对比最容易造成明显问题的场景。一个灰色文字色同时出现在白色背景区域和深色背景区域时,感知差异会大到用户明确觉得"这不是同一个颜色"。如果你的设计意图是让它们看起来一致,就需要介入。
品牌色或功能色需要在深浅两种模式下保持视觉一致性。 品牌色在浅色模式和深色模式下的感知差异通常很大。浅色模式里看起来正好的蓝色,在深色模式的深灰背景上会显得更亮、更"飘"。如果品牌要求用户在两种模式下都能识别出"这是同一个品牌蓝",你需要对深色模式下的品牌色做调整。
中性灰色紧邻高饱和色区域,出现了明显的色相偏移。 如果你的灰色分割线紧挨着一个大面积的品牌色区域,灰色在感知上偏向了品牌色的互补色,这个偏移如果明显到用户能注意到(灰色"发黄"或者"发粉"),就需要处理。
颜色的微小差异会被用户理解为不同的状态或含义。 比如你用灰色表示"禁用",但同时对比让某些位置的灰色看起来比其他位置深一些,用户可能会觉得这些深一点的灰色代表"可点击但不建议",产生了你不想传递的信号。
确定需要补偿之后,怎么补偿也很重要。方法选错了,可能解决了一个问题又引入了新的问题。
这是最直接的补偿方式,针对明度对比造成的感知偏差。
补偿原则是:在深色背景上使用的颜色,比标准色值稍微降低一点明度(让它暗一点点),来抵消"在深色背景上显亮"的感知偏移。在浅色背景上使用的颜色,稍微提高一点明度(让它亮一点点),来抵消"在浅色背景上显暗"的感知偏移。
调整的幅度不需要很大。在 HSB 模式下,明度值调整 3-8% 通常就足够了。调整幅度取决于背景之间的明度差——背景差异越大,需要的补偿越大。但不要过度补偿,过度补偿会让颜色在脱离当前背景后看起来明显不对。

一个比较实用的操作方法是把两个背景并排放在一起,在每个背景上放上标准色值的色块,然后调整其中一个色块的明度,直到两个色块在你的感知中"看起来一样"。记录下调整后的值,这就是你在该背景下需要使用的补偿色值。
针对色相对比造成的感知偏移,补偿方向是"往背景色的方向加一点"。
如果灰色在蓝色背景旁边显得偏暖,你可以给这个灰色加一点点蓝(在 HSB 模式下把饱和度从 0 提到 2-5%,色相设为蓝色方向)。这一点点蓝色倾向会被同时对比"抵消"掉,用户最终感知到的还是中性灰。
色相微调的幅度要非常克制。饱和度 2-5% 的调整在取色器里几乎看不出来,但放到背景上的感知效果是明显的。如果你调到了 8-10% 以上,这个灰色脱离当前背景后会带有明显的色相倾向,在其他场景下就不能用了。
隔离法不改变颜色本身,而是通过在两个颜色之间建立视觉缓冲来减弱同时对比效应。
常用的隔离手段包括:在彩色背景和内容区之间加一条白色或深灰色的分割线,用投影让卡片从背景上"浮"起来以拉开视觉距离,在两个颜色差异大的区域之间增加留白。这些手段的共同逻辑是打断两个颜色的直接相邻关系,让视觉系统的对比机制减弱。
隔离法的最大优势是它不会污染你的色板。你不需要创建新的色值,不需要维护"A 背景专用灰""B 背景专用灰"这样的变体。颜色还是那个颜色,你只是改变了它和周围颜色的空间关系。

判断标准是这个颜色会在多少种背景上出现。
如果一个颜色只在两种背景上使用(比如浅色模式和深色模式各一种),直接做色值微调是合理的,你只需要维护两个色值,管理成本低。
如果一个颜色需要在三种以上的背景上使用,逐一微调就会让色板膨胀。这时候隔离法更稳妥——保持颜色不变,通过布局手段减弱每个场景下的对比效应。
还有一种情况是:当你的设计系统已经成型,色板已经被多个设计师和开发团队使用时,新增色值的沟通成本很高。这时候用隔离法改布局,比用微调改色板更安全。
深色模式是同时对比问题出现频率最高的场景,值得单独拿出来讲。
深色模式的背景通常在明度 10-20% 的范围内,而界面中的文字、图标、按钮等前景元素的明度普遍在 60-100% 之间。前景和背景之间存在巨大的明度落差,这意味着明度对比效应在深色模式下被大幅放大。同一个灰色,在浅色模式下和白色背景之间的明度差可能只有 30%,但在深色模式下和深灰背景之间的明度差可能达到 50-60%。明度差越大,同时对比的效应越强。
这就是为什么很多设计师在做深色模式时觉得颜色"很难控制"。浅色模式下看起来舒服的灰色层级关系,到了深色模式下要么层级消失了(几个灰色看起来差不多),要么层级过于剧烈(某个灰色突然跳出来了)。这些问题的根源都是同时对比在深色背景下的效应被放大了。
高饱和色在深色背景上的"发光感"也和同时对比有关。深色背景的低饱和度、低明度环境,会让任何有饱和度的颜色在感知上变得更鲜艳、更"亮"。这就是为什么浅色模式下看起来正好的品牌蓝,放到深色模式里会觉得刺眼。不是颜色变了,是它周围的环境变了,感知被推高了。
深色模式下的中性色冷暖偏移也更容易被察觉。浅色模式下,一点点冷暖倾向会被白色背景"稀释",用户不太会注意到。但深色背景不会稀释任何东西,它就像一块深色的画布,上面的每一个颜色细节都会被清晰地呈现出来。如果你的中性灰带了一点点蓝(饱和度 2-3%),在白色背景上几乎看不出来,但在深色背景上用户会明确感知到"这个灰色偏冷"。
所以在做深色模式的配色时,同时对比是一个必须主动考虑的因素,而不是"遇到问题再处理"。
当你在设计过程中觉得某个颜色"看起来不对"时,在动手改色值之前,先用下面四个步骤判断这是真实的颜色问题,还是同时对比造成的感知偏差。
用取色器去吸你觉得"不对"的颜色,确认它的实际色值。如果色值和你预期的完全一致,那你遇到的就是同时对比现象,不是颜色本身的问题。这一步能帮你避免大量不必要的调色工作。

把你觉得有问题的颜色色块复制一份,放到一个纯中灰色背景上(比如 #808080,这是一个明度和饱和度都处于中间值的颜色,对感知的干扰最小)。在这个中性环境下重新观察它。如果它看起来正常了,说明之前的"不对"是周围颜色造成的。

把你觉得不一致的两个颜色块都拉到同一个背景上,紧挨着并排放。在相同的背景条件下,同时对比对两个色块的影响是一样的,你就能看出它们到底是不是同一个颜色。如果并排后完全一致,说明之前的不一致纯粹是背景差异造成的。

眯起眼睛看整个设计稿。眯眼会模糊细节,但颜色的明度关系会变得更突出。如果某个区域在眯眼状态下跳出来了(太亮或太暗),它在正常观看时可能也会给用户带来感知上的突兀感,这时候就值得考虑是否需要补偿。眯眼测试不是用来检测同时对比的,而是用来判断同时对比的效果是否严重到需要处理。

掌握同时对比之后,你的设计工作流会发生一个微妙但重要的变化:当你觉得颜色不对时,你的第一反应不再是去调色值,而是先判断这是颜色的问题还是环境的问题。
这个判断能帮你避开一个大坑——不断地创建微调色值来"修复"其实不需要修复的问题。一个克制的色板和一个混乱的色板之间的区别,很多时候就在于设计师是否能区分"真实的颜色问题"和"感知造成的假问题"。
同时对比也会影响你设计评审时的沟通方式。当同事或领导指出"这两个地方颜色不一样"时,你可以解释这是视觉系统的正常反应,然后用取色器当场验证。不是为了证明自己没错,而是为了让团队把注意力放在真正需要解决的配色问题上,而不是反复修改一个不需要修改的色值。
同时对比提供给我们的不是一个配色技巧,而是一个看待颜色的方式。颜色不是孤立存在的,它永远是和周围环境一起被感知的。你在色板里看到的颜色和用户在界面里看到的颜色,从来就不是同一个东西。理解了这一点,你在做每一个配色决策的时候,才会把"用户的眼睛会怎么看它"这个因素纳入真正的考量。
有0人收藏了本文