ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

颜色代码对照表:从原理到实战的完整指南

颜色代码对照表:从原理到实战的完整指南 1. 颜色代码对照表到底解决什么问题做前端或者UI设计的人几乎都遇到过这样的场景设计师给了一张效果图上面标注了主色是某个色号你打开代码编辑器准备写样式却不知道该用十六进制还是RGB也不确定这个色号在CSS里到底该怎么写才最稳妥。又或者你在做数据可视化需要给一组图表配色手头只有一张色卡图片得把上面的颜色一个个转成代码。这些琐碎但高频的需求归根结底都指向同一个东西——颜色代码对照表。所谓颜色代码对照表本质上就是一套把人类可识别的颜色名称、视觉感受与计算机可处理的数值编码之间建立映射关系的查询工具。它要解决的核心问题很直接让不同角色的人——设计师、开发者、数据分析师、甚至做PPT的普通办公用户——都能快速找到自己想要的那个颜色对应的代码或者反过来看到一个代码能知道它大概是什么颜色。我第一次认真整理颜色代码对照表是因为接手了一个多端适配的项目。同一个品牌色iOS端用的是UIColor的RGB浮点值Android端用的是ARGB十六进制Web端用的是CSS的hex或者rgb()而设计稿里标注的又是另一种格式。每次对接都要来回换算效率极低还容易出错。后来我干脆花了一个下午把项目里用到的所有颜色整理成一张对照表从此对接效率至少提升了一倍。这篇文章适合谁看如果你是刚入行的前端开发者对颜色代码还停留在“复制粘贴”的阶段那这篇内容能帮你建立完整的颜色编码认知体系。如果你是设计师想搞清楚自己标注的色号在开发那边到底是怎么落地的这里也有你需要的答案。即便你只是偶尔需要处理颜色相关的办公文档掌握基本的颜色代码知识也能让你少求人。2. 颜色编码体系的核心原理拆解2.1 为什么颜色需要用代码表示计算机屏幕上的每一个像素本质上是由红、绿、蓝三个子像素组成的。通过调节这三个子像素的亮度就能混合出人眼能感知的绝大多数颜色。这就是所谓的RGB色彩模型。问题在于怎么用数字来描述“亮度”早期不同厂商有不同的做法后来逐渐统一为用0到255的整数来表示每个通道的强度。0代表该通道完全不发光255代表该通道满功率发光。三个通道组合起来就能表示256×256×256也就是约1677万种颜色。这个数字听起来很大但实际使用中我们经常只需要几百种。于是就有了各种简化和标准化的表示方法。十六进制表示法是最常见的一种它把每个通道的0到255用两位十六进制数表示三个通道拼在一起就是六位前面加一个井号。比如纯红色的RGB是(255, 0, 0)转成十六进制就是#FF0000。这种表示法简洁、紧凑在CSS和大多数编程语言里都通用。2.2 十六进制、RGB、HSL三种主流格式的取舍在实际工作中我主要用三种颜色格式十六进制、RGB和HSL。它们各有各的适用场景没有绝对的好坏。十六进制最大的优势是紧凑和通用。一个六位字符串就能完整描述一个颜色在CSS里写起来也方便。但它的缺点是不直观你看到#3A7BD5这个值很难立刻反应过来这是什么颜色。而且十六进制不便于做颜色计算比如你想把这个颜色调亮10%用十六进制就得先转成十进制算完再转回去很麻烦。RGB格式的好处是直观你能直接看到三个通道的数值知道红色占多少、绿色占多少、蓝色占多少。在做颜色混合或者通道操作时RGB比十六进制方便得多。但RGB的缺点是不符合人类描述颜色的习惯。我们说“浅蓝色”脑子里想的是明度和饱和度而不是“红色100、绿色200、蓝色255”。HSL格式就是为解决这个问题而生的。H代表色相S代表饱和度L代表亮度。色相是一个0到360的角度值0是红色120是绿色240是蓝色。饱和度是百分比0%是灰色100%是最鲜艳。亮度也是百分比0%是黑色100%是白色。用HSL来描述颜色更接近人类的直觉。比如“浅蓝色”在HSL里可能就是H210, S80%, L70%。你想调亮一点直接把L加10%就行不需要做任何转换。我个人的习惯是写CSS的时候用十六进制做颜色计算和动态调整的时候用HSL需要精确控制通道值的时候用RGB。三种格式之间的转换关系必须烂熟于心这是基本功。2.3 颜色名称与代码的映射逻辑CSS标准里定义了一百多个颜色名称比如red、blue、cornflowerblue、rebeccapurple等等。这些名称本质上就是十六进制代码的别名。比如red就是#FF0000blue就是#0000FF。使用颜色名称的好处是代码可读性高一看就知道是什么颜色。但缺点是名称有限而且不同浏览器对某些名称的支持可能略有差异。在实际项目中我一般只在做原型或者写demo的时候用颜色名称正式项目里还是用十六进制或者CSS变量。原因很简单颜色名称不够精确而且不方便做主题切换。你想想如果整个项目里到处都是red、blue这样的名称哪天产品说要换一套品牌色你得一个个去改很容易漏掉。用CSS变量或者预处理器变量就方便多了改一个地方全局生效。3. 颜色代码对照表的完整实操构建3.1 从零开始整理一张项目级颜色对照表假设你现在接手了一个新项目需要建立一套颜色规范。我的做法是分四步走。第一步收集所有颜色来源。设计稿里的标注、品牌VI手册、竞品参考、老板随口说的“就要那个蓝色”全部收集起来。不要急着做判断先全部记录下来。第二步去重和归类。把收集到的颜色按用途分类主色、辅助色、中性色、功能色成功、警告、错误、信息。同一类里如果有相近的颜色考虑合并。比如#3A7BD5和#3A7CD5肉眼几乎看不出区别就统一用一个。第三步确定每种颜色的多种格式表示。对于每一个最终确定的颜色同时记录它的十六进制、RGB、HSL值以及一个语义化的名称。比如主色可以叫primary成功色可以叫success。第四步生成对照表文档。我一般用Markdown表格来组织方便查阅和版本管理。下面是一个示例结构语义名称十六进制RGBHSL用途说明primary#3A7BD5rgb(58, 123, 213)hsl(210, 65%, 53%)品牌主色用于主要按钮和链接success#27AE60rgb(39, 174, 96)hsl(145, 63%, 42%)成功状态提示warning#F39C12rgb(243, 156, 18)hsl(37, 90%, 51%)警告状态提示danger#E74C3Crgb(231, 76, 60)hsl(6, 78%, 57%)错误状态提示text-primary#2C3E50rgb(44, 62, 80)hsl(210, 29%, 24%)主要文字颜色text-secondary#7F8C8Drgb(127, 140, 141)hsl(184, 6%, 53%)次要文字颜色border#E0E0E0rgb(224, 224, 224)hsl(0, 0%, 88%)边框颜色background#F5F7FArgb(245, 247, 250)hsl(216, 33%, 97%)页面背景色这张表看起来简单但实际整理的时候有很多细节要注意。比如HSL的色相值有时候会出现小数我一般四舍五入到整数。RGB值如果是用百分比表示的要统一转成0到255的整数。这些细节不统一后期维护会很痛苦。3.2 十六进制与RGB的互转计算方法虽然网上有很多在线转换工具但理解转换原理还是很有必要的。至少你得能口算一些常见的值或者在没网的时候也能手动算。十六进制转RGB的逻辑是这样的把六位十六进制数分成三组每组两位。第一位乘以16加上第二位就是该通道的十进制值。比如#3A7BD5拆成3A、7B、D5。3A就是3×1610587B就是7×1611123D5就是13×165213。所以RGB就是(58, 123, 213)。反过来RGB转十六进制就是除16取余。以58为例58除以16得3余10所以第一位是3第二位是10对应的十六进制A合起来就是3A。123除以16得7余11就是7B。213除以16得13余5就是D5。拼起来就是#3A7BD5。这里有个小技巧十六进制里A到F分别对应10到15。你只要记住这个对应关系转换就是简单的算术。我刚开始做前端的时候经常在脑子里默算这些值时间长了就形成条件反射了。现在看到#FF0000就知道是纯红#00FF00是纯绿#0000FF是纯蓝#FFFFFF是白#000000是黑。这几个基本色一定要背下来。3.3 HSL格式的实用转换技巧HSL转RGB稍微复杂一点但也不难理解。核心思路是先根据色相H确定颜色落在哪个60度的区间里然后根据饱和度和亮度计算具体的RGB值。我一般不会手动去算HSL转RGB因为公式比较长容易出错。但在做动态颜色调整的时候HSL的优势就体现出来了。比如你想把主色#3A7BD5调暗20%作为hover状态的颜色用HSL就很简单保持H和S不变把L从53%降到42%左右就行。如果用十六进制你得先转成RGB然后每个通道乘以0.8再转回十六进制麻烦得多。在实际项目中我经常用CSS的hsl()函数来定义颜色变量。比如:root { --primary-h: 210; --primary-s: 65%; --primary-l: 53%; --primary: hsl(var(--primary-h), var(--primary-s), var(--primary-l)); --primary-dark: hsl(var(--primary-h), var(--primary-s), calc(var(--primary-l) - 10%)); --primary-light: hsl(var(--primary-h), var(--primary-s), calc(var(--primary-l) 10%)); }这样定义的好处是你只需要维护三个基础数值所有衍生颜色都自动计算出来。改主题的时候改这三个值就行了整个项目的配色都会跟着变。这个技巧我在多个项目里用过实测非常稳。3.4 透明度与Alpha通道的处理现代UI设计里透明度用得越来越多。十六进制表示法原本不支持透明度但后来CSS引入了八位十六进制最后两位表示Alpha通道。比如#3A7BD580就是#3A7BD5加上50%的透明度80的十进制是128128除以255约等于0.5。RGB格式用rgba()函数来表示透明度第四个参数是0到1之间的小数。比如rgba(58, 123, 213, 0.5)。HSL对应的是hsla()函数用法类似。这里有个坑要注意八位十六进制的浏览器兼容性虽然已经很好了但在一些老旧的Android设备上可能还是有问题。如果你的项目需要兼容较老的设备建议还是用rgba()或者hsla()。我一般会在项目里统一用rgba()因为可读性更好而且兼容性最稳。另外透明度的叠加计算也容易出错。两个半透明的颜色叠在一起最终显示的颜色不是简单的数值相加。如果你需要精确控制叠加后的效果最好在设计工具里先算好或者用JavaScript动态计算。我遇到过好几次因为透明度叠加导致颜色偏差的问题后来养成了习惯凡是涉及透明度的颜色都在设计稿里标注清楚最终效果而不是只给一个透明度值。4. 颜色代码在实际项目中的高频应用场景4.1 Web前端开发中的颜色管理策略在Web前端项目里颜色管理做得好不好直接影响到后期的维护成本。我见过太多项目CSS里散落着各种硬编码的颜色值改一个主题要全局搜索替换还经常漏掉。正确的做法是建立一套颜色变量体系。最基础的做法是用CSS自定义属性也就是CSS变量。在:root里定义所有颜色变量然后在具体样式里引用。这样改主题的时候只需要改:root里的值。进阶一点的做法是用Sass或者Less的变量和函数可以在编译时做颜色计算。再进阶就是用设计令牌Design Token的思路把颜色的语义和具体值分离支持多主题切换。我现在的习惯是颜色变量分三层。第一层是基础色板定义所有原始颜色值比如blue-500、gray-100这种。第二层是语义变量把基础色板映射到具体用途比如primary、success、danger。第三层是组件变量针对特定组件的特殊需求做微调。这样分层的好处是改基础色板不影响语义改语义不影响组件各层职责清晰。4.2 移动端开发中的颜色适配问题移动端开发有个特殊问题同一个颜色在不同屏幕上的显示效果可能不一样。这涉及到色域和屏幕校准的问题。高端手机屏幕色域广显示的颜色更鲜艳低端手机屏幕色域窄颜色会偏淡。如果你的项目对颜色准确性要求很高就需要做适配。我的做法是对于品牌色这种关键颜色在iOS和Android上分别做微调。iOS的屏幕色彩管理比较统一一般直接用设计稿的色值就行。Android设备碎片化严重我会在代码里根据设备型号或者屏幕参数做动态调整。当然大多数项目不需要这么精细直接用统一的色值也能接受。另一个常见问题是深色模式。深色模式下不能简单地把背景色从白改成黑文字色从黑改成白。因为纯黑背景配纯白文字对比度太高长时间看眼睛会累。我一般用#121212作为深色背景文字用#E0E0E0这样对比度适中视觉上更舒服。品牌色在深色模式下也需要调整通常要降低饱和度、提高亮度否则会显得刺眼。4.3 数据可视化中的配色方案设计做数据可视化的时候配色是个大学问。不仅要好看还要保证信息传达准确。我总结了几条原则。第一分类数据用色相区分连续数据用明度或饱和度区分。比如柱状图里不同类别的柱子用不同色相的颜色热力图里不同数值的区域用同一色相不同明度的颜色。第二颜色数量控制在7种以内。超过7种人眼就很难准确区分了。如果数据类别确实很多考虑用分组或者小倍数图的方式呈现。第三注意色盲友好。大约8%的男性有红绿色盲如果你的图表用红色和绿色来区分正负值这部分用户就看不出来。我一般用蓝色和橙色来代替红绿或者同时用形状和纹理来辅助区分。第四背景色和前景色要有足够对比度。WCAG标准要求正文文字的对比度至少达到4.5:1大号文字至少3:1。图表里的文字和线条也要满足类似标准。我常用WebAIM的对比度检查工具来验证确保配色方案可访问。4.4 印刷与屏幕颜色的差异处理如果你做的项目既要在屏幕上显示又要打印出来那就得注意RGB和CMYK的差异了。屏幕用的是RGB加色模式印刷用的是CMYK减色模式。同一个颜色值在屏幕上和纸张上看起来可能完全不同。我的经验是如果项目以印刷为主设计阶段就用CMYK模式色值参考Pantone色卡。如果以屏幕为主偶尔需要打印那就接受一定的色差或者针对打印单独出一套色值。最怕的是设计稿用RGB印刷厂直接转CMYK出来的效果往往偏暗偏灰。还有一个细节屏幕上的亮色比如荧光绿、亮橙色印刷根本印不出来。这些颜色在CMYK色域之外只能近似模拟。如果你的品牌色恰好是这种亮色印刷物料上就得用专色成本会高不少。这个坑我在一个品牌项目里踩过后来做设计规范的时候都会同时标注屏幕色值和印刷色值。5. 颜色代码对照表使用中的常见问题与排查5.1 颜色显示不一致的排查思路颜色显示不一致是最常见的问题。同一段代码在你的电脑上看起来是一个颜色在同事的电脑上看起来是另一个颜色。排查这个问题我一般按以下顺序检查。先确认代码本身有没有问题。打开浏览器的开发者工具检查元素的实际计算样式看看颜色值是不是你预期的那个。有时候是CSS优先级的问题你写的颜色被其他样式覆盖了。如果代码没问题再检查显示器。不同显示器的色温、伽马值、色彩配置文件都不一样。专业设计显示器一般会定期校色普通显示器就不好说了。你可以用在线屏幕测试工具检查一下显示器的基本参数。如果显示器和代码都没问题那可能是浏览器或者操作系统的色彩管理在起作用。有些浏览器支持色彩管理会根据图片内嵌的ICC配置文件来显示颜色。如果你的项目里用了带ICC配置的图片显示效果可能和纯CSS颜色不一致。最后还有一个容易被忽略的因素环境光。在暖光台灯下看屏幕和白天自然光下看屏幕颜色感知是不一样的。做颜色相关的工作尽量在标准光源环境下进行。5.2 颜色代码转换中的精度丢失问题颜色格式转换时精度丢失是难免的。比如HSL转RGB因为HSL的色相是0到360的连续值而RGB是离散的整数转换过程中必然会有舍入误差。这个误差通常很小肉眼看不出来但在做颜色计算的时候可能会累积。我遇到过一个问题把一个颜色从十六进制转成HSL调整亮度后再转回十六进制结果和预期的不一样。排查后发现是舍入误差导致的。解决办法是在中间计算过程中保留足够的小数位只在最后输出的时候才做舍入。如果用JavaScript做颜色计算可以用toFixed()控制小数位数但要注意toFixed()返回的是字符串需要再转回数字。另一个精度问题是Alpha通道。八位十六进制的Alpha是0到255的整数而rgba()的Alpha是0到1的小数。转换的时候255对应1.00对应0.0中间的值需要做除法。这个转换本身没有精度问题但如果你在代码里硬编码了Alpha值要注意两种格式的对应关系。5.3 浏览器兼容性与降级方案虽然现代浏览器对颜色格式的支持已经很好了但在一些特殊场景下还是需要考虑兼容性。比如八位十六进制在IE里完全不支持如果你的项目需要兼容IE就不能用这种格式。我的做法是在项目里统一用rgba()来表示带透明度的颜色因为它的兼容性最好。如果一定要用八位十六进制可以用PostCSS插件自动转换成rgba()。CSS变量在IE里也不支持如果需要兼容IE就得用Sass变量或者直接写死颜色值。还有一个兼容性问题是hsl()和hsla()。这两个函数在IE9以下不支持但IE9已经是很多年前的东西了现在基本可以忽略。如果你真的需要兼容那么老的浏览器那就只能用十六进制和rgb()了。5.4 常见问题速查表问题现象可能原因排查方法解决方案颜色和设计稿不一致色值写错、CSS覆盖、显示器色差开发者工具检查计算样式核对色值、提高优先级、校准显示器透明度叠加效果不对多个半透明元素叠加检查每个元素的透明度值在设计工具里预先计算最终效果深色模式下颜色刺眼直接反转颜色、对比度过高检查深色模式下的色值使用专门的深色模式色板打印颜色偏暗RGB转CMYK色域压缩对比屏幕和打印效果使用CMYK色值或专色颜色转换后偏差舍入误差累积检查中间计算过程保留足够小数位最后才舍入老设备上颜色异常浏览器不支持新格式检查浏览器版本使用兼容性更好的格式或降级方案6. 颜色代码对照表的进阶用法与工具链6.1 用脚本自动生成颜色对照表手动整理颜色对照表虽然可行但效率低而且容易出错。我后来写了一个Node.js脚本从CSS文件里提取所有颜色值自动生成对照表。核心思路是用正则表达式匹配十六进制、rgb()、rgba()、hsl()、hsla()等格式然后用颜色转换库比如color或者chroma-js统一转换成多种格式最后输出Markdown表格。这个脚本我放在项目的scripts目录下每次更新颜色规范后跑一次对照表就自动更新了。脚本的核心代码大概长这样const fs require(fs); const chroma require(chroma-js); const cssContent fs.readFileSync(./src/styles/variables.css, utf-8); const colorRegex /#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})\b|rgba?\([^)]\)|hsla?\([^)]\)/g; const colors [...new Set(cssContent.match(colorRegex))]; const table colors.map(color { const c chroma(color); const [r, g, b] c.rgb(); const [h, s, l] c.hsl(); return { hex: c.hex(), rgb: rgb(${r}, ${g}, ${b}), hsl: hsl(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%) }; }); // 输出Markdown表格 console.log(| 十六进制 | RGB | HSL |); console.log(|---------|-----|-----|); table.forEach(row { console.log(| ${row.hex} | ${row.rgb} | ${row.hsl} |); });这个脚本的好处是颜色值改了对照表自动跟着变永远不会不同步。而且可以集成到CI流程里每次提交代码自动检查颜色规范。6.2 设计工具与开发工具的协同设计师用Figma或者Sketch开发者用VS Code两边怎么协同我的经验是用设计令牌Design Token作为桥梁。设计师在设计工具里定义好颜色变量导出成JSON格式的令牌文件开发者用脚本把令牌文件转换成CSS变量或者Sass变量。这样两边用的是同一套数据源不会出现设计师改了颜色开发者不知道的情况。Figma有插件可以直接导出设计令牌Sketch也有类似的工具。如果团队没有用这些工具也可以手动维护一个JSON文件两边都从这个文件读取颜色值。关键是建立流程让颜色变更有一个统一的入口而不是各改各的。6.3 颜色对比度检测与无障碍适配无障碍设计越来越重要颜色对比度是其中最基本的要求。WCAG 2.1标准把对比度分为三个等级AA级要求正文文字对比度至少4.5:1AAA级要求至少7:1。大号文字18pt以上或者14pt粗体的要求可以放宽到3:1和4.5:1。我一般用color-contrast-checker这个npm包来检测对比度或者在开发阶段用浏览器的无障碍审计工具。如果对比度不达标就需要调整颜色。调整的时候优先改亮度因为改色相会影响品牌识别。比如主色和白色文字的对比度不够可以把主色调暗一点而不是换一个色相。还有一个容易被忽略的点不只是文字和背景需要对比度图标、边框、图表元素也需要。特别是表单的输入框边框如果对比度太低用户可能看不清输入区域在哪里。我一般要求所有功能性元素的对比度至少达到3:1。6.4 颜色代码对照表的版本管理与团队协作颜色规范不是一成不变的随着品牌升级或者产品迭代颜色值可能会调整。怎么管理这些变更我的做法是把颜色对照表纳入版本控制每次变更都记录变更原因和影响范围。具体来说我会在项目里维护一个COLORS.md文件用Markdown表格记录所有颜色。每次修改颜色都要在文件里更新并在提交信息里说明改了什么、为什么改。如果项目有多个端Web、iOS、Android每个端都从这个文件同步颜色值。团队协作方面我会在代码审查清单里加一条检查颜色值是否使用了变量而不是硬编码。如果发现硬编码的颜色要求改成变量引用。这个习惯坚持下来项目的颜色管理会非常清晰新人接手也能快速上手。7. 我踩过的坑和总结的经验做前端这些年颜色相关的问题我踩过不少坑。有一次做一个电商项目主色是红色我在CSS里直接写了red。后来产品说要换成品牌红我全局搜索red替换成新的十六进制值结果发现有些地方用的是#FF0000有些地方用的是rgb(255,0,0)还有些地方用的是hsl(0,100%,50%)。同一个红色三种写法替换的时候漏了好几个地方上线后颜色不一致被测试打回来重改。从那以后我养成了一个习惯项目里所有颜色必须用变量而且变量的定义必须集中在一个文件里。不管是CSS变量、Sass变量还是JS常量总之不能散落在各处。这个习惯帮我省了很多事后来做主题切换、深色模式适配都是改一个文件就搞定。另一个坑是关于透明度的。有一次做弹窗遮罩我用了rgba(0,0,0,0.5)设计稿上看起来没问题。但在实际设备上测试时发现遮罩下面的内容在某些屏幕上会透出奇怪的色调。排查后发现是屏幕的色彩管理导致的纯黑加透明度在某些屏幕上会偏蓝。后来我改用rgba(0,0,0,0.6)稍微提高不透明度问题就消失了。这个经验告诉我颜色这种东西一定要在真实设备上测试模拟器或者设计稿都不完全可靠。还有一个经验是关于颜色命名的。我见过一些项目颜色变量叫color1、color2、color3过两个月连作者自己都忘了哪个是哪个。我的做法是用语义化命名比如primary、secondary、success、danger、text-primary、border-light。名字要能说明用途而不是描述外观。因为外观可能会变用途相对稳定。比如primary可能从蓝色变成紫色但它始终是主色名字不用改。最后分享一个实用技巧如果你经常需要在不同格式之间转换颜色可以在浏览器书签里存一个本地的HTML工具页面用JavaScript实现转换逻辑断网也能用。我自己就做了一个集成了十六进制、RGB、HSL互转还有对比度检测和色板生成功能。虽然网上有很多在线工具但自己做一个更顺手而且不用担心数据隐私问题。这个工具我用了好几年每次做颜色相关的工作都会打开效率提升非常明显。
返回列表