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();複製代碼
代碼能夠 戳我 查看,具體實現以下: