一、需求内容
需求点:给出一组颜色列表,渲染对应的颜色以及颜色值,但是要保证文本颜色和背景色不冲突,文本颜色保持 black 和 white 两种即可
示例如下:每个模块背景色为当前颜色,文案内容为当前颜色值,文案颜色为当前颜色通过计算后的 'black' 或 'white'

二、实现方案
思路
背景颜色与文本颜色不能冲突,亮的背景色展示黑色文案,深的背景色展示白色文案
使用 yuv 与 rgb 颜色转化公式
判断 a 的值,也就是透明度,透明度越小颜色越浅
实现流程
先把颜色转化成 rgba
根据计算公式 (r * 299 + g * 587 + b * 114) / 1000 将rgb颜色转换为yuv颜色
判断计算出来的值在判断 a 的值来确定文本颜色的值
三、代码实现
/**
* 把十六进制颜色值转成 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(') + ')'
}
/**
* 计算文本颜色值
* @param {string} hexcolor
* @returns {'black' | 'white'} 文本颜色值
*/
const determinetextcolor = (hexcolor: string): 'black' | 'white' => {
// 将十六进制颜色值转换为 rgb 格式
const rgbcolor = hextorgba(hexcolor);
// 获取颜色的 rgb 分量
const [r, g, b, a] = (rgbcolor.match(/\d+(\.\d+)?/g) || []).map(number);
// 计算颜色的相对亮度
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
// 根据相对亮度确定文本颜色
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
图片展示

到此这篇关于使用javascript实现计算颜色的相对亮度并确定相应的文本颜色的文章就介绍到这了,更多相关javascript计算颜色相对亮度内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论