【问题标题】:calculate, difference, between, color hexadecimal计算, 差异, 之间, 颜色十六进制
【发布时间】:2014-03-16 07:52:18
【问题描述】:

我会知道是否有人知道如何计算颜色十六进制之间的差异?

对于较少的文件,我有这个:

@s1-color-main: #2DAEBF;

@s1-color-ts1: #0092b3;
@s1-color-ts2: #0087a6;
@s1-color-ts3: #008099;
@s1-color-ts4: #00758c;
@s1-color-ts5: #555;
@s1-color-ts6: #006073;
@s1-color-ts7: #005566;

对于一般情况,我会有这样的事情:

@s1-color-main: #2DAEBF;

@s1-color-ts1: @s1-color-main + #111;
@s1-color-ts2: @s1-color-main + #222;
@s1-color-ts3: @s1-color-main + #333;
@s1-color-ts4: @s1-color-main + #444;
@s1-color-ts5: #555;
@s1-color-ts6: @s1-color-main + #666;
@s1-color-ts7: @s1-color-main + #777;

我在网上搜索但我找不到任何东西:(

但我不知道如何计算主要颜色之间的每个差异。

感谢您的帮助;)

【问题讨论】:

    标签: variables colors hex less


    【解决方案1】:

    LESS 在color operations 中非常强大,在您的情况下,我特别建议您查看difference()、exclusion()、negation() 或average() 等混合功能。其中一些可能已经为您提供了所需的效果。

    但您也可以在 LESS 中执行十六进制颜色的加法和减法。

    要获得十六进制颜色的差异,您只需减去两种颜色即可:

    color-diff: (#333 - #222);
    

    这将以十六进制返回每个通道的差异:

    color-diff: #111111;
    

    所以要获得比@x“更高”的#111 的颜色,您只需要这样做

    new-color: (@x + #111);
    

    但正如您可以想象的那样,使用十六进制颜色的东西并没有那么简单。让我们看看你的第一个例子:

    // @s1-color-main - @s1-color-ts1
    diff: (#2DAEBF - #0092b3);
    

    返回

    diff: #2d1c0c;
    

    所以(因为您的基色/主色是具有较高值的​​颜色)我们可以通过从主色中减去返回的 diff 来计算 @s1-color-ts1

    (@s1-color-main - #2d1c0c)
    

    但是正如你所看到的,现在的问题是我们需要知道哪种颜色具有更高的值才能选择正确的操作......这可能会有点混乱。

    幸运的是,LESS 非常聪明......对于保存在 变量中的计算颜色,LESS 会记住实际的颜色值差异(包括符号,即它们是负数还是正数)。
    举个很简单的例子

    @diff1: (#222 - #333);
    @diff2: (#eee + #eee);
    

    如果我们返回差异的计算值

    color1: @diff1;
    color2: @diff2;
    

    我们得到

    color1: #000000;
    color2: #ffffff;
    

    返回时(在 CSS 中),所有负值在0 处被截断,大于FF 的值在FF 处被截断。但是,如果我们在进一步的操作中使用这些变量,我们会发现 @diff1 实际上拥有类似于 -17 -17 -17 的 RGB(每个 RGB 颜色分量的负值),而@diff2 拥有 @ 的 RGB 等价物987654349@,如果我们做类似的事情就会很明显

    color3: (#888888 + @diff1);
    color4: (@diff2 / 2);
    

    得到

    color3: #777777;
    color4: #eeeeee;
    

    那么,您如何利用它来发挥自己的优势呢?现在你可以做类似的事情

    @s1-color-diff1: (#0092b3 - #2DAEBF); // which saves negative color values
    

    并使用此变量计算@s1-color-ts1,将其添加到主颜色中

    @s1-color-ts1: @s1-color-main + @s1-color-diff1;
    

    你也可以保存整个差异列表,像这样

    @diffs: (#0092b3 - #2DAEBF),
            (#0087a6 - #2DAEBF),
            (#008099 - #2DAEBF),
            (#00758c - #2DAEBF),
            (#555555 - #2DAEBF),
            (#006073 - #2DAEBF),
            (#005566 - #2DAEBF);
    

    并在需要时访问它们

    @s1-color-ts2: @s1-color-main + extract(@diffs,2);
    

    这样 LESS 会处理计算中的所有 RGB 值,而您只需要处理十六进制代码。但是 LESS 通过使用颜色分量函数(例如 RGB 函数 red()、green()、blue() 和 rgb())为您提供了更好的颜色控制。这使您可以精确调整每个 RGB 颜色分量/通道。因此,要弄清楚颜色的实际 RGB 差异是什么,您可以执行类似的操作(通过提取 RGB 组件/通道,将它们与主颜色进行比较并整齐地显示它们)

    .rgb-diff(@v,@m){
      @t: @@v;
      @rm: red(@m); @gm: green(@m); @bm: blue(@m);
      @r: (red(@t) - @rm);
      @g: (green(@t) - @gm);
      @b: (blue(@t) - @bm);
      @{v}: @r @g @b;
    }
    
    rgb-diff {
      .rgb-diff(s1-color-ts1, @s1-color-main);
      .rgb-diff(s1-color-ts2, @s1-color-main);
      .rgb-diff(s1-color-ts3, @s1-color-main);
      .rgb-diff(s1-color-ts4, @s1-color-main);
      .rgb-diff(s1-color-ts5, @s1-color-main);
      .rgb-diff(s1-color-ts6, @s1-color-main);
      .rgb-diff(s1-color-ts7, @s1-color-main);
    }
    

    应该返回这个

    rgb-diff {
      s1-color-ts1: -45 -28 -12;
      s1-color-ts2: -45 -39 -25;
      s1-color-ts3: -45 -46 -38;
      s1-color-ts4: -45 -57 -51;
      s1-color-ts5: 40 -89 -106;
      s1-color-ts6: -45 -78 -76;
      s1-color-ts7: -45 -89 -89;
    }
    

    现在你可以使用这样的东西了

    rgb((@r-main + @r), (@g-main + @g), (@b-main + @b));
    

    通过将它们的 RGB 差异添加到主/基色的 RGB 值来重构各个颜色。
    测试:

    .from-rgb(@r,@g,@b,@v,@m){
      @rm: red(@m); @gm: green(@m); @bm: blue(@m);
      @{v}: rgb((@rm + @r), (@gm + @g), (@bm + @b));
    }
    
    from-rgb {
      .from-rgb(-45, -28, -12, s1-color-ts1, @s1-color-main);
      .from-rgb(-45, -39, -25, s1-color-ts2, @s1-color-main);
      .from-rgb(-45, -46, -38, s1-color-ts3, @s1-color-main);
      .from-rgb(-45, -57, -51, s1-color-ts4, @s1-color-main);
      .from-rgb(40, -89, -106, s1-color-ts5, @s1-color-main);
      .from-rgb(-45, -78, -76, s1-color-ts6, @s1-color-main);
      .from-rgb(-45, -89, -89, s1-color-ts7, @s1-color-main);
    }
    

    应该返回您上面的一组十六进制颜色,您现在可以通过简单地调整基础颜色变量@s1-color-main来调整所有这些颜色。

    【讨论】:

    • "thanks" 感谢您的回答,另一方面我忘记了一些事情:我唯一的目标(目标)是:通知主颜色,因为所有颜色的变格都会被自动计算。主要颜色应该是其他几种颜色,例如: - #E33100 - #A9014B - #E65A0B 根据您的回答,有时颜色会相加,有时会相减,但在 rgb 函数中,这部分已解决;)
    【解决方案2】:

    检查此this 链接将显示如何确定两种十六进制颜色之间的差异。希望这对你有帮助。

    【讨论】:

      【解决方案3】:

      即使您解决了问题的数学部分,这也不会帮助您获得相似但不同的颜色。眼睛感知蓝色部分的差异远小于红色部分的差异。因此,除非您想深入了解色彩空间和视觉模型,否则最好从颜色选择器中选择颜色,而不是尝试计算它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        相关资源
        最近更新 更多