使用JavaScript實(shí)現(xiàn)計(jì)算顏色的相對亮度并確定相應(yīng)的文本顏色
一、需求內(nèi)容
需求點(diǎn):給出一組顏色列表,渲染對應(yīng)的顏色以及顏色值,但是要保證文本顏色和背景色不沖突,文本顏色保持 black
和 white
兩種即可
示例如下:每個(gè)模塊背景色為當(dāng)前顏色,文案內(nèi)容為當(dāng)前顏色值,文案顏色為當(dāng)前顏色通過計(jì)算后的 'black' 或 'white'
二、實(shí)現(xiàn)方案
思路
背景顏色與文本顏色不能沖突,亮的背景色展示黑色文案,深的背景色展示白色文案
使用 YUV 與 RGB 顏色轉(zhuǎn)化公式
判斷 a 的值,也就是透明度,透明度越小顏色越淺
實(shí)現(xiàn)流程
先把顏色轉(zhuǎn)化成 rgba
根據(jù)計(jì)算公式 (r * 299 + g * 587 + b * 114) / 1000 將RGB顏色轉(zhuǎn)換為YUV顏色
判斷計(jì)算出來的值在判斷 a 的值來確定文本顏色的值
三、代碼實(shí)現(xiàn)
/** * 把十六進(jìn)制顏色值轉(zhuǎn)成 rgba 顏色值 * @param {string} hex * @returns {string} rgba 顏色值 */ const hexToRgba = (hex: string): string => { const rgba = [] hex = hex.replace('#', '').padEnd(8, 'F') for (let i = 0; i < hex.length; i+=2) { rgba.push(parseInt(hex.slice(i, i+2), 16)) } return rgba.reduce((prev, item, index) => { return prev += index >= rgba.length - 1 ? Number((item / 255).toFixed(2)) : `${item}, ` }, 'rgba(') + ')' } /** * 計(jì)算文本顏色值 * @param {string} hexColor * @returns {'black' | 'white'} 文本顏色值 */ const determineTextColor = (hexColor: string): 'black' | 'white' => { // 將十六進(jìn)制顏色值轉(zhuǎn)換為 RGB 格式 const rgbColor = hexToRgba(hexColor); // 獲取顏色的 RGB 分量 const [r, g, b, a] = (rgbColor.match(/\d+(\.\d+)?/g) || []).map(Number); // 計(jì)算顏色的相對亮度 const brightness = (r * 299 + g * 587 + b * 114) / 1000; // 根據(jù)相對亮度確定文本顏色 return brightness > 125 ? 'black' : (a < 0.4 ? 'black' : 'white') }
四、案例效果展示
案例
const colorList = [ "#FAFAFAA6", "#000000FF", "#000000EE", "#000000AA", "#00000088", "#00000066", "#00000033", "#00000022", "#00000011", "#00000000", "#333333FF", "#FFFFFFFF", "#FFFFFFEE", "#FFFFFFBB", "#FFFFFFAA", "#FFFFFF99", "#FFFFFF88", "#FFFFFF66", "#FFFFFF33", "#FFFFFF22", "#FFFFFF11", "#344258FF", "#4CAF50DE", "#364FBBFF", "#00000040", "#FF4D4FFF", "#233494FF", "#0505050F", "#00000005", "#E7E8EAFF", "#F5F7FAFF", "#7A7A7AFF", "#1677FFFF", "#69B1FFFF", "#0958D9FF", "#00000014", "#0000001E", "#0000000C", "#52C41AFF", "#FAAD14FF", "#00000073", "#0000000F", "#001529FF", "#002140FF", "#FFFFFF33", "#722ED1FF", "#13C2C2FF", "#EB2F96FF", "#F5222DFF", "#FA8C16FF", "#FADB14FF", "#FA541CFF", "#2F54EBFF", "#A0D911FF", "#000000D9", "#ADBBE0FF", "#5A71C7FF", "#FFF2F0FF", "#FFFFFFA6", "#FFFFFF00", "#FFFFFF40", "#FF7875FF", "#000C17FF", "#0543C014", "#0000000A", "#FFA39EFF", "#FF26050F", "#FFD666FF", "#FFD70519", "#D9363EFF", "#00000026", "#DDE2EDFF", "#F5F5F5FF", "#F0F0F0FF", "#D9D9D9FF", "#000FFFFF", "#000000A6", "#EBF0FAFF", "#8196D4FF", "#F6FFEDFF", "#D9F7BEFF", "#B7EB8FFF", "#95DE64FF", "#389E0DFF", "#73D13DFF", "#FFF1F0FF", "#FFCCC7FF", "#FFFBE6FF", "#FFF1B8FF", "#FFE58FFF", "#D48806FF", "#FFC53DFF", "#E6F4FFFF", "#BAE0FFFF", "#91CAFFFF", "#4096FFFF", "#FAFAFAFF", "#EDEDEDFF", "#E0E0E0FF", "#D4D4D4FF", "#C7C7C7FF", "#A1A1A1FF", "#545454FF", "#2E2E2EFF" ] let html = '<ul>' colorList.forEach((item) => { const data = determineTextColor(item) html += `<li style="background: ${item}; color: ${data}; border: 1px solid ${data};">${item}</li>` }) html += '</ul>' document.body.innerHTML = html
圖片展示
到此這篇關(guān)于使用JavaScript實(shí)現(xiàn)計(jì)算顏色的相對亮度并確定相應(yīng)的文本顏色的文章就介紹到這了,更多相關(guān)JavaScript計(jì)算顏色相對亮度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Echarts通過dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了Echarts如何通過dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02BootStrap 超鏈接變按鈕的實(shí)現(xiàn)方法
這篇文章主要介紹了BootStrap 超鏈接變按鈕的實(shí)現(xiàn)方法以及js按鈕bootstrap超鏈接的操作方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法
這篇文章主要介紹了微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法,涉及微信小程序界面布局、事件響應(yīng)及緩存操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12js 有框架頁面跳轉(zhuǎn)(target)三種情況下的應(yīng)用
本文主要介紹下有框架頁面的跳轉(zhuǎn):跳出框架,在父頁面;從一個(gè)框架跳轉(zhuǎn)到 name=main的框架里;ContentList 當(dāng)前頁的iframe名字,感興趣的朋友可以了解下哈2013-04-04arcgis for js實(shí)現(xiàn)地圖截圖、地圖打印功能
這篇文章主要介紹了arcgis for js實(shí)現(xiàn)地圖截圖、地圖打印功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-12-12全面接觸神奇的Bootstrap導(dǎo)航條實(shí)戰(zhàn)篇
導(dǎo)航條(navbar)在Bootstrap中是一個(gè)獨(dú)立組件,導(dǎo)航條(navbar)和導(dǎo)航(nav)在Bootstrap中是有明顯區(qū)別的,本文全面接觸神奇的Bootstrap導(dǎo)航條,感興趣的小伙伴們可以參考一下2016-08-08