本文对比四个 React 颜色选择器库:chroma-panel、react-colorful、react-color 和 @uiw/react-color。所有数字都在 2026 年 9 月 16 日对照 npm、Bundlephobia 和各项目自己的 README 核实过。数据来源附在文末,你可以自行核对。如果你在 react-colorful 和 react-color 之间犹豫,先看打包体积和维护情况,再看它们的控件是否符合你需要的界面。
概览
| chroma-panel | react-colorful | react-color | @uiw/react-color | |
|---|---|---|---|---|
| 最新版本 | 1.0.1 | 5.8.1 | 2.19.3 | 2.10.3 |
| 许可证 | MIT | MIT | MIT | MIT |
| 运行时依赖 | 0 | 0 | 7 | 20 |
| TypeScript 类型 | 自带 | 自带 | 单独安装(@types/react-color) | 自带 |
| 打包体积,gzip(Bundlephobia) | 22.0 kB | 4.9 kB | 38.4 kB | 16.0 kB |
| 周下载量(9 月 5–11 日) | 暂无统计 | 4,320,849 | 1,483,381 | 129,521 |
| 首次发布 | 2026-09-14 | 2020-08-05 | 2015-08-17 | 2021-07-01 |
| 最近发布 | 2026-09-16 | 2026-09-01 | 2020-10-28 | 2026-05-24 |
如何阅读这张表:
- 打包体积是 Bundlephobia 对各包主入口(按表中版本)给出的 gzip 数值,1 kB 按 1,000 字节计算。它衡量的是该入口导出的全部内容,而不是经过 tree shaking 后应用实际打包的体积。react-colorful 的 README 给出的单个选择器体积是 3.1 kB。@uiw/react-color 的每个选择器也都单独发布成了更小的包。
- chroma-panel 自己的数字采用了另一种测量方式:在 Vite 生产构建中把 React 设为 external,统计 gzip 后增加的体积。按这种方式,全部五种模式是 23.1 kB,面板外壳加一种模式是 15.0 kB。关于页说明了测量方法。
- 周下载量是 npm 在 2026 年 9 月 5–11 日的统计。chroma-panel 于 9 月 14 日首次发布,在这个统计区间之后,所以 npm 上还没有它的数据。
- @uiw/react-color 的 20 个依赖都是它自己的
@uiw/*包。它还把@babel/runtime列为 peer dependency。
功能
「支持」表示该项目的 README 或文档介绍了这项功能。「未提及」表示截至 2026 年 9 月 16 日,在这些地方找不到相关内容,但你也许仍能自己实现。
| 功能 | chroma-panel | react-colorful | react-color | @uiw/react-color |
|---|---|---|---|---|
| 色轮 | 支持 | 未提及 | 未提及 | 支持(Wheel) |
| 饱和度/亮度区域 | 支持(ColorArea,用于自定义模式) | 支持 | 支持 | 支持(Saturation) |
| 分通道滑块 | 支持(RGB、HSL、HSB) | 仅色相和透明度 | 仅色相和透明度 | 仅色相、透明度和明暗 |
| 透明度 (alpha) | 支持 | 支持 | 支持 | 支持 |
| 现代 CSS 颜色 | OKLCH、OKLab、Lab、LCH、Display P3 | 未提及 | 未提及 | 未提及 |
| 渐变编辑器 | 支持(独立入口) | 未提及 | 未提及 | 支持(独立的包) |
| Hex/RGB/HSL 文本输入 | 支持(hex、rgb()、hsl()、hwb()) | 仅 hex(HexColorInput) | 支持(EditableInput) | 支持(hex、RGBA、HSLA) |
| 预设色块或调色板 | 支持(调色板、120 色预设色网格) | 仅有代码示例 | 支持(多种色块选择器) | 支持(Swatch 等) |
| 取色器 | 支持(EyeDropper API,仅 Chromium) | 未提及 | 未提及 | 支持(Chrome 选择器,同一 API) |
| 从图片中取色 | 支持 | 未提及 | 未提及 | 未提及 |
| 弹出层或表单输入组件 | 支持(ColorInput) | 弹出层只有代码示例 | 未提及 | 未提及 |
| TypeScript 类型 | 自带 | 自带 | 单独的包 | 自带 |
| 键盘和屏幕阅读器支持 | 支持(原生 range 输入) | 支持(遵循 WAI-ARIA) | 未提及 | 未提及 |
| 对比度辅助函数 | WCAG、透明度、APCA 及配色建议 | 未提及 | 未提及 | 未提及 |
| 零依赖 | 是 | 是 | 否(7 个) | 否(20 个) |
| 最近发布 | 2026-09-21 | 2026-09-01 | 2020-10-28 | 2026-05-24 |
如何选择
react-colorful 替代方案
如果最看重打包体积,选 react-colorful。它是四个库里最小的,没有依赖,自带类型,并遵循 WAI-ARIA 规范。它的下载量也遥遥领先,最新版本发布于 2026 年 9 月 1 日。它提供饱和度区域、色相滑块、可选的透明度和 hex 输入框。弹出层和色块需要你参照 README 中的示例自己实现。
react-color 替代方案
如果你想要现成的外观,选 react-color。它自带 13 种选择器,风格仿照 Sketch、Photoshop、Chrome 等,还提供用来搭建自己选择器的基础组件。它的最新版本 2.19.3 发布于 2020 年 10 月 28 日。它有七个依赖,类型需要从单独的 @types/react-color 包获取。用它开始一个新项目之前,请先权衡这些因素。
@uiw/react-color
如果你想要许多可以逐个安装的小型选择器,选 @uiw/react-color。Sketch、Chrome、Wheel、Swatch、Slider 等都各有自己的包。它的 Chrome 选择器带有取色器,以及 hex、RGBA 和 HSLA 输入框。主包依赖了其中 20 个包,所以如果你只要其中一个选择器,请直接安装那个选择器的包。
chroma-panel
如果你需要 CSS Color 4、渐变、取色器、图片取色、调色板和可直接用于表单的输入框,可以选 chroma-panel 作为 react-colorful 的替代方案。ColorInput 会随表单提交,响应 form.reset() 重置,并支持原生校验,详见表单。取色器仅在 Chromium 系浏览器中可用,图片取色能从用户拖入的照片中提取调色板。chroma-panel 还很新:它于 2026 年 9 月 14 日首次发布,最新版本 1.0.1 发布于 9 月 21 日,下载记录还很少。如果你要的只是一个 hex 选择器,react-colorful 更小。
rc-color-picker 怎么样?
rc-color-picker 是大家对比颜色选择器时可能会看到的另一个 React 包。它没有列入上表,因为这次核查没有检查它当前的打包体积、依赖和维护情况。做同样的对比之前,请先查看它的 npm 页面和代码仓库。上表只收录了能从所附来源核实的数据。
从 react-colorful 迁移
在 react-colorful 中,onChange 收到的是颜色字符串。在 chroma-panel 中,onChange 收到的是一个 ColorChangeResult 对象,需要从中读取 result.hex。
一个 react-colorful 的 hex 选择器:
import { useState } from "react";
import { HexColorPicker } from "react-colorful";
export function Picker() {
const [color, setColor] = useState("#aabbcc");
return <HexColorPicker color={color} onChange={setColor} />;
}在 chroma-panel 中,最接近的写法是使用内联的 ChromaPanel:
import { useState } from "react";
import { ChromaPanel, type ColorChangeResult } from "chroma-panel";
export function Picker() {
const [color, setColor] = useState<string>("#aabbcc");
const handleChange = (result: ColorChangeResult): void => {
setColor(result.hex);
};
return (
<ChromaPanel
value={color}
onChange={handleChange}
modes={["wheel"]}
showAlpha={false}
showTitleBar={false}
/>
);
}需要改动的地方:
color改为value,onChangeEnd改为onChangeComplete。showAlpha={false}对应没有透明度的HexColorPicker。如果原来用的是HexAlphaColorPicker,保留透明度,并读取result.hexa。- 色轮模式显示的是一个圆盘加亮度滑块,而不是方形区域。不传
modes就会显示全部五种模式。 - 从
chroma-panel导入仍然会打包全部五种模式。如果只想打包色轮,请从chroma-panel/panel和chroma-panel/wheel导入。 - 如果需要一个点击后打开选择器的色块按钮,使用
ColorInput,传入同样的value和onChange。
快速开始介绍了这两个组件以及体积更小的导入方式。
数据来源
- chroma-panel,核查于 2026 年 9 月 16 日:
- react-colorful,核查于 2026 年 9 月 16 日:
- react-color,核查于 2026 年 9 月 16 日:
- @uiw/react-color,核查于 2026 年 9 月 16 日: