JavaScript 计算颜色的相对亮度,并确定相应的文本颜色

简介: JavaScript 计算颜色的相对亮度,并确定相应的文本颜色

JavaScript 计算颜色的相对亮度,并确定相应的颜色

一、需求内容

需求点:给出一组颜色列表,渲染对应的颜色以及颜色值,但是要保证文本颜色和背景色不冲突,文本颜色保持 blackwhite 两种即可

示例如下:每个模块背景色为当前颜色,文案内容为当前颜色值,文案颜色为当前颜色通过计算后的 'black' 或 'white'

二、实现方案

思路

  • 背景颜色与文本颜色不能冲突,亮的背景色展示黑色文案,深的背景色展示白色文案
  • 使用 YUV 与 RGB 颜色转化公式
  • 判断 a 的值,也就是透明度,透明度越小颜色越浅

实现流程

  1. 先把颜色转化成 rgba
  2. 根据计算公式 (r * 299 + g * 587 + b * 114) / 1000 将RGB颜色转换为YUV颜色
  3. 判断计算出来的值在判断 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

图片展示



目录
相关文章
|
1月前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
1月前
|
JavaScript 前端开发 大数据
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
|
1月前
|
JavaScript
|
1月前
|
缓存 JavaScript 前端开发
Vue.js计算属性:实现数据驱动的利器
Vue.js计算属性:实现数据驱动的利器
|
9天前
|
缓存 监控 JavaScript
Vue.js中的计算属性 computed 与监听属性 watch深入探索
Vue.js中的计算属性 computed 与监听属性 watch深入探索
31 0
|
1月前
|
JavaScript
JS实现一键点击按钮复制文本
【5月更文挑战第6天】JS实现一键点击按钮复制文本
|
1月前
|
机器学习/深度学习 JavaScript Python
熵、联合熵、相对熵、交叉熵、JS散度、互信息、条件熵
熵、联合熵、相对熵、交叉熵、JS散度、互信息、条件熵
14 1
|
1月前
|
JavaScript 前端开发 流计算
使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理
使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理
|
1月前
|
缓存 JavaScript C++
浅谈Vue.js的计算属性computed
浅谈Vue.js的计算属性computed
27 0
|
1月前
|
Rust JavaScript 安全
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀