【问题标题】:Obtain 50% of a color hex value without using transparency在不使用透明度的情况下获得 50% 的颜色十六进制值
【发布时间】:2020-08-14 07:27:11
【问题描述】:

我需要获取现有颜色十六进制的浅 50% 版本的颜色值。但是它必须是 100% 不透明的,我不能使用 opacityrgbahexahsla

场景:

我在地图上绘制路线,每条路线都有不同的颜色,基于 48 个可能的十六进制值的硬编码数组。

当编辑这些路线之一时,它应该显示为“已禁用”(原始颜色的 50%)。

在屏幕设计中,路径颜色(数组中的一种颜色)的参考值为#9775fa禁用颜色的参考值为#d5c7fd。第二种颜色是设计师在基础颜色之上绘制了一个不透明度为 50% 的白色图层。

我尝试通过 JS 获得相同的值,首先使用变亮函数,然后使用 HSL 函数,最后手动变亮基色的每个 RGB 值。它们都没有真正起作用。

使用 lighten,加上 62 的光,我得到了一个接近的值,但不是确切的值。 使用 HSL 和手动点亮 50% 也不起作用。

这些是我得到的值:

 Base color: #9775fa
 "Disabled color": #d5c7fd
 Lighten by 62: #d5b3ff
 HSL 50%: #e3b0ff
 Ligheting 50% by hand: #e3b0ff

那么,到最后,真正的问题是,有可能实现吗?

Here is a "playground" and the full code of my experiments(第二列是参考“禁用”颜色。

非常感谢!

【问题讨论】:

  • 您可以使用 SASS 或 LESS 来渲染颜色百分比,例如 background: lighten(#ff0000, 50%);
  • @NathanielFlick 不幸的是我不能依赖 CSS,我需要这个值来在前端渲染各种东西,路由本身(svg),停止标记,弹出标题,卡片装饰,on以此类推。

标签: javascript css colors rgb hsl


【解决方案1】:

我设法通过按照您给定的百分比将颜色与白色混合来获得更准确的结果。

我将 lightenByPercentage 更改如下:

let p = percentage / 100;
var r = "0x" + hex[0] + hex[1];
var g = "0x" + hex[2] + hex[3];
var b = "0x" + hex[4] + hex[5];
r = Math.ceil(256 * (1-p) + (r * p));
g = Math.ceil(256 * (1-p) + (g * p));
b = Math.ceil(256 * (1-p) + (b * p));

r = r <= 255 ? r : 255;
g = g <= 255 ? g : 255;
b = b <= 255 ? b : 255;

我不确定你的百分比应该是多亮还是多暗,所以如果我弄错了,在这里用 1-p 交换 p。

【讨论】:

  • 我了解到您在 X% 的原始颜色之上添加了 X% 的白色,而我只计算了 X% 的原始颜色。我不明白为什么它会起作用,但无论如何,它都能正常工作!非常感谢!
  • 唯一的“事情”是我的控制颜色生成的 RGB 中的舍入情况。我期待的是 203、187、254,结果是 204、187、253,翻译为 #CCBBFD 而不是 #CBBBFE。我尝试用 Math.round 或 Math.floor 替换 Math.ceil 并得到了类似的结果。但它太小了,甚至都不算数。再次感谢!
  • @RenatoRodrigues 我只是想到了颜色在白色背景下透明意味着什么。这意味着它部分显示该颜色,部分显示白色背景。所以一些比例 p 是白色背景,一些比例 1-p 是颜色。
猜你喜欢
  • 2013-03-28
  • 2014-09-22
  • 2021-10-06
  • 2020-08-12
  • 2020-12-25
  • 2020-12-25
  • 1970-01-01
  • 2017-12-02
  • 2014-05-29
相关资源
最近更新 更多