JS十六進(jìn)制顏色(#fff)與RGB, HSL顏色的相互轉(zhuǎn)換 (實(shí)用寡夹、贊)

原文出處:https://www.haorooms.com/post/color_rgb_transform

延伸閱讀:用js生成全色系調(diào)色盤的算法

前言

今天做了這個(gè)需求要出,就是前端支持rgba設(shè)置农渊,但是后臺(tái)生成圖片的時(shí)候不支持rgba,需要2個(gè)值砸紊。分別是一個(gè)十六進(jìn)制顏色值和一個(gè)opacity透明度,這就要我這邊傳值的時(shí)候醉顽,把原來(lái)的rgba轉(zhuǎn)換成2個(gè)值游添,然后傳給后臺(tái)通熄。(注唇辨,之所以前端沒(méi)有分成2個(gè)字段能耻,是因?yàn)榍岸嗽O(shè)置顏色的時(shí)候直接用一個(gè)rgba設(shè)置的晓猛,這樣用戶體驗(yàn)好,分別設(shè)置顏色和透明度的話栗恩,還要分2次洪燥,對(duì)用戶來(lái)說(shuō)稍微有點(diǎn)麻煩。)

轉(zhuǎn)換方法

轉(zhuǎn)換方法其實(shí)網(wǎng)上搜索也能搜索到亲澡,這里暫時(shí)列一下:

rgb轉(zhuǎn)為十六進(jìn)制顏色

varcolorHex =function(color){

varthat = color;

//十六進(jìn)制顏色值的正則表達(dá)式

varreg =/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

// 如果是rgb顏色表示

if(/^(rgb|RGB)/.test(that)) {

varaColor = that.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(",");

varstrHex ="#";

for(vari=0; i

varhex =Number(aColor[i]).toString(16);

if(hex.length<2) {

hex ='0'+ hex;

? ? ? ? ? ? }

? ? ? ? ? ? strHex += hex;

? ? ? ? }

if(strHex.length!==7) {

? ? ? ? ? ? strHex = that;? ?

? ? ? ? }

returnstrHex;

}elseif(reg.test(that)) {

varaNum = that.replace(/#/,"").split("");

if(aNum.length===6) {

returnthat;

}elseif(aNum.length===3) {

varnumHex ="#";

for(vari=0; i

? ? ? ? ? ? ? ? numHex += (aNum[i] + aNum[i]);

? ? ? ? ? ? }

returnnumHex;

? ? ? ? }

? ? }

returnthat;

};

colorHex('rgb(255,255,255)')

"#ffffff"

十六進(jìn)制顏色轉(zhuǎn)為RGB

varcolorRgb =function(sColor){

sColor = sColor.toLowerCase();

//十六進(jìn)制顏色值的正則表達(dá)式

varreg =/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

// 如果是16進(jìn)制顏色

if(sColor && reg.test(sColor)) {

if(sColor.length===4) {

varsColorNew ="#";

for(vari=1; i<4; i+=1) {

sColorNew += sColor.slice(i, i+1).concat(sColor.slice(i, i+1));

? ? ? ? ? ? }

? ? ? ? ? ? sColor = sColorNew;

? ? ? ? }

//處理六位的顏色值

varsColorChange = [];

for(vari=1; i<7; i+=2) {

sColorChange.push(parseInt("0x"+sColor.slice(i, i+2)));

? ? ? ? }

return"RGB("+ sColorChange.join(",") +")";

? ? }

returnsColor;

};

colorRgb("#fff")

"RGB(255,255,255)"

方法二: 用dom的方式

varcolorToRgb =function(color) {

vardiv =document.createElement('div');

div.style.backgroundColor= color;

document.body.appendChild(div);

varc =window.getComputedStyle(div).backgroundColor;

document.body.removeChild(div);

returnc;

};

HSL和RGB的互轉(zhuǎn)

一、HSL轉(zhuǎn)RGB

/**

* HSL顏色值轉(zhuǎn)換為RGB.

* 換算公式改編自 http://en.wikipedia.org/wiki/HSL_color_space.

* h, s, 和 l 設(shè)定在 [0, 1] 之間

* 返回的 r, g, 和 b 在 [0, 255]之間

*

*@paramNumber? h? ? ? 色相

*@paramNumber? s? ? ? 飽和度

*@paramNumber? l? ? ? 亮度

*@returnArray? ? ? ? ? RGB色值數(shù)值

*/

functionhslToRgb(h, s, l) {

varr, g, b;

if(s ==0) {

r = g = b = l;// achromatic

}else{

varhue2rgb =functionhue2rgb(p, q, t) {

if(t <0) t +=1;

if(t >1) t -=1;

if(t <1/6)returnp + (q - p) *6* t;

if(t <1/2)returnq;

if(t <2/3)returnp + (q - p) * (2/3- t) *6;

returnp;

? ? ? ? }

varq = l <0.5? l * (1+ s) : l + s - l * s;

varp =2* l - q;

r =hue2rgb(p, q, h +1/3);

g =hue2rgb(p, q, h);

b =hue2rgb(p, q, h -1/3);

? ? }

return[Math.round(r *255),Math.round(g *255),Math.round(b *255)];

}

二癞己、RGB轉(zhuǎn)HSL

/**

* RGB 顏色值轉(zhuǎn)換為 HSL.

* 轉(zhuǎn)換公式參考自 http://en.wikipedia.org/wiki/HSL_color_space.

* r, g, 和 b 需要在 [0,255] 范圍內(nèi)

* 返回的 h, s, 和 l 在 [0,1] 之間

*

* @param? Number? r? ? ? 紅色色值

* @param? Number? g? ? ? 綠色色值

* @param? Number? b? ? ? 藍(lán)色色值

* @returnArray? ? ? ? ? HSL各值數(shù)組

*/

functionrgbToHsl(r, g, b){

r /=255, g /=255, b /=255;

varmax= Math.max(r, g, b),min= Math.min(r, g, b);

var h, s, l = (max+min) /2;

if(max==min){

h = s =0; // achromatic

}else{

var d =max-min;

s = l >0.5? d / (2-max-min) : d / (max+min);

switch(max) {

case r: h = (g - b) / d + (g < b ?6:0);break;

case g: h = (b - r) / d +2;break;

case b: h = (r - g) / d +4;break;

? ? ? ? }

h /=6;

? ? }

return[h, s, l];

}

rgba轉(zhuǎn)化為2個(gè)值得方法

? watch: {

'background'(val) {

// 轉(zhuǎn)換成2個(gè)字段痹雅,用了比較笨的辦法轉(zhuǎn)吧

let tempval =val.replace('rgba(','').replace(')','').split(',')

this.$set(this.haorooms.data,'background', {})

this.$set(this.haorooms.data.background,'color', `rgb(${tempval[0]},${tempval[1]},${tempval[2]})`)

this.$set(this.haorooms.data.background,'opacity', tempval[3])

? ? }

? }

2個(gè)值轉(zhuǎn)為RGBA的方法(回填需要)

if(this.haorooms.data.background) {

let color =this.colorToRgb(this.templateData.data.background.color)// 上面列舉的方法

let tempval = color.replace('rgb(','').replace(')','').split(',')

tempval.push(this.templateData.data.background.opacity)

this.background = `rgba(${tempval.join(',')})`

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绩社,一起剝皮案震驚了整個(gè)濱河市赂苗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朴沿,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坚芜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)货岭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門屯仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搔谴,“玉大人,你說(shuō)我怎么就攤上這事峰弹∥吖” “怎么了右钾?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)窘茁。 經(jīng)常有香客問(wèn)我山林,道長(zhǎng)邢羔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任洼怔,我火速辦了婚禮署惯,結(jié)果婚禮上极谊,老公的妹妹穿的比我還像新娘。我一直安慰自己轻猖,他們只是感情好咙边,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布败许。 她就那樣靜靜地躺著,像睡著了一般市殷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搞挣,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天囱桨,我揣著相機(jī)與錄音嗅绰,去河邊找鬼办陷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛民镜,可吹牛的內(nèi)容都是我干的制圈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慧库,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼齐板!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起橡羞,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤卿泽,失蹤者是張志新(化名)和其女友劉穎滋觉,沒(méi)想到半個(gè)月后签夭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎侠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年覆致,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺蔚。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煌妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宣羊,到底是詐尸還是另有隱情璧诵,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布仇冯,位于F島的核電站之宿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苛坚。R本人自食惡果不足惜等缀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望噪裕。 院中可真熱鬧膳音,春花似錦苍凛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至茅信,卻和暖如春蘸鲸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窑多。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工判沟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吧秕,地道東北人砸彬。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滴某,于是被迫代替她去往敵國(guó)和親霎奢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幕侠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容