這並非npm上比較活躍的clolr包的中文文檔,不過它在最後提到了:javascript
The API was inspired by color-js. Manipulation functions by CSS tools like Sass, LESS, and Stylus.css
嗯,就是那個color-js。雖然大致功能一致,新的color庫使用更簡潔。
html
假設你已經基本瞭解色彩通道、色彩空間、色相、飽和度、亮度、不透明度等概念。固然了,畢竟前端算是半隻腳踏進設計領域了,相信這些概念難不到你。前端
Color.js爲前端開發者提供了一個簡單的顏色管理的API。使用Color.js,你能夠建立一個Color對象來方便的進行一系列的顏色操做,如格式轉換、獲取單一通道值等,而不用管具體的顏色模型以及相應的轉換關係。
使用方式:vue
<script src="https://unpkg.com/color-js@1.0.3/color.js"></script>
先來看看Color.js與以前介紹的tween.js結合會有多大的威力。
輸入一個16進制的顏色值,小方塊的顏色會以緩間動畫的方式從當前顏色過渡到輸入的顏色值。
java
See the Pen Transition State //vues.org by benymor (@benymor) on CodePen.git
color.js庫支持RGB、HSV和HSL顏色模型,以及它們各自的alpha通道。它支持CSS中表示顏色的字符串,所以很是方便。若是你的主要關注點是和人眼感知有關的色彩空間的管理(好比你涉及到了Lab模式),而不是顏色處理與轉換方面的話,或許colorspace.js會是一個更好的選擇。固然,其實平時開發Color.js就已經夠用了,至少我還沒聽過哪一個網站使用到了Lab之類的色彩模式。
Color對象是不可變對象(immutable objects,指在被創造以後,它的狀態就不能夠被改變的對象),API中提供的全部操做都會返回它自己,所以你能夠採用鏈式調用。github
當你在你的項目中使用了這個庫的時候,你能夠從公共命名空間net.brehaut中獲取Color。也許你想把它導入到你本身的命名空間裏,好比:npm
var Color = net.brehaut.Color;
Color會根據你導入的參數(對象、字符串或是數組)建立一個新對象。須要注意的是,這是一個工廠函數而不是一個構造函數,固然若是你用了new關鍵字同樣會返回新對象。
下面是幾種可行的方式:數組
//測試顏色 var Green = Color("#00FF00"); var Red = Color({hue: 0, saturation: 1, value: 1}); var Blue = Color("rgb(0,0,255)"); var Cyan = Color({hue: 180, saturation: 1, lightness: 0.5}); var Magenta = Color("hsl(300, 100%, 50%)"); var Yellow = Color([255,255,0]);
對上述的一個顏色使用API提供的庫時,它會返回一個顏色(或者一組顏色),或是一個值。你能夠把不少個操縱方法chain起來一塊兒使用。好比:
var C1 = Red.shiftHue(45).darkenByRatio(0.5).desaturateByAmount(0.1);
一個常見的場景是爲頁面中的元素進行一系列的計算,而後,你就能用toCSS
方法來把值變成一個合理的CSS顏色格式,像下面的代碼同樣:
document.getElementById('myElement').style.backgroundColor = C1.toCSS();
API提供的方法大體可分爲三類:
全部的值都是0~1的浮點數,除了Hue是一個0~360的值(你應該已經瞭解了基礎的色相輪)。
這類方法是由API自動生成,用於讀取或者設置對象的值。
setBlue(newBlue)設置綠色通道的值,返回一個新的綠色的color。
getLuminance() 返回一個0~1的值,表示這個顏色在傳統的顯示器上顯示時,人眼會以爲它有多亮。
設計大拿能夠略過了......
上述的幾種方法涉及到了RGB色彩模式、HSV(HSB)色彩模式和HSL色彩模式。
先解釋下getLuminance()這個方法。它表明的是人眼對一個顏色有多亮的主觀感受。那麼人如何感知一個顏色有多亮?
人眼的視網膜有兩種感光細胞,分別爲視錐細胞和視肝細胞。視杆細胞對暗光敏感,主要負責在昏暗環境下產生暗視覺,但無色覺,不能分辨物體的細節和顏色,所以暗環境下人只能看到物體的大概輪廓;視錐細胞有色覺,可是光敏感度差,因此視錐細胞感覺強光和顏色,產生明視覺。因此這裏咱們主要考慮的是視錐細胞,畢竟是它來分辨顏色的。
人眼能夠分辨出不少種顏色,僅光譜可區分的色澤就有150多種,事實上人能分辨的顏色高達百萬之多,顯然每種顏色對應一種感光細胞是不大合理的,因此早在19世紀初,就有學者提出了視覺的三原色說,設想在視網膜中存在着分別對紅、綠、藍光線特別敏感的三種視錐細胞,而且當受到其它顏色的光的刺激時,這三類細胞會受到不一樣程度的刺激做用,因而在中樞會基於這三種顏色而產生對其餘顏色的感受。這一學說也能解釋紅色盲、綠色盲、藍色盲的來源,就是由於缺乏對應的感光細胞。好比綠色盲,患者不只不能區分綠色,還不能區分出紅與綠之間、綠與藍之間的顏色。
而後,人眼的視錐細胞對綠光最敏感、紅光其次、藍光最不敏感。
若是對前面測試顏色中的Red、Green、Yellow分別使用getLuminance()方法,能分別獲得0.212六、0.715二、0.0722,說明這個方法正是基於人的主觀感受的。
RGB不是個很人性化的顏色,但對於計算卻很方便。它的原理是基於色光的疊加(而CMYK是基於顏料顏色的吸取)。RGB彩色模式把顏色分爲紅、綠、藍三個色彩通道,顏色的加減則是各通道的加減。
三原色的概念有兩種:美術三原色和色光三原色。
美術三原色是CMY,分別是青(Cyan)、洋紅(Magenta)和黃(Yellow)。ps中的CMYK就是基於美術三原色的(之全部多個的K,是由於僅用CMY沒法調出純黑),主要用於印刷。色光三原色是RGB,也就是紅、綠、藍。
採用這三種顏色做爲原色的緣由就是前面提過的,人眼有這三種顏色的感光細胞,而不是由於它們沒法被調和。事實上,任何三個顏色均可以做爲三原色(只要是三個不一樣的向量),可是若是以紅、黃、藍做爲三原色的話,調出綠色時,就要紅*1+黃*(-1)了,而選取RGB爲三原色的話,計算值就會全是正數,比較方面。
雖然RGB模式計算時很好使,但對人來講很很差理解啊。沒受過訓練的人,給他兩個顏色,他怎麼能分辨哪一個顏色的R通道多些、哪一個顏色的G通道多些?
考慮到RGB模式真的很不人道,因而有了這兩個色彩模式,
HSV和HSB是一個東西,表示色相(Hue)、飽和度(Saturation)和明度(Brightness)。這是一個對人友好的色彩模式。
先科普下,色相、明度和純度(飽和度)是色彩三要素。色相即顏色的名稱,好比紅橙黃等;明度指色彩的明暗變化,給一個顏色加入白色會變亮,其實就是明度的提升;純度指色彩的鮮豔程度,原色是純度最高的色彩,不一樣顏色混合的越多,純度越低。HSV彩色模式便是基於色彩三要素的。進行色彩設計時會發現,這個顏色比起非人的RGB,是多麼「順眼」!只要轉動色相環就能夠隨意的改變顏色,還能輕易地改變顏色的明度。
而後是HSL色彩模式。和HSB相比,H是同樣的,就是一個360°的色相環,S飽和度定義不同,而L亮度和B明度的區別最大。雖然二者的色彩空間呈現的差距很是大,但使用方式卻相同,都是靠人的主觀感受來調色,所以能夠主用一個模式,肯定結果後再用另外一個顏色。不過HSB模式的顏色轉化爲HSL後,會發現L值通常爲B值的一半。
HSB中,B指顏色的明度,認爲是「光的量」,能夠是任意顏色。
HSL中,L指亮度,做爲「白的量」來理解。
不過相比起來,HSL的亮度條能有更多的顏色,但顏色卻很差區分,而HSB的明度條上顏色分佈比較均勻。另外,CSS支持HSL而不是HSB模式,使用方式爲HSL(100, 50%, 30%),且百分比不能用小數代替。
想要了解HSV和HSL色彩空間,能夠閱讀HSL和HSV色彩空間——維基百科
下列是會返回一個新的color對象的方法
Magenta.toHSV() //{hue: 300, value: 1, saturation: 1, alpha: 1} Magenta.shiftHue(33) {hue: 333, saturation: 1, value: 1, alpha: 1}
Color({hue: 180, saturation: 1, lightness: 0.3}).darkenByAmount(0.12) //{hue: 180, saturation: 1, lightness: 0.18, alpha: 1}
Color({hue: 180, saturation: 1, lightness: 0.3}).darkenByRatio(0.3) //{hue: 180, saturation: 1, lightness: 0.21, alpha: 1} //發現亮度值是原來的70%,也就是減去了30%
下列是會返回一個系列color對象的方法,主要用於配色,你能夠看看配色網。這些返回的顏色涉及的一些配色理論,基本不會用到。
Magenta //{hue: 300, saturation: 1, lightness: 0.5, alpha: 1} JSON.stringify(Magenta.schemeFromDegrees([10,20])) //"[{"hue":310,"saturation":1,"value":1,"alpha":1},{"hue":320,"saturation":1,"value":1,"alpha":1}]"
Green.toCSS() //"#00FF00" Green.toCSS(1) //"#0F0"