在CSS中使用颜色名称代替颜色代码有什么缺点吗?

77
例如,写入red比写入#cc0000更有效。它具有更少的字符,占用更少的空间,并且更容易记忆。
在使用颜色名称而不是十六进制代码或RGB值时,是否存在任何缺点?这包括在多开发人员环境中编程。

13
合理的问题,没有理由进行负评。我会点赞以恢复力量的平衡。 - Chase Florell
然而,写红色只比写 #C00 稍微更有效率一些。速记符号表示法很美观。 - Hooray Im Helping
太好了,我正在帮忙——我刚刚举了一个例子。 - Jitendra Vyas
因为客户端需要一段时间来下载另外的4个字节。 - user216441
“黑色”和“白色”肯定是可以在任何情况下使用的颜色名称,因为这些“颜色”永远不会改变它们的十六进制代码,并且每个人都知道他们要预期什么(你可能不知道用“橙色”会得到什么)。在大多数情况下,我更喜欢使用十六进制代码,因为在某些地方写“color:#39f5d2”,然后在其他地方只有“color: black”并不是真正好的做法->保持一致性。此外,写#000而不是黑色的代码更少。 - Simon
@user216441 因为在一个高访问率的大型网站上,比如谷歌,如果没有客户端缓存,每天大约有60亿次搜索会增加4个字节,导致需要传输超过20GB的数据。 - Volker E.
11个回答

27
不同的浏览器可能对一些颜色名称的含义存在分歧。并非所有1600万种24位颜色都有名称。实际上,只有17个符合W3C标准的颜色名称。使用这些名称可能是可以接受的。
个人而言,在构建时我会使用一个模板系统来预处理我的CSS文件,这样我就可以使用一套标准的网站颜色,并通过名称引用它们。这样我既知道我的RGB颜色值是什么,又可以在CSS中使用更简单的名称。
(当然,仍然无法确切地知道给定用户的浏览器上颜色的真实效果。)
编辑 - 自从回答写下来以来的5年里,像Less和Sass这样的预处理器已经变得相当常见。它们为CSS源代码提供了一些非常复杂的工具,用于管理颜色(以及其他许多东西)。
更多编辑 - 好吧,在那之后的8年里,颜色名称已经标准化。"Liyali"的回答更加更新。

7
CSS 2.1规定了17种颜色的名称和取值: http://www.w3.org/TR/CSS2/syndata.html#value-def-color(其中橙色是在2.1版中新增的)。如果有可用的颜色名称,我倾向于使用它们。 - Francis Gagné
1
谢谢 - 我引用w3schools而没有先查找真正的权威(他们忘了“橙色”)- 答案已修正。 - Pointy
那这个列表 http://www.crockford.com/wrrrld/color.html 呢?还有这个 http://www.somacon.com/p142.php。你的意思是所有浏览器都会为17种W3C颜色呈现相同的颜色,而对于其他颜色名称则不能保证吗? - Jitendra Vyas
1
这在现今已经过时了,因为CSS标准定义了X11颜色(共有147种),正如其他答案中所提到的。浏览器不会显示不同的RGB值。 - MarcusOtter
1
这已经过时了,因为CSS标准定义了X11颜色(共147种),如其他答案中所述。浏览器不会显示这些颜色的不同RGB值。 - undefined
显示剩余8条评论

16

我建议你遵循W3C的推荐:

所有的规范(CSS Level 1、Level 2和Level 3)都指出使用颜色名称是完全可以接受的,但哪些颜色名称具体可接受则取决于规范。

CSS1规范

CSS1规范建议使用颜色名称作为十六进制代码和RGB代码的有效替代方案。

6.3 颜色单位

推荐使用的关键字颜色名称列表包括:aqua、black、blue、fuchsia、gray、green、lime、maroon、navy、olive、purple、red、silver、teal、white和yellow。这些16种颜色来自Windows VGA调色板,它们的RGB值在该规范中没有定义。

CSS2规范

现在你可以使用颜色名称orange了!总共有17种颜色。请参考CSS2规范

CSS3与X11颜色

CSS3允许使用SVG 1.0的X11颜色作为CSS属性(以及hsl()值)的值。这将颜色名称的数量扩展到147种颜色。任何支持SVG 1.0规范的浏览器都可以使用这些颜色名称,包括IE9或更高版本

这也意味着问题中提供的颜色列表大多数不可接受

建议的用法

如果您要支持旧版浏览器,请使用网络安全的原始16种颜色名称,因为不支持X11颜色。否则,您可以自由地使用X11规范中指定的147种颜色名称。

所有浏览器都应遵守规范,使用相应的十六进制代码。解析器读取颜色名称所需时间与使用十六进制值、RGB值或HSL()值的时间几乎相同,甚至可能完全相同。

对我而言,将HEX代码写成小写更易于阅读。例如,#8b88b6显然比#8B88B6更易读。此外,我倾向于使用简写的HEX颜色而非完整代码(#666而不是#666666),因为更高效。


8

个人而言,我更喜欢使用十六进制代码,主要有两个原因:

  1. 从Photoshop中复制十六进制代码更加容易。
  2. 如果你只使用颜色名称或只使用十六进制代码,那么在样式表中将会出现混乱。使用十六进制代码可以使得你的样式表更加统一和一致。

当然,这是在你使用的颜色不仅仅是简单的红、黑、白等颜色时才适用。在多人开发环境中,我认为使用十六进制代码更好,因为它们更具普遍性,每个开发人员都能准确地知道颜色是什么。


5

之前的回答现在看起来已经过时了。

如果您开发支持CSS3的浏览器(自IE9以来,所有主要浏览器都支持),您可以在CSS中使用颜色名称。在HTML中,仅支持16种原始网络颜色。

问题是是否存在缺点。我认为有一些:

  • 我认为一些颜色名称是错误的。例如:
    • 蔚蓝色通常被认为是更深的颜色。
    • 草坪绿与我见过的任何草坪都不像。
    • 紫罗兰看起来更像我称之为粉红色的颜色。
  • 通过更改其十六进制值来创建稍微较暗或较亮的颜色变体更加困难。例如,#DCDCDC的较暗变体将是#DADADA,但如果我从颜色名称gainsboro开始,我就不会有任何想法。
  • 对于名称,Javascript计算更加困难。

来源: https://developer.mozilla.org/zh-CN/docs/Web/CSS/color_valuehttp://caniuse.com/#search=css3%20colors


此外,可能更加令人困惑/错误的是:darkgray#a9a9a9)比gray#808080)浅! - MarcusOtter
而且,也许更令人困惑/错误的是:darkgray#a9a9a9)比gray#808080)还要浅! - undefined

2

我在原型设计、调试和设置基本的单色调配色方案时使用颜色名称,并为后续使用超特定十六进制颜色主题化做好准备。这使得我们能够轻松地找到可主题化的属性,并且更容易阅读;无需费尽心思即可快速想象出正在发生的事情。

.component {
    background-color: black;
    color: white;
}

...然后在主题文件中...

.some-theme .component {
    background-color: #5f5f5c;
    color: #fafafc;
}

2

我希望进行进一步的优化,使用#c00代表红色。如果你要使用主要颜色或任何类似于#aabbcc的颜色,可以使用缩写形式#abc


但是红色很容易记住,特别是在多开发者环境中。 - Jitendra Vyas
效率是一个相对的概念!如果让事情更容易记住可以提高你的开发效率,那就去做吧!如果你想优化带宽,就使用速记法。 - Stephen
3
你如何想到这种速记法可以优化带宽?在28.8 kbps的连接上,带宽几乎可以忽略不计,而且现在很少有人使用这种连接。浏览器只是会将这种速记法转换成长版本。从你那疯狂的微观优化角度来看,更有意义的做法是尽量减少浏览器解析CSS所需的工作量... - Cody Gray
带宽备注是即兴发挥的。关于浏览器转换的有趣事实,谢谢! - Stephen

1

这实际上取决于你的编码风格。我坚持使用十六进制值以保持一致性 - 颜色始终格式化为#000#000000,我不必担心在命名和未命名颜色之间切换。

最终,这是你和你的团队需要自行决定的问题。这完全取决于你的个人喜好。


1

个人而言,如果可能的话,我更喜欢在CSS文件中以相同的方式定义所有颜色。

这样,当我看到不同的颜色定义时(例如red#cd876frgba(255,255,0,0.4)),我就不必用不同的方式思考。

我还喜欢与我正在实现的设计中识别颜色时所看到的匹配的颜色符号。Photoshop的颜色调色板提供RGB和十六进制值,但不提供CSS颜色名称。(其他设计工具可能会提供)


0

我认为使用十六进制代码比颜色名称更有用,因为举个例子,如果你想要使用红色,并且使用“red”作为颜色值,但是你不喜欢预定义的红色,你想要更浅或者更深的颜色,这时候十六进制代码就非常有用了。

一旦你有了自己选择的红色,每次想要使用它时,你会记得那个十六进制代码,而不是再使用颜色名称。


0

我认为颜色名称更具描述性...这是在可能的情况下使用它的好理由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接