☰
Chance.js color() 随机颜色生成指南:六种格式、灰度与大小写控制实战
2026/10/8 7:58:17 网站建设 项目流程
  • 测试

【免费下载链接】chancejs

Chance - Random generator helper for JavaScript

项目地址:https://gitcode.com/gh_mirrors/ch/chancejs
点击查看免费下载

chance.color()是 Chance.js 提供的随机颜色生成器,可在 HTML/CSS 常用颜色表示法中随机产出颜色值。本文以 docs/web/color.md 为骨架,结合 chance.js 中的Chance.prototype.color实现(第 1424~1565 行)与 test/test.web.js 中的断言用例,完整讲解六种颜色格式、灰度模式、大小写控制以及通道级参数控制,帮助你直接在项目中使用 Chance 生成可用的随机颜色数据。

一、color() 基本用法

color()的默认行为是在六种随机格式中随机挑选一种,返回一个随机颜色:

chance.color() => '#79c157'
  • 返回值为字符串,格式不定;
  • 六种基础类型为hex、shorthex、rgb、rgba、0x、name,均可在 HTML 或 CSS 中直接使用(0x和name除外,前者常见于脚本/汇编场景的十六进制写法,后者是 CSS 命名颜色);
  • 可以通过format选项显式指定类型,通过grayscale开启灰度、casing控制字母大小写。

在源码中,默认格式正是从这六种中随机挑选:

// chance.js 第 1497-1498 行 options = initOptions(options, { format: this.pick(['hex', 'shorthex', 'rgb', 'rgba', '0x', 'name']), ... });

二、六种颜色格式详解

使用format选项可以锁定输出格式,每次生成结果保持一致的结构,便于上层代码按固定模式解析。

1. hex(标准十六进制)

chance.color({format: 'hex'}) => '#d67118'
  • 形如#rrggbb,长度为 7(含#);
  • 每个通道取 0~255 的随机整数,再转为两位十六进制;
  • 测试断言:color.length === 7且匹配/#[a-z0-9]+/m(见 test/test.web.js 第 135~142 行)。

2. shorthex(短十六进制)

chance.color({format: 'shorthex'}) => '#60f'
  • 形如#rgb,长度为 4,每个通道仅保留一位十六进制(0~15 之间的值);
  • 源码中对应hex.call(this, 1, 3, true)(chance.js 第 1541~1542 行),每位由hex({min: 0, max: 15})生成。

3. rgb(三通道整数)

chance.color({format: 'rgb'}) => 'rgb(110,52,164)'
  • 形如rgb(r,g,b),三个通道均为 0~255 的随机整数;
  • 测试断言三个通道均落在0 <= x <= 255(test/test.web.js 第 174~187 行)。

4. rgba(带透明度)

chance.color({ format:'rgba' }) => 'rgba(76,11,110,0.1284)'
  • 形如rgba(r,g,b,a),alpha 通道是floating({min: 0, max: 1})生成的浮点数;
  • 测试断言 alpha 落在0 <= a <= 1(test/test.web.js 第 202~217 行)。

5. 0x(脚本/底层常用十六进制)

chance.color({format: '0x'}) => '0x67ae0b'
  • 形如0xrrggbb,长度为 8,不带#;
  • 源码中为'0x' + hex.call(this, 2, 6)(chance.js 第 1550~1552 行),适合生成类似嵌入式或二进制数据填充场景的颜色常量。

6. name(CSS 命名颜色)

chance.color({ format:'name' }) => 'DarkOrange'
  • 从 Chance 内置的colorNames颜色名词典中随机挑取一个,如AliceBlue、DarkOrange、Tomato等;
  • 数据源位于 chance.js 第 4559~4567 行,共收录约 140 个 CSS 标准颜色名,包含常用色与全系列淡色(WhiteSmoke、LavenderBlush、OldLace等);
  • 实现上直接返回this.pick(this.get("colorNames"))(chance.js 第 1553~1555 行)。

非法格式会抛错

如果传入不在这六种范围内的format,会抛出RangeError:

chance.color({format: 'banana'}) // RangeError

源码第 1556~1558 行明确抛出:Invalid format provided. Please provide one of "hex", "shorthex", "rgb", "rgba", "0x" or "name".,测试用例test('color() bogus format throws error')也验证了这一点(test/test.web.js 第 270~273 行)。

三、灰度模式 grayscale

设置grayscale: true后,生成的 RGB 三通道值完全相等,得到纯灰颜色:

chance.color({grayscale: true}) => '#e2e2e2'
  • 灰度模式下各格式输出均为灰色:#e2e2e2、rgb(x,x,x)、rgba(x,x,x,a)等;
  • 测试通过断言相邻通道相等来验证:color.slice(1,3) === color.slice(3,5)(test/test.web.js 第 144~153 行);
  • 底层实现中,灰度值由gray()辅助函数把单一随机值复制三份(chance.js 第 1461~1463 行):
    function gray(value, delimiter) { return [value, value, value].join(delimiter || ''); }

四、大小写控制 casing

十六进制类格式(hex、shorthex、0x)默认输出小写字母,设置casing: 'upper'可强制大写:

chance.color({casing: 'upper'}) => '#29CFA7'
  • 默认值为lower(chance.js 第 1500 行);
  • 源码第 1560~1562 行对最终字符串执行toUpperCase():
    if (options.casing === 'upper' ) { colorValue = colorValue.toUpperCase(); }
  • 测试断言输出字符串从第 1 到第 6 位字符均为大写(test/test.web.js 第 256~268 行)。

五、通道级参数:精确控制 RGB 与 Alpha(源码级进阶)

文档之外的源码中还提供了通道级控制参数,用于生成限定色域的颜色。以下参数来自 chance.js 第 1497~1511 行的默认配置:

参数默认值含义
min/max0/255未指定通道时的通用 RGB 取值范围
min_red/max_red跟随min/max红色通道最小/最大值
min_green/max_green跟随min/max绿色通道最小/最大值
min_blue/max_blue跟随min/max蓝色通道最小/最大值
min_alpha/max_alpha0/1alpha 透明度取值范围

源码注释中的完整示例(chance.js 第 1455 行):

var light_red = chance.color({format: 'hex', min_red: 200, max_red: 255, max_green: 0, max_blue: 0, min_alpha: .2, max_alpha: .3});
  • 当只给min/max时,三个通道共用同一范围(第 1524~1529 行用min_rgb/max_rgb兜底);
  • 当指定了任一通道边界时(min_red !== undefined || ...),hex 输出会按各自通道范围生成(第 1486~1488 行);
  • shorthex会先把通道范围映射到 0~15 的个位数十六进制(Math.floor(min_red / 16),第 1484 行);
  • 灰度模式下若同时给出通道边界,则用三通道均值折算灰度范围(第 1532~1535 行):
    min_rgb = (min_red + min_green + min_blue) / 3; max_rgb = (max_red + max_green + max_blue) / 3;
  • alpha 通道只对rgba生效,由floating({min: min_alpha, max: max_alpha})生成(第 1467 行)。

这些参数适合制作"暖色系"、"深色背景"、"半透明叠加层"等有约束的配色方案,例如生成一张页面可用的浅红色系色板。

六、底层实现原理与调用链

color()的实现要点如下,便于理解各选项之间的组合关系:

  1. 选项合并:所有选项先经过initOptions与默认值合并(chance.js 第 78~90 行),未传入的参数一律使用默认值;
  2. 辅助函数:内部定义gray()(灰度三通道复制)与rgb()、hex()两个闭包工厂(第 1465~1495 行),分别组装字符串;
  3. 基础随机源:通道整数由natural()产生(0~255),alpha 由floating()产生(0~1),十六进制字符由hex()配合pad()补齐两位,实现上复用 Chance 的 hex()(第 387~395 行)与natural()核心;
  4. 格式分发:switch式if/else分发六种格式,name直接走colorNames词典(第 1553~1555 行);
  5. 大小写后处理:统一在分支结束后对字符串做toUpperCase(),因此casing对所有含字母的格式(hex/shorthex/0x)均生效。

七、测试验证一览

test/test.web.js 第 134~273 行对color()进行了 1000 次迭代的随机断言测试,覆盖:

  • 默认与指定hex的输出形态(长度 7、#前缀、小写十六进制);
  • hex/shorthex/rgb/rgba四种格式的灰度输出通道相等性;
  • shorthex长度 4、0x长度 8 的形态约束;
  • rgb/rgba各通道值域在 0~255、alpha 在 0~1;
  • name返回合法字符串;
  • casing: 'upper'全部字符大写;
  • 非法format抛出异常。

这些测试同时是理解各格式边界条件的快速入口,可作为功能验证与二次开发的参考。

八、典型应用场景

  • 前端 UI 填充:为图表、卡片、占位头像批量生成配色,配合format: 'hex'直接作为 CSS 颜色使用;
  • Mock 数据接口:与 docs/web/email.md、docs/web/domain.md 等 Web 数据生成器组合,构造完整的假页面数据;
  • 可视化演示:用grayscale: true生成统一的灰色调占位元素,或结合通道参数生成同色系渐变样本;
  • 测试数据:casing与固定format的组合可让断言规则保持稳定(参考 test/test.web.js 的写法)。

小结

chance.color()以一行调用覆盖了 HTML/CSS 中最常用的六种颜色表示法,并提供灰度、大小写与通道级范围控制。掌握format、grayscale、casing三个核心选项,再配合源码中的min_red/max_red等通道参数,即可在 Chance.js 项目中稳定生成任意风格的随机颜色数据。

  • 测试

【免费下载链接】chancejs

Chance - Random generator helper for JavaScript

项目地址:https://gitcode.com/gh_mirrors/ch/chancejs
点击查看免费下载
上一篇:Minecraft服务器终极管理指南:5分钟学会EssentialsX完整配置
下一篇:ExplorerPatcher:定制Windows界面提升工作效率的实用工具

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询