今日,@Zch 提起了一件很有趣的事:在 CSS 里颜色的代号之中,red 对应的 RGB 值是 #FF0000
,blue 对应的是 #0000FF
,而 green 对应的却是 #008000
。
也就是,CSS 里面的 green,是只由 RGB 里 50% 的的 G(green)组成的。
如果从 CSS 支持的一百多种颜色代号中列出相关的来,这种差异会更加滑稽:
#FF0000 red |
#00FF00 lime |
#0000FF blue |
#800000 maroon |
#008000 green |
#000080 navy |
嗯……所以 50% 的绿是 green,而 100% 的绿是 lime——黄绿色?!逗我呢。我盯了半天 #00FF00
,却没看出一点黄来,倒是怀疑起自己是不是色弱。
本着一切荒谬都事出有因的原则,我们进行了一些小小的调查。
首先是要弄明白,CSS 里面一百多种颜色的代号是谁取的。在维基百科的网页颜色一文中,可以看到在 1999 年通过的 HTML 4.01 规范中,只定义了 16 种颜色;而当时,green 与 lime 的差异就已经赫然在目了。2001 年制定的 SVG 标准里也包含了这两个值,自此被浏览器广泛接受。
那么 HTML 4.01 是否就是这个设计源头呢?其实继续往上追溯,在 1997 年的 HTML 3.2 规范中,就已经规定了 green 和 lime 等十六种颜色了。而且规范里明确地说到,这十六种颜色是取自 Windows VGA 调色板(Windows VGA Palette)的。根据维基百科上相关页面的信息,的确在十六色时代,Windows 就将 #00FF00
称作 lime,而将 #008000
称为 green。
不过 Windows 干嘛要这么做呢?总所周知,作为一个专利产品,Windows 有相当多的历史谜团,或许这也是其中一个。没人知道某个微软工程师的脑瓜子里怎么想的,起了个这样的名字;或许 Windows 也是借鉴的另一个天才的点子?
天无绝人之路,某个维基下面的一条参考链接,至少提供了一点点思路。这是一个邮件列表的网页版存档,生产于 2002 年,带有熟悉的陈旧气息,内容正是有人询问 SVG 标准的 green(#008000
)和 X11 标准的 green(#00FF00
)不一致的问题。
SVG 1.0 和 XFree86 自带的 /usr/lib/X11/rgb.txt 中,颜色表达的值存在几处冲突。我不知道哪一种才是「正确」的。
……
在我看来,其中最严重的冲突是「green」的含义,因为绿色是 RGB 中的一种原色。
早在 HTML 3.2 的年代,「green」就被定义为绿原色的一半强度,之后继承到了 HTML 4、CSS1、CSS2,最后到了 XSL 与 SVG。完整强度的绿原色被称作「lime」。就像 maroon 被定义为一半强度的红原色。
早在标准化之前,这些数值就已经被浏览器广泛采用了。你可以在 Netscape 1、MSIE 1 和 Opera 1 中发现这些定义。
这些值代表的是颜色,而非数值。我的意思是它们与特定显示器的色彩空间、传递函数以及观察条件息息相关。它们是可以用颜色的国际标准进行进行测量的,而这些标准可追溯至 1931 年。
……
说实话,我没咋看懂,除了把这个谜团推向了更遥远的年代。不过我还是看了一下那个 1931 年的颜色国际标准:CIE 1931 色彩空间。
那是一个带有彩色显示器的电脑远未发明的年代,但科学家已经在研究如何用数学方式定义色彩空间。纯色的光,只是单一的波长。但普通人感知色彩的视觉细胞只有三种,三种原色不同程度的叠加可以让人感受到连续的光谱。CIE 1931 便描述了各种波长的光应当如何由三种原色叠加而成。
按维基上 CIE 1931 中某段所描述的,在实验的过程中,科学家发现在相同的亮度(功率)下,人眼认为绿色的光比红色与蓝色更为明亮。
这是否就是 green 只采用绿原色 50% 亮度的原因呢?因为 #00FF00
并不像 #FF0000
像红色那般像绿色?再回到页首的颜色表,似乎也的确觉得,#00FF00
的部分较左右两边亮度更高。
答案究竟为何,依然不得而知,恐怕永远不得而知。就算事实如此,是谁先想到这么个点子、#00FF00
又为什么起名 lime,那也是一个永远的谜。
#FF0000 red |
#008000 green |
#0000FF blue |
你是否觉得这样的红绿蓝更为自然呢?