问题描述
我已经为此工作了几天,但我很难在心理上想象我真正想做的事情,所以我会从头开始。
我基本上是在尝试创建一种算法,该算法将在悬停时调整按钮的背景颜色 - 如果背景颜色一开始很亮,我想让它变暗,如果按钮一开始很暗,我想要使其更轻。
我正在使用 Color NPM package,这会让事情变得更容易。
我的目标是只使用 lighten
方法,因为我可以向该方法传递一个负数以使颜色变暗。这也让我可以避免使用像这样的 if 条件:
if (Color(prev).isLight()) {
const value = Math.pow(0.03,Color(prev).luminosity() - 0.1);
const scale = Math.min(0.15,value);
return Color(prev).darken(scale).hex();
} else {
const value = Math.pow(20000,0.02 - Color(prev).luminosity());
const scale = Math.min(2.5,value);
return Color(prev).lighten(scale).hex();
}
使用反复试验和 if
条件,我能够得到一些“有效”的东西,如上所示,但它并不优雅,也不清楚发生了什么,它只是一个一堆随机的废话,碰巧达到了我想要的东西。
以一些基本样本作为控制测量开始,我可以看到要调整颜色“白色”(亮度值为 1),我可以应用 lighten(-0.15)
来改变颜色一个很好的显着量.同样,在颜色“黑色”(亮度值为 0)上,我可以应用 lighten(2.5)
将颜色更改为一个很好的明显差异。
所以如果我只使用输入颜色的亮度值,我可以根据这个比例找到一些方法来修改它,但事实证明,为了获得最好的结果,我还需要考虑考虑颜色的饱和度。两种颜色可以具有相同的亮度值,但如果对它们应用相同量的 lighten
,如果饱和度不同,则一种颜色在视觉上会比另一种颜色更亮。
所以我需要想出一个算法来考虑颜色的两个维度(亮度和饱和度)并返回一个介于 -0.15
和 2.5
(粗略估计)之间的数字,我然后可以应用到 lighten
方法来适当调整颜色(刻度应该是对数而不是线性 - 亮度为 0 的颜色可能需要增加 2.5 的亮度,但亮度为 0.2 的颜色似乎只需要将亮度增加 0.2 左右)。
我的数学和算法很差,希望有人能帮助我!使用 Color NPM 包,我有一些有用的测量:
const saturation = Color(prev).hsl().color[1];
const luminosity = Color(prev).luminosity();
const contrast = Color(prev).contrast(Color('white'));
我认为饱和度和亮度结合起来就足够了,但 contrast
测量也可能有帮助。
提前致谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)