跳到正文
misoto22 design

表单

ColorPicker 取色器

一个颜色,选出来的,或者打出来的。

用法

什么时候用它

有人正在挑这个颜色。一个只是被展示出来的颜色是一块色卡,而一组固定的品牌色是 RadioGroup——一个取色器给一道只有六个答案的题准备了一千六百万个。
TSX
import { ColorPicker } from '@misoto22/design'

说明

一个颜色,选出来的,或者打出来的。

这个面板在 OKLCH 里工作,而这正是它值得取代 <input type="color"> 的理由。在 HSV 里——原生取色器和大多数库用的都是它——沿着一行「亮度」不变的颜色横着拖过去,眼睛读到的却是它在一点点变暗,于是一个在调色板上找颜色的人,是在跟手里的工具较劲。OKLCH 的亮度就是人看到的那个亮度,所以平面上同一高度的两个颜色是真的一样亮,而色相条停在已经选定的那个亮度上,而不是摆出一道属于别的颜色的彩虹。

这个平面是逐行归一到色域的:它的右边缘就是那个亮度和色相下真正存在的最大彩度,所以整个面都够得着,而不是一小片颜色的透镜泡在一大片被裁平的重复色里。

它收什么。 十六进制、rgb()hsl()oklch()color(display-p3 …),两种写法都行。颜色名不收:要认它们,得带上一张写满每个 CSS 名字的表,或者一个活的 DOM,而一个认得 "rebeccapurple"、不认得 "papayawhip" 的框,比两个都不认的还糟。

键盘。 那个平面是两个真滑块凑成的一组——彩度横着走,亮度竖着走——所以方向键推得动它,读屏软件也会报出它此刻在哪儿。这正是二维画布通常漏掉的那一半,而漏掉它,这个控件不是变笨,是没法用。

结构

ColorPicker anatomy
部件说明
触发器必填收起来时的那个控件:一块色卡,后面跟着文本形式的值,装在和 Input、Select 同一个盒子里。它由自己的 label 和自己的值共同命名,所以读者听到的是「品牌色,#a78bfa」,而不是其中的任何一半。
色卡颜色压在一块棋盘格上,所以一个半透明的值读起来是透明,而不是一个更淡的颜色。
写法条十六进制、OKLCH 和 Display P3,做成一个单值的 ToggleGroup。它改的是 onValueChange 吐出什么,不是这个颜色本身——而十六进制和 P3 都是有界的,所以切到其中一个,颜色会在出去的路上被收进那个色域。
色面必填那个平面:彩度横着走,亮度竖着走。每一行都归一到那个亮度和色相下真正存在的最大彩度,所以整个面都够得着,而不是一小片颜色的透镜夹在成带的重复色之间。它下面是两个真滑块,而不是画布上挂几个按键处理函数,这正是它拥有方向键、Home、End 和一个被播报的位置的原因。
色相轨一条取在已经选定的亮度和彩度上的渐变,不是一道通用彩虹——所以这条带子展示的是这个颜色的各个色相,而不是别的颜色的。
透明度轨从透明到当前颜色,压在和色卡同一块棋盘格上。
CSS 框文本形式的值。收十六进制、rgb()、hsl()、oklch() 和 color(display-p3 …),两种写法都行;除此之外的任何东西,它都会把自己画成无效。

实践建议

推荐

  • 把它套在 Field 里。触发器是一个按钮,标签绑得住、也点得进去——在这些组合控件里,这是少数几个不用额外帮忙就成立的。
  • 你想拿回什么写法,就传什么写法进去。面板会一直用值进来时的那种写法吐出去,直到有人在写法条里改掉它,所以一个 "#a78bfa" 的 defaultValue 会让调用方一直待在十六进制里。
  • 当这些颜色正在被调的时候,用它而不是 <input type="color">。原生取色器工作在 HSV 里,那里一行亮度不变的颜色越饱和看着越暗——于是一个在配调色板的人是在跟手里的工具较劲。OKLCH 才是那个「同一高度的两个颜色真的一样亮」的空间。

避免

  • 不要传颜色名。十六进制、rgb()、hsl()、oklch() 和 color(display-p3 …) 都解析得了;"rebeccapurple" 不行,那个框会把它显示成无效。要认颜色名,得带上一张写满每个 CSS 关键字的表,或者一个活的 DOM,而一个认得一部分名字、不认得另一部分的取色器,比一个都不认的还糟。
  • 不要把吐出来的字符串当成一种固定写法。它取决于写法条当下设成什么,所以一个上来就把开头的 "#" 切掉的调用方,会在读者第一次选中 OKLCH 时坏掉。
  • 不要用它去挑正文色或背景色,然后管结果叫无障碍。这里没有任何东西在量对比度;一个允许读者给正文选 #eeeeee 的取色器,做的正是它被要求做的事。

示例

default

这个面板在 OKLCH 里工作,而这就是它胜过原生取色器的全部理由。在 HSV 里——input type=color 和大多数库用的都是它——一行亮度不变的颜色,越饱和看着越暗,于是一个在配调色板的人是在跟手里的工具较劲。在这里,平面上同一高度的两个颜色是真的一样亮,色相条也取在已经选定的那个亮度上,而不是一道属于别的颜色的彩虹。这个平面是一张画好的画布下面盖着两个真滑块,所以方向键推得动它,读屏软件也会说出此刻在哪个轴上。

Passed in as OKLCH, so it comes back as OKLCH.

键盘操作

ColorPicker keyboard interactions
按键作用
EnterSpace打开面板。
把当前聚焦的那个轴或那条轨移动一个步长。
HomeEnd把那个轴或那条轨跳到两端。
Escape关闭面板;焦点回到触发器。

无障碍

  • label 必填。触发器展示的是一个值,而一个值不是名字。
  • 那个平面是两个真滑块凑成的一组——彩度和亮度——各自带百分比播报,所以这个二维面是可操作、也被报告出来的,而不只是可以点。
  • 聚焦环画在那个平面上,因为真正接住焦点的那两个滑块是视觉隐藏的,浏览器自己那圈环会连同它们一起被裁掉。
  • 透明度在每一处展示的地方都由一块棋盘格再说一遍,所以透明不是只靠明暗来传达的。