整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何更有逼格的用JS控制CSS顏色?

          如何更有逼格的用JS控制CSS顏色?

          者 | Adam Giese

          譯者 | 王強

          CSS 中有兩種顏色模型 RGB 和 HSL,如何用 JavaScript 控制它們?

          背景知識:顏色模型

          點開這篇文章的你,肯定是想要學習怎樣控制顏色的——我們后面就會講具體操作。但首先,我們需要對 CSS 如何標記顏色有一個基本的認識。CSS 使用的是兩種顏色模型:RGB 和 HSL,我們先簡單了解一下。

          1、RGB

          RGB 就是“紅色,綠色,藍色”的簡稱。這個模型由三個數字組成,每個數字表示其所代表的顏色在最終生成的顏色中有多高的亮度。在 CSS 中,每個數值的范圍都是 0-255,三個數值間用逗號分隔,作為 CSS rgb 函數的參數,例如:rgb(50,100,0)。

          RGB 是一種“增量”顏色系統。這意味著每個數字越高,最終生成的顏色就越亮。如果所有值都相等就生成灰度顏色;如果所有值都為零,結果為黑色;如果所有值都是 255,則結果為白色。

          此外你也可以使用十六進制表示法來標記 RGB 顏色,其中每種顏色的數值從 10 進制轉換為 16 進制。例如,rgb(50,100,0)用 16 進制就寫成#326400。

          雖然我個人比較習慣使用 RGB 模型(特別是十六進制),但我也經常發現它不易閱讀,也不容易操作。下面來看 HSL 模型。

          2、HSL

          HSL(https://codepen.io/AdamGiese/full/989988044f3b8cf6403e3c60f56dd612)是“色調,飽和度,光線”的簡稱,HSL 也包含三個值。色調值對應于色輪上的點,由 CSS 角度值表示,最常用的是度數單位。

          飽和度以百分比表示,是指顏色的強度。當飽和度為 100%時顏色最深,飽和度越低,顏色越淺,直到灰度為 0%。

          亮度也以百分比表示,指的是顏色有多亮?!俺R帯钡牧炼仁?50%。無論色調和飽和度值如何,100%的亮度都是純白色,0%的亮度就是純黑色。

          我覺得 HSL 模型更直觀一些,顏色之間的關系更加明顯,控制顏色時只要簡單地調整幾個數字就可以了。

          3、顏色模型之間的轉換

          RGB 和 HSL 顏色模型都將顏色分解為各種屬性。要在不同模型之間進行轉換,我們首先需要計算這些屬性。

          除了色調,上面提到的所有數值都可以表示為百分比。就連 RGB 值也是用字節表示的百分比。在下面提到的公式和函數中,這些百分比將由 0 到 1 之間的小數來表示。

          這里提一下,我并不會深入探討這些數學知識;相比之下,我將簡要介紹一遍原始數學公式,然后將其轉換為 JavaScript 格式。

          4、從 RGB 模型中計算亮度

          亮度是三個 HSL 值中最容易計算的一個。其數學式如下,其中 M 是 RGB 值的最大值,m 是最小值:

          亮度的數學式

          用 JavaScript 函數寫成下面的形式:

          const rgbToLightness=(r,g,b)=>
           1/2 *(Math.max(r,g,b)+ Math.min(r,g,b));
          

          5、從 RGB 模型中計算飽和度

          飽和度僅比亮度稍微復雜一些。如果亮度為 0 或 1,則飽和度值為 0;否則,它基于下面的數學公式計算得出,其中 L 表示亮度:

          飽和度的數學式

          寫成 JavaScript:

          const rgbToSaturation=(r,g,b)=> {
           const L=rgbToLightness(r,g,b);
           const max=Math.max(r,g,b);
           const min=Math.min(r,g,b);
           return (L===0 || L===1)
           ? 0
           : (max - min)/(1 - Math.abs(2 * L - 1));
          };
          

          6、從 RGB 模型中計算色調

          從 RGB 坐標中計算色調角度的公式有點復雜:

          色調的數學式

          寫成 JavaScript:

          const rgbToHue=(r,g,b)=> Math.round(
           Math.atan2(
           Math.sqrt(3) * (g - b),
           2 * r - g - b,
           ) * 180 / Math.PI
          );
          

          最后 180 / Math.PI 的算法是將結果從弧度轉換為度。

          7、計算 HSL

          上面這些函數都可以包含在同一個功能函數里:

          const rgbToHsl=(r,g,b)=> {
           const lightness=rgbToLightness(r,g,b);
           const saturation=rgbToSaturation(r,g,b);
           const hue=rgbToHue(r,g,b);
           return [hue, saturation, lightness];
          }
          

          8、從 HSL 模型中計算 RGB 值

          開始計算 RGB 之前,我們需要一些前提值。

          首先是“色度”值:

          色度的數學式

          還有一個臨時的色調值,我們將用它來確定我們所屬的色調圈的“段”:



          色調區間的數學式

          接下來,我們設一個“x”值,它將用作中間(第二大)組件值:

          臨時“x”值的數學式

          我們再設一個“m”值,用于調整各個亮度值:

          亮度匹配的數學式

          根據色調區間值,r,g 和 b 值將映射到 C,X 和 0:

          RGB 值的數學式,不考慮亮度

          最后,我們需要映射每個值以調整亮度:

          用 RGB 來解釋亮度的數學式

          將上面這些都寫到 JavaScript 函數中:

          const hslToRgb=(h,s,l)=> {
           const C=(1 - Math.abs(2 * l - 1)) * s;
           const hPrime=h / 60;
           const X=C * (1 - Math.abs(hPrime % 2 - 1));
           const m=l - C/2;
           const withLight=(r,g,b)=> [r+m, g+m, b+m];
          if (hPrime <=1) { return withLight(C,X,0); } else
           if (hPrime <=2) { return withLight(X,C,0); } else
           if (hPrime <=3) { return withLight(0,C,X); } else
           if (hPrime <=4) { return withLight(0,X,C); } else
           if (hPrime <=5) { return withLight(X,0,C); } else
           if (hPrime <=6) { return withLight(C,0,X); }
          }
          

          9、創建顏色對象

          為了便于在操作屬性時訪問,我們將創建一個 JavaScript 對象。把前面提到的這些函數打包起來就能創建這個對象:

          const rgbToObject=(red,green,blue)=> {
           const [hue, saturation, lightness]=rgbToHsl(red, green, blue);
           return {red, green, blue, hue, saturation, lightness};
          }
          const hslToObject=(hue, saturation, lightness)=> {
           const [red, green, blue]=hslToRgb(hue, saturation, lightness);
           return {red, green, blue, hue, saturation, lightness};
          }
          

          10、示例

          我強烈建議你花些時間看看這個示例:

          https://codepen.io/AdamGiese/full/86b353c35a8bfe0868a8b48683faf668

          從中了解調節各個屬性時其它屬性如何發生變化,這樣能幫助你更深入地了解兩種顏色模型是如何對應的。

          顏色控制

          現在我們已經知道怎樣在顏色模型之間進行轉換了,那么就來看看該如何控制這些顏色!

          1、更新屬性

          我們提到的所有顏色屬性都可以單獨控制,返回一個新的顏色對象。例如,我們可以編寫一個旋轉色調角度的函數:

          const rotateHue=rotation=> ({hue, ...rest})=> {
           const modulo=(x, n)=> (x % n + n) % n;
           const newHue=modulo(hue + rotation, 360);
          return { ...rest, hue: newHue };
          }
          

          rotateHue 函數會接受一個旋轉參數并返回一個新函數,該函數接受并返回一個顏色對象。這樣就可以輕松創建新的“旋轉”函數:

          const rotate30=rotateHue(30);
          const getComplementary=rotateHue(180);
          const getTriadic=color=> {
           const first=rotateHue(120);
           const second=rotateHue(-120);
           return [first(color), second(color)];
          }
          

          用這種方式,你也可以編寫加深或提亮顏色的函數——或者反過來,減淡或變暗也行。

          const saturate=x=> ({saturation, ...rest})=> ({
           ...rest,
           saturation: Math.min(1, saturation + x),
          });
          const desaturate=x=> ({saturation, ...rest})=> ({
           ...rest,
           saturation: Math.max(0, saturation - x),
          });
          const lighten=x=> ({lightness, ...rest})=> ({
           ...rest,
           lightness: Math.min(1, lightness + x)
          });
          const darken=x=> ({lightness, ...rest})=> ({
           ...rest,
           lightness: Math.max(0, lightness - x)
          });
          

          2、顏色謂詞

          除了顏色控制以外,你還可以編寫“謂詞”——亦即返回布爾值的函數。

          const isGrayscale=({saturation})=> saturation===0;
          const isDark=({lightness})=> lightness < .5;
          

          3、處理顏色數組

          過濾器

          JavaScript [] .filter 方法會接受一個謂詞并返回一個新數組,其中包含所有“傳遞”的元素。我們在上一節中編寫的謂詞可以用在這里:

          const colors=[/* ... an array of color objects ... */];
          const isLight=({lightness})=> lightness > .5;
          const lightColors=colors.filter(isLight);
          

          排序

          要對顏色數組進行排序,首先需要編寫一個“比較器”函數。此函數接受一個數組的兩個元素并返回一個數字來表示“贏家”。正數表示第一個元素應該先排序,而負數表示第二個元素應該先排序。零值表示平局。

          例如,這是一個比較兩種顏色亮度的函數:

          const compareLightness=(a,b)=> a.lightness - b.lightness;
          

          這是一個比較飽和度的函數:

          const compareSaturation=(a,b)=> a.saturation - b.saturation;
          

          為了防止代碼重復,我們可以編寫一個高階函數來返回一個比較函數來對比各種屬性:

          const compareAttribute=attribute=>
           (a,b)=> a[attribute] - b[attribute];
          const compareLightness=compareAttribute('lightness');
          const compareSaturation=compareAttribute('saturation');
          const compareHue=compareAttribute('hue');
          

          平均屬性

          你可以搭配各種 JavaScript 數組方法來平衡顏色數組中的特定屬性。首先,你可以使用 reduce 求和并用 Array length 屬性分割來計算一個屬性的均值:

          const colors=[/* ... an array of color objects ... */];
          const toSum=(a,b)=> a + b;
          const toAttribute=attribute=> element=> element[attribute];
          const averageOfAttribute=attribute=> array=>
           array.map(toAttribute(attribute)).reduce(toSum) / array.length;
          

          你可以用它來“規范化”一組顏色:

          /* ... continuing */
          const normalizeAttribute=attribute=> array=> {
           const averageValue=averageOfAttribute(attribute)(array);
           const normalize=overwriteAttribute(attribute)(averageValue);
           return normalize(array);
          }
          const normalizeSaturation=normalizeAttribute('saturation');
          const normalizeLightness=normalizeAttribute('lightness');
          const normalizeHue=normalizeAttribute('hue');
          

          4、結論

          顏色是網絡不可或缺的一部分。將顏色分解為屬性就可以靈活控制它們,并創造出無限的可能。

          查看英文原文:

          https://blog.logrocket.com/how-to-manipulate-css-colors-with-javascript-fb547113a1b8

          福利推薦

          前端領域的技術演進一直要比其他技術快一些,這給前端工程師帶來持續的挑戰。這里整理了從 Vue 到 React、iOS 到 Andoid、再到前端架構體系的干貨課程,帶你解讀從前端小工到專家的實戰心法,高效解決 80% 的開發難題。

          TML 顏色由紅色、綠色、藍色混合而成。

          顏色值

          HTML 顏色由一個十六進制符號來定義,這個符號由紅色、綠色和藍色的值組成(RGB)。

          種顏色的最小值是0(十六進制:#00)。最大值是255(十六進制:#FF)。

          這個表格給出了由三種顏色混合而成的具體效果:

          顏色值

          顏色(Color)顏色十六進制(Color HEX)顏色RGB(Color RGB)
          #000000rgb(0,0,0)
          #FF0000rgb(255,0,0)
          #00FF00rgb(0,255,0)
          #0000FFrgb(0,0,255)
          #FFFF00rgb(255,255,0)
          #00FFFFrgb(0,255,255)
          #FF00FFrgb(255,0,255)
          #C0C0C0rgb(192,192,192)
          #FFFFFFrgb(255,255,255)


          1600萬種不同顏色

          三種顏色 紅,綠,藍的組合從0到255,一共有1600萬種不同顏色(256 x 256 x 256)。

          在下面的顏色表中你會看到不同的結果,從0到255的紅色,同時設置綠色和藍色的值為0,隨著紅色的值變化,不同的值都顯示了不同的顏色。

          Red LightColor HEXColor RGB
          #000000 rgb(0,0,0)
          #080000rgb(8,0,0)
          #100000rgb(16,0,0)
          #180000rgb(24,0,0)
          #200000rgb(32,0,0)
          #280000rgb(40,0,0)
          #300000rgb(48,0,0)
          #380000rgb(56,0,0)
          #400000rgb(64,0,0)
          #480000rgb(72,0,0)
          #500000rgb(80,0,0)
          #580000rgb(88,0,0)
          #600000rgb(96,0,0)
          #680000rgb(104,0,0)
          #700000rgb(112,0,0)
          #780000rgb(120,0,0)
          #800000rgb(128,0,0)
          #880000rgb(136,0,0)
          #900000rgb(144,0,0)
          #980000rgb(152,0,0)
          #A00000rgb(160,0,0)
          #A80000rgb(168,0,0)
          #B00000rgb(176,0,0)
          #B80000rgb(184,0,0)
          #C00000rgb(192,0,0)
          #C80000rgb(200,0,0)
          #D00000rgb(208,0,0)
          #D80000rgb(216,0,0)
          #E00000rgb(224,0,0)
          #E80000rgb(232,0,0)
          #F00000rgb(240,0,0)
          #F80000rgb(248,0,0)
          #FF0000rgb(255,0,0)

          灰暗色調

          以下展示了灰色到黑色的漸變

          Gray ShadesColor HEXColor RGB
          #000000 rgb(0,0,0)
          #080808 rgb(8,8,8)
          #101010 rgb(16,16,16)
          #181818 rgb(24,24,24)
          #202020 rgb(32,32,32)
          #282828 rgb(40,40,40)
          #303030 rgb(48,48,48)
          #383838 rgb(56,56,56)
          #404040 rgb(64,64,64)
          #484848 rgb(72,72,72)
          #505050 rgb(80,80,80)
          #585858 rgb(88,88,88)
          #606060 rgb(96,96,96)
          #686868 rgb(104,104,104)
          #707070 rgb(112,112,112)
          #787878 rgb(120,120,120)
          #808080 rgb(128,128,128)
          #888888 rgb(136,136,136)
          #909090 rgb(144,144,144)
          #989898 rgb(152,152,152)
          #A0A0A0 rgb(160,160,160)
          #A8A8A8 rgb(168,168,168)
          #B0B0B0 rgb(176,176,176)
          #B8B8B8 rgb(184,184,184)
          #C0C0C0 rgb(192,192,192)
          #C8C8C8 rgb(200,200,200)
          #D0D0D0 rgb(208,208,208)
          #D8D8D8 rgb(216,216,216)
          #E0E0E0 rgb(224,224,224)
          #E8E8E8 rgb(232,232,232)
          #F0F0F0 rgb(240,240,240)
          #F8F8F8 rgb(248,248,248)
          #FFFFFF rgb(255,255,255)

          Web安全色?

          數年以前,當大多數計算機僅支持 256 種顏色的時候,一系列 216 種 Web 安全色作為 Web 標準被建議使用。其中的原因是,微軟和 Mac 操作系統使用了 40 種不同的保留的固定系統顏色(雙方大約各使用 20 種)。

          我們不確定如今這么做的意義有多大,因為越來越多的計算機有能力處理數百萬種顏色,不過做選擇還是你自己。

          最初,216 跨平臺 web 安全色被用來確保:當計算機使用 256 色調色板時,所有的計算機能夠正確地顯示所有的顏色。

          0000000000330000660000990000CC0000FF
          0033000033330033660033990033CC0033FF
          0066000066330066660066990066CC0066FF
          0099000099330099660099990099CC0099FF
          00CC0000CC3300CC6600CC9900CCCC00CCFF
          00FF0000FF3300FF6600FF9900FFCC00FFFF
          3300003300333300663300993300CC3300FF
          3333003333333333663333993333CC3333FF
          3366003366333366663366993366CC3366FF
          3399003399333399663399993399CC3399FF
          33CC0033CC3333CC6633CC9933CCCC33CCFF
          33FF0033FF3333FF6633FF9933FFCC33FFFF
          6600006600336600666600996600CC6600FF
          6633006633336633666633996633CC6633FF
          6666006666336666666666996666CC6666FF
          6699006699336699666699996699CC6699FF
          66CC0066CC3366CC6666CC9966CCCC66CCFF
          66FF0066FF3366FF6666FF9966FFCC66FFFF
          9900009900339900669900999900CC9900FF
          9933009933339933669933999933CC9933FF
          9966009966339966669966999966CC9966FF
          9999009999339999669999999999CC9999FF
          99CC0099CC3399CC6699CC9999CCCC99CCFF
          99FF0099FF3399FF6699FF9999FFCC99FFFF
          CC0000CC0033CC0066CC0099CC00CCCC00FF
          CC3300CC3333CC3366CC3399CC33CCCC33FF
          CC6600CC6633CC6666CC6699CC66CCCC66FF
          CC9900CC9933CC9966CC9999CC99CCCC99FF
          CCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
          CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFF
          FF0000FF0033FF0066FF0099FF00CCFF00FF
          FF3300FF3333FF3366FF3399FF33CCFF33FF
          FF6600FF6633FF6666FF6699FF66CCFF66FF
          FF9900FF9933FF9966FF9999FF99CCFF99FF
          FFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFF
          FFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          用了很長時間的RGB方式來作為CSS中的顏色樣式,卻不知道它是什么原理,據說這還是一道面試題,這篇文章就用來總結一下它的原理。

          我們生活中最常見的光就是太陽光,據說在1672年牛頓用三棱鏡將太陽光分離成了赤橙黃綠藍紫青七色光。隨著科技的進步,人們發現肉眼細胞對紅綠藍三種顏色較為敏感,而且這三種顏色按照不同比例混合會制造出很多其他的顏色,比如7色光中的其他4種顏色就可以用紅綠藍配比出來,是不是很神奇?這有點像電子數字,可以通過8衍生出其他九種數字。

          圖1

          基于上面的理論,咱們就可以在計算機世界里用紅綠藍的搭配來顯示各種顏色。

          目前RGB方式是將這三種顏色各用一個字節表示,每個字節8位,每位的大小是0到255,即這三種顏色每一個有256個選擇,RGB一共可以表示256*256*256=16777216種顏色。雖然這并不能完全描述自然界中所有的光,但已經可以滿足正常的生活需要了。

          在CSS中,我們的寫法如下:

          #p1 {background-color:rgb(255,0,0);} /* 紅 */
          #p2 {background-color:rgb(0,255,0);} /* 綠 */
          #p3 {background-color:rgb(0,0,255);} /* 藍 */

          RGB括號中每一位數字都要在0到255之間。

          CSS顏色還有另外一種寫法,如下:

          #p1 {color: #001122}

          因為每個顏色是8位,所以還可以將每位顏色轉成2位的16進制,三種顏色就是6位。

          對于上面重復的數字還可以簡寫,如下:

          #p1 {color: #012}

          在CSS代碼規范里面咱們可以做一些代碼的檢測,至少可以少寫幾個字符。

          存儲格式

          1、RGB565

          這種方式用16位二進制來表示一個像素的顏色,紅色5位,綠色6位,藍色5位;

          2、RGB55

          這種方式也是用16位表示一個像素的顏色,但是最高位是保留位,不用,剩下的15位被三種顏色平分,即各五位。

          3、RGB24

          這種方式每個顏色用一個字節表示,和原理中說的方式一致。

          4、RGB32

          這種方式每個顏色用一個字節表示,還剩一個字節為保留位,不用。

          5、ARGB32

          這種方式用4個字節表示顏色,前三個字節分別表示紅、綠、藍,最后一個字節表示透明度alpha。

          總結

          在實際生活中我們有很多三原色的應用場景,比如電視,它顯示的每個像素點可以認為是隱藏在屏幕后面的三種顏色的小燈照射形成的。所以三原色原理不僅應用在web頁面中,生活中的應用場景也隨處可見。


          主站蜘蛛池模板: 无码国产伦一区二区三区视频| 精品亚洲AV无码一区二区| 久久精品免费一区二区三区| 亚洲AV无码一区东京热| 天天躁日日躁狠狠躁一区| 国产福利视频一区二区| 日本在线视频一区二区| 日韩精品一区二区三区视频| 亚洲国产老鸭窝一区二区三区| 国产日韩精品一区二区在线观看播放| 精品福利一区二区三区| 日韩在线观看一区二区三区| 亚洲国产精品自在线一区二区| 国产成人精品一区在线| 色欲AV蜜桃一区二区三| 久久er99热精品一区二区| 中文字幕一区精品| 亚洲成人一区二区| 波多野结衣一区二区免费视频| 亚洲日韩国产一区二区三区在线| 中文字幕色AV一区二区三区| 视频一区二区在线播放| 无码人妻精品一区二区三区9厂 | 相泽南亚洲一区二区在线播放| 亚洲不卡av不卡一区二区| 国产美女视频一区| 一区二区高清视频在线观看| 国产成人一区二区三区| 国产精品视频一区麻豆| 国产精品揄拍一区二区| 亚洲一区精品视频在线| 久久久精品一区二区三区 | 色狠狠色噜噜Av天堂一区| 麻豆视频一区二区三区| 波多野结衣中文字幕一区| 日本免费一区二区三区最新| 四虎成人精品一区二区免费网站| 欧美激情国产精品视频一区二区| 亚洲AV无码一区二区三区人 | 久久一区二区三区免费| 搜日本一区二区三区免费高清视频|