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

news2024/11/18 1:26:46

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

图片展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

误差的一阶和二阶——MSE/MAE

variance和bias MSE之前&#xff0c;先看两个更为朴素的指标&#xff1a;variance和bias。 在打靶中&#xff0c;有的人所有的子弹都离靶心很远&#xff0c;偏差显然过高&#xff0c;但是很稳定地维持在某一点附近&#xff1b;有的人平均环数更高&#xff0c;但是分布太过分散…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(六)

目录 1. 静电测试干扰方式 2. 案例一 3. 案例二 4. 案例三 5. 案例四 6. 总结 静电放电测试的复杂性决定了这项测试对产品的主要影响方式也是多样的。标准里介绍了几种常见的影响方式&#xff1a; 1. 静电测试干扰方式 在静电放电试验中&#xff0c;测试了受试设备对于…

自然语言处理 (NLP) 的技术演变史

一、简述 本文的目标是了解自然语言处理 (NLP) 的历史&#xff0c;包括 Transformer 体系结构如何彻底改变该领域并帮助我们创建大型语言模型 (LLM)。 基础模型&#xff08;如 GPT-4&#xff09;是最先进的自然语言处理模型&#xff0c;旨在理解、生成人类语言并与之交互。 要理…

倍思、南卡、Cleer开放式耳机怎么样?三大网红真实数据测评PK

​作为一名在数码产品评测领域耕耘五载的专业人士&#xff0c;我有幸涉足各类蓝牙耳机的深度测评&#xff0c;涉猎范围广泛&#xff0c;从崭露头角的新锐品牌直至业界巨擘的旗舰之作&#xff0c;无一不在我的评测之列。鉴于近期对开放式耳机类咨询热度不减&#xff0c;我决定开…

Kafka 可视化管理工具 CMAK 启动错误 -- 命令行太长 问题解决

一、安装环境描述&#xff1a; Kafka版本&#xff1a;kafka_2.13-2.8.1cmak 版本&#xff1a;cmak-3.0.0.6安装环境&#xff1a;windows 11 二、问题描述 当我们在 命令行启动 cmak.bat 命令时&#xff0c;会报如下错误&#xff1a; 命令行太长三、解决办法 修改 cmak.bat…

C#设计树形程序界面的方法:创建特殊窗体

目录 1.TreeView控件 2.实例 &#xff08;1&#xff09;Resources.Designer.cs &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs &#xff08;4&#xff09;生成效果 以树形来显示程序的菜单&#xff0c;可以更直观、更快捷地对窗体进行…

Python 面向对象——5.多态

本章学习链接如下&#xff1a; Python 面向对象——1.基本概念 Python 面向对象——2.类与对象实例属性补充解释&#xff0c;self的作用等 Python 面向对象——3.实例方法&#xff0c;类方法与静态方法 Python 面向对象——4.继承 1.基本概念 多态是面向对象编程&#x…

【智慧园区、低碳园区】工业园区综合能源管理系统解决方案

安科瑞薛瑶瑶18701709087 ◆行业特点 产业园区是国民经济发展的重要载体, 同时也是重点用能企业聚集地。园区面积大&#xff0c;供电距离远&#xff0c;建筑多且分散&#xff0c;用电负荷种类多&#xff0c;用电负荷不均匀&#xff0c;园区配电结构应整体规划&#xff0c;统一…

Xshell7免费版下载及安装(详细教程)

Xshell7免费版下载及安装&#xff08;详细教程&#xff09; 一、下载及安装 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径 点击下载按钮 开始下载 3.下载完成后 我们双击打开.exe文件 点击下一步 4.点击我同意 点击下一步 5.选择合…

第九讲 - Java面向对象

第九讲 - Java面向对象 文章目录 第九讲 - Java面向对象1. 类和对象1.1 类和对象的理解1.2 类的定义1.3 对象的使用1.4 学生对象-练习 2. 对象内存图2.1 单个对象内存图2.2 多个对象内存图 3. 成员变量和局部变量3.1 成员变量和局部变量的区别 4. 封装4.1 封装思想4.2 private关…

IIS中搭建.Net Core项目,步骤详解

一、准备服务器 1&#xff09;安装IIS 这个比较简单&#xff0c;百度一下就行 2&#xff09;安装 .NET Core 运行时 下载地址&#xff1a;下载 .NET(Linux、macOS 和 Windows) 因为我是本地开发&#xff0c;所以我下载的是SDK 安装成功之后显示如下&#xff1a; 检查是否安装…

浏览器兼容模式怎么设置?4个提升网页兼容性秘笈分享!

“不知道怎么回事&#xff0c;我打开浏览器的时候总是显示浏览器不兼容&#xff0c;是什么情况呢&#xff1f;我应该怎么操作才能解决这个问题呀&#xff1f;” 浏览器兼容模式是一种使浏览器能够更好地显示网页内容、提高网页加载速度并减少错误的功能。 不同浏览器设置兼容模…

探索HSE化工安全系统在化工生产中的作用

在现代工业化生产中&#xff0c;化工企业扮演着至关重要的角色&#xff0c;但与此同时&#xff0c;化工安全问题也备受关注。为了保障生产环境的安全&#xff0c;HSE化工安全系统应运而生。本文将详细介绍HSE化工安全系统的功能和优势&#xff0c;让您深入了解其在工业生产中的…

ISPLSI1032E-100LT 封装TQFP100 LATTICE/莱迪斯 IC芯片

ISPLSI1032E-100LT 规格信息&#xff1a; 封装:TQFP 逻辑门数量:6000 含铅标准:Lead free RoHS标准:Compliant 产品生命周期:Not Recommended ISPLSI1032E-100LT 是 Lattice Semiconductor 公司生产的一款 Complex Programmable Logic Device (CPLD)&#xff0c;中文称为复…

AIGC技术:行业应用案例与未来可能性深度解析

随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术正日益成为引领内容创作与智能应用的新引擎。在当下&#xff0c;AIGC技术已经取得了一系列令人瞩目的成果&#xff0c;而在未来&#xff0c;它更将展现出无限的可能性&#xff0c;为人…

FebHost:.DE域名能否用于多个市场的国际网站?

.DE德国域名可用于面向多个市场的国际网站&#xff0c;但重要的是要考虑有效的国际搜索引擎优化的影响和策略。下面介绍在这种情况下如何利用 .DE 域名&#xff1a; 本地信任和信誉&#xff1a; .DE 域名可以向用户和搜索引擎表明&#xff0c;您的网站是为德国市场量身定制的。…

面对亚马逊FBA仓附加费上涨,卖家如何破局前行?

跨境电商的发展势头强劲&#xff0c;不仅为消费者带来了更多元化的购物选择&#xff0c;也为卖家提供了更广阔的市场空间&#xff0c;跨境物流作为连接生产与消费的重要桥梁&#xff0c;其成本对于卖家而言&#xff0c;已成为影响竞争力的关键因素之一。然而&#xff0c;从五月…

嵌入式4-23 C++

值不能改变 语法错误 指向地址不能改变 值和地址都不能改变 值不能改变 地址不能改变 都不能改变

【漏洞复现】卡车卫星定位系统 /user/create接口处存在未授权密码重置漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Golang | Leetcode Golang题解之第46题全排列

题目&#xff1a; 题解&#xff1a; func permute(nums []int) [][]int {var (n len(nums)dfs func(vals []int) // 已选择数 排列为vals 后续回溯继续选择 直至选完ans [][]int)dfs func(vals []int) {//边界if len(vals) n {ans append(ans, vals)}//转移 枚举选哪个f…