為什麼分享這個主題?
“ 聖誕節到了可以幫我做個聖誕節 Theme 的活動頁嗎? “
“ Layout 都不用變,調個畫面的 UI 顏色就好,應該很快吧!? “
“ ……..…..“
當 Layout 內容不變,只修改 UI 顏色時,或是主視覺圖片時,總要相對應調整文字顏色,以防止文字在新的 UI 上因為對比不夠高而不清楚,而這時就需要發揮敏捷精神,根據遇到的重複問題,適性調整,找出解決方案,以下提供 2 種方法根據 UI 背景色自動判斷適合的文字顏色!
方法 1|CSS Variables + color-contrast()
我們可以利用CSS Variables
+ CSS 的新 functioncolor-contrast()
color-contrast() 是什麼?
color-contrast(color vs color-list)
color
是要對比的 color,結果會回傳從color list
中找出與 color 對比度最高的顏色。ex:color-contrast(#394BA0 vs white,black)
,結果產出會是 white- 2023/09/20 MDN 說明這還是個實驗性的屬性,實測 color-contrast() 支援度只有特別版本號以上的 Safari 能看到效果,並不普及,但相信這方便的功能,不久之後瀏覽器都會支援的
以防文字在新的 UI 上因為對比不夠高而不清楚,我們必須一一的設定文字顏色,按鈕顏色等等,如下:
.MoonFestival{
section{
background:black;
color:white;
}
button{
background:yellow;
color:black;
}
}
以上我們可以發現,我們需要根據每個區塊或按鈕的背景色,調整文字顏色,讓文字色彩明顯的呈現,非常費工。
這時我們可以利用CSS Variables
+ color-contrast()
,如下:
:root{
--primary-bg:black;
--primary-btn:yellow;
}
.MoonFestival{
section{
background:var(--primary-bg);
color:color-contrast(var(--primary-bg) vs white,black);
}
button{
background:var(--primary-btn);
color:color-contrast(var(--primary-btn) vs white,black);
}
}
這樣只要設定 UI 背景顏色變數,就可以完成文字或按鈕文字的色彩調整,是不是很方便呢?
Codepen 範例
方法 2|CSS Variables + calc() + rgb()
CSS Variables支援度:Can I Use
calc()支援度:Can I Use
rgb()支援度:Can I Use
上面了解到了color-contrast()
如何使用,但因為瀏覽器支援度問題,目前只能在 safari 特定版本以上才有效,在我們殷殷期盼的color-contrast
支援度提高以前,我們還可以怎麼根據背景顏色,自動判斷文字色彩呢?
>> 可以利用CSS Variables
+ calc()
+ rgb()
搭配YIQ公式
!
YIQ 是什麼?
- YIQ是將RGB顏色模型轉換成Y(亮度)、I、Q(色度)的方法
- YIQ的公式如下:
Y = 0.299R + 0.587G + 0.114B
I = 0.596R — 0.274G — 0.322B
Q = 0.211R — 0.523G + 0.312B - 根據公式我們就可以算出目前的背景色彩亮度,進而判斷背景中的文字應該呈現黑色還是白色
Codepen 範例
IT15-Day06-Create Variable UI with CSS Variables and YIQ
因為沒有設計好的 UI,codepen 範例用 input 讓大家可以隨性調整想要的背景色,進而看看文字色彩是否有隨之調整。
codepen 範例作法如下:
監聽 input 並設定根元素--red
、--green
、--blue
三個變數
const setRootProperties = ()=>{
root.style.setProperty('--red',red.value);
root.style.setProperty('--green',green.value);
root.style.setProperty('--blue',blue.value);
}
CSS Variables 設定,根據三原色變數產出背景顏色,文字顏色再根據 YIQ 公式產出,這樣就完成啦!
:root{
--background-primary:rgb(var(--red),var(--green),var(--blue));
/* 算出Y */
--accessible-color:calc(
(((var(--red) * 299 + var(--green) * 587 + var(--blue) * 114) / 1000) - 128) * -1000
);
--text-primary:rgb(var(--accessible-color),var(--accessible-color),var(--accessible-color));
}
結語
這篇文章介紹了兩種根據背景色自動判斷文字顏色的方法。
CSS Variables + color-contrast():這個方法的優點是簡單易用,但缺點是目前的瀏覽器支援度還不夠好。
CSS Variables + calc() + rgb() + YIQ公式:這個方法的優點是支援度高,但缺點是需要計算 YIQ 值,稍微複雜一些。
根據背景色自動判斷文字顏色是一種很有用的技巧,可以幫助我們提高 UI 的易讀性。
想要看更多 CSS 文章,歡迎來看我今年的鐵人賽文章-你應該要知道的 CSS 技巧:發掘被忽略但實用的屬性
參考來源
- https://codepen.io/joshbader/pen/bzeYgq
- https://codepen.io/joshbader/pen/ZwpPRx
- https://24ways.org/2010/calculating-color-contrast/?fbclid=IwAR0-wW1CaLdvoVaOqfQdytxorb6DlmPPO2JpIWpW4DC_DIskScCMuf4VFpY
- https://css-tricks.com/css-variables-calc-rgb-enforcing-high-contrast-colors/?fbclid=IwAR22E5omzDxHlxesJvB2VfuqgvSVJasu6zkrJitXfEtojDRtnj2niiccsdY
- https://www.smashingmagazine.com/2022/05/accessible-design-system-themes-css-color-contrast/?fbclid=IwAR1vdwKYydcNRbRSgpFGo4sW4PGbaxCeqJdevGngc7PwY_P7MkQfCSLLz-Y
- https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-contrast#browser_compatibility