Chrome Devtools 的颜色提取器 EyeDropper,用惯了 Chrome 的前端开发者并不陌生。css
但它并不支持在页面中使用,想在页面中使用只能本身实现一个。前端
那么接下来就介绍一下如何本身实现一个 EyeDropper。git
要实现 EyeDropper,必须先学习一下基本的色彩知识。github
物品被光线照射并反射出来,被人的眼睛接收,进而传递到人脑中造成对「色彩」的认知,称之为人的「视觉效应」。web
最最基本的颜色术语、一般用来表示物体的颜色。chrome
当咱们说红、绿、黄时,咱们说的就是色相。将色相按照波谱顺序排列,首位相连造成环状则为「色相环」。虽然人们习惯将其分为七种颜色:红、橙、黄、绿、青、蓝、紫,但实际上的光谱应该是连续的。npm
指在特定的光照条件下颜色是如何呈现的,也就是色彩的鲜艳程度。chrome-devtools
饱和度取决于颜色中含色成分和消色成分(灰色)的比例,即纯度最低的是灰色(无彩色)。高纯度表现为生机朝气,低纯度表现为厚重沉稳。组件化
也被称做亮度,它是指颜色的明亮程度。学习
在任何颜色中添加白色,明度上升,添加黑色,明度降低。明度相差越远的两种颜色搭配,色彩之间的交界感就越明显,视觉上也就越清晰。
三者能够简单用下图综合表示:
理解了基础的颜色原理后就好办事了,拿 Chrome Devtools EyeDropper 分析:
结合上述色彩知识,加上这块分析就能够开始进入代码层面的设计。
在组件化大行其道的时代,以网易惯用的 Regular 进行组件化开发。
根据模块划分,划分基础的:
考虑简洁性,「取色器」及「调色板」不作实现。
① 该组件以色相组件选择的色相(hue)为背景,如果想直接使用 hue 做为 CSS 背景,须要使用 hsl(hue, saturation, value) 格式,设置为:
hsl(hue, 100%, 50%)复制代码
此时饱和度应设为 100%,由于饱和度为 0% 时为灰色,100% 时为原色。
而亮度是指颜色偏向于白色仍是黑色。50%的亮度值表示颜色位于黑色和白色中间,这时颜色会基本保持原来的颜色不变。
② 同时利用线性渐变 linear-gradient
作色层叠加实现。
.saturation-white {
background: linear-gradient(to right, #fff, rgba(255,255,255,0));
}
.saturation-black {
background: linear-gradient(to top, #000, rgba(0,0,0,0));
}复制代码
上面谈到了色相环的概念,色相组件利用的就是色相环原理。
将 EyeDropper 中的色相条与色相环对比,是否是有殊途同归之妙?答对了,直接将圆环拍平便可。
获取色值时只须要获取当前位置对于最左端的百分比,换算成圆环角度。
Math.round(360 * percent / 100);复制代码
其中总共有 RGBA、HSL 和 HEX 三种格式的切换。
在 Regualr 中,内嵌组件的传入属性会挂在子组件的 data 上,并实现数据绑定。但考虑数据处理的统一性,在全部颜色的获取处并不对颜色作处理,而是经过事件传递的方式,统一 $emit 到外层作统一的色值转换。
this.$emit('change', {
h: hue,
s: saturation,
v: bright,
a: alpha
});
// 外层接收后统一处理
this.$on('change', processor);复制代码
接收到不一样格式的颜色后,利用 tinycolor2 对颜色进行处理,使全部格式转换为同一种颜色。
var color = tinycolor(colors);
var hsl = color.toHsl();
var hsv = color.toHsv();复制代码
代码能够 戳我 查看,具体实现以下: