Skip to content

Color Picker 颜色选择器

一个紧凑的色块,点击后弹出面板,包含饱和度/明度调色板、色相滑块、透明度滑块, 以及 HEX/RGB 数值输入框。其 value 接受并输出标准的 CSS 颜色字符串。

代码演示

xml
<r-colorpicker value="#006bff"></r-colorpicker>
<r-colorpicker value="rgba(255,0,0,0.5)"></r-colorpicker>

点击色块(或聚焦后按 Enter/Space)即可打开面板。色相与透明度滑块支持键盘操作: 方向键步进 1,Shift+方向键步进 10,Home/End 跳到两端。

属性

value

当前颜色,为 CSS 颜色字符串。输入时接受 HEX(#1677FF#fff)、rgb(...)rgba(...)。 输出时,完全不透明的颜色规范化为 6 位 HEX 字符串,透明度小于 1 时则为 rgba(...) 字符串。

js
const picker = document.querySelector('r-colorpicker');
picker.value = '#00c853';
console.log(picker.value); // 读回当前颜色

sheet

注入到组件 shadow DOM 的 CSS,与其它所有 ranui 组件的 sheet 约定一致。

事件

change

颜色发生变化时触发 —— 拖动调色板、移动滑块、编辑数值输入框,或设置 value 特性时。 该事件会冒泡且是 composed(可跨越 shadow 边界)。event.detail 携带各种格式的颜色:

字段类型示例
valuestring"#1677ff" / "rgba(22, 119, 255, 0.5)"
hexstring"#1677ff"
rgbstring"rgb(22, 119, 255)"
rgbastring"rgba(22, 119, 255, 0.5)"
alphanumber0.5
js
picker.addEventListener('change', (e) => {
  console.log(e.detail.hex, e.detail.alpha);
});

样式定制

  • ::part(block) — 色块容器(带棋盘格背景的触发框)。
  • ::part(swatch) — 显示当前颜色的内部填充块。
  • CSS 变量 — 触发色块读取以下令牌:
变量用途
--ran-colorpicker-background色块背景
--ran-colorpicker-border色块边框
--ran-colorpicker-border-hover悬停时的边框颜色
--ran-colorpicker-border-radius色块圆角
--ran-colorpicker-block-border-radius内部块圆角
--ran-colorpicker-transition悬停过渡
css
r-colorpicker {
  --ran-colorpicker-border-radius: 6px;
}
r-colorpicker::part(block) {
  box-shadow: 0 0 0 1px var(--line);
}

弹出面板会被挂载到 document.body,因此其样式使用了独立命名空间(.ran-color-picker-*) 并随面板一起迁移,而非驻留在宿主上。

通过 import 'ranui'(注册全部组件)或独立子路径 import 'ranui/colorpicker' 引入。

Released under the MIT License.