本文主要分为两部分进行讲解。首先带大家进一步了解颜色模型相关的概念,然后在此基础上封装一个ColorPicker组件。同时文末还会分享一个前端小技巧,不要错过哦!颜色模型在我们日常开发中,我们经常使用的颜色模型主要是十六进制和RGB。浏览器支持的颜色模型还包括颜色标识符和HSL。作为前端开发者,基本上只需要照搬设计稿中给定的颜色值即可,但是如果要封装一个选色组件,就得了解这些颜色模型的原理。RGB和十六进制中最直观的颜色模型应该是RGB,比较简单。它主要将颜色分为红、绿、蓝三个通道,分别对应R、G、B。然后将每个通道分成256(0~255)个等级来表示颜色的强度。根据屏幕的三基色原理,可以合成出我们需要的各种颜色。它能表示的颜色有256**3=16777216种,远远超出了人眼所能识别的颜色范围。十六进制也属于RGB颜色模型,只是显示形式不同。它将RGB表示的十进制值转换为十六进制,每个颜色通道(0~255)的十六进制为(00~FF),同样以#开头。例如:当所有颜色通道为0时,显示的颜色为全黑,RGB表示rgb(0,0,0),十六进制表示#000000或#000;当所有颜色通道为255时,显示颜色为Allwhite,RGB表示rgb(255,255,255),十六进制表示#ffffff或#fff;同理,蓝色、绿色、红色表示每个通道的值设置最大,其他通道的值设置最小。虽然RGB三通道模型非常直观,可以表示如此多的颜色,但很明显,人们很难调出自己想要的颜色。因为当我们需要一种颜色时,很难人为地控制哪个通道需要更多的颜色,哪个颜色通道需要设置得更小。专业人士凭经验大概能叫出来,但对于我们用户小白来说,基本无计可施。HSL和HSV(很关键)针对以上问题,我们不得不了解另外两种颜色模型:HSL和HSV。这两种颜色模型非常相似,所以把它们放在一起,了解这两种颜色显示的原理,就能玩出很多花样。HSL主要将颜色分为色相(H:hue)、饱和度(S:saturation)和亮度(L:lightness)三个通道,其中最重要的是色相(H)。色调H以红、绿、蓝三原色为基础,用360°的圆圈表示。红色为0°,绿色为120°,蓝色为240°。并在红色和绿色之间添加60°的黄色,在绿色和蓝色之间添加180°的青色,在蓝色和红色之间添加300°的品红色。然后通过这6种颜色的过渡,得到一个360°的色相环。饱和度S是指颜色的强度或纯度,用0~100%的百分比表示。值越高,颜色越鲜艳,值越低,颜色越暗。呈现的是从灰色到色调的过渡。亮度L是颜色的明暗程度,也用0~100%的百分比表示。主要反应是色彩中的黑白两色。小于50%时混入的黑色越多,大于50%时混入的白色越多。当值为0时,显示颜色为纯黑色,当值为100%时,显示颜色为纯白色,与其他两个通道的值无关。HSV模型和HSL模型一样,H也是色调的意思,区别是S和V(值)。饱和度S虽然也指颜色的纯度,但它反映的是白色混入的高低,数值越大,白色混入越少,颜色越纯,数值越小,白色混入越多。值为0,显示为纯白色。明度V它所表达的明暗程度是指与黑色混合的程度。数值越小,黑色混入越多,数值越大,黑色混入越少。当数值为0时,表现为纯黑色。组件UI的实现了解了这些颜色模型的原理,那么我们现在就可以开始编码了。细心的同学应该发现了,为什么要引入HSV模型呢?浏览器实际上并不支持这种颜色模型。其实这主要是为了封装组件的需要。市面上的选色组件基本都是按照HSV颜色模型实现的。至于为什么,一是为了统一,一些共识标准不应该改变;二来也应该方便UI的实现,需要将这些三维的颜色模型展开成二维的,HSV更符合人的直觉视觉。如何展开?一般将色相H展开为一维线性形状(用0°~360°的圆或线段表示);将饱和度S和明度V展开成一个二维矩形,x轴表示饱和度S,y轴表示明度V;如果需要透明度A,再添加一个一维线段。上面不重点讲透明度,因为这些颜色模型的透明度都是一样的,可以看成是一般的颜色通道。再看UI的实现(注:组件基于uniapp+vue3,只展示部分代码):hue的实现
