我们在网站上有一个很大的应用程序,我们有一些链接,比如说蓝色的就像这个网站上的蓝色链接。现在我想做一些其他的链接,但是用浅一点的颜色。显然,我可以简单地通过在CSS文件中添加十六进制代码来做,但我们的网站让用户决定他们想要的自定义配置文件/网站(如Twitter)的颜色。

所以,我的问题是:我们能减少百分比的颜色吗?

让我们说下面的代码是CSS:

a {
  color: blue;
}

a.lighter {
  color: -50%; // obviously not correct way, but just an idea
}

OR

a.lighter {
  color: blue -50%;  // again not correct, but another example of setting color and then reducing it
}

有没有办法将颜色减少一个百分比?


当前回答

在写这篇文章的时候,这里是我发现的最好的纯CSS颜色操作实现:

使用CSS变量以HSL而不是HEX/RGB格式定义颜色,然后使用calc()来操作它们。

这里有一个基本的例子:

:root { --link-color-h: 211; --link-color-s: 100%; --link-color-l: 50%; --link-color-hsl: var(--link-color-h), var(--link-color-s), var(--link-color-l); --link-color: hsl(var(--link-color-hsl)); --link-color-10: hsla(var(--link-color-hsl), .1); --link-color-20: hsla(var(--link-color-hsl), .2); --link-color-30: hsla(var(--link-color-hsl), .3); --link-color-40: hsla(var(--link-color-hsl), .4); --link-color-50: hsla(var(--link-color-hsl), .5); --link-color-60: hsla(var(--link-color-hsl), .6); --link-color-70: hsla(var(--link-color-hsl), .7); --link-color-80: hsla(var(--link-color-hsl), .8); --link-color-90: hsla(var(--link-color-hsl), .9); --link-color-warm: hsl(calc(var(--link-color-h) + 80), var(--link-color-s), var(--link-color-l)); --link-color-cold: hsl(calc(var(--link-color-h) - 80), var(--link-color-s), var(--link-color-l)); --link-color-low: hsl(var(--link-color-h), calc(var(--link-color-s) / 2), var(--link-color-l)); --link-color-lowest: hsl(var(--link-color-h), calc(var(--link-color-s) / 4), var(--link-color-l)); --link-color-light: hsl(var(--link-color-h), var(--link-color-s), calc(var(--link-color-l) / .9)); --link-color-dark: hsl(var(--link-color-h), var(--link-color-s), calc(var(--link-color-l) * .9)); } .flex { display: flex; } .flex > div { flex: 1; height: calc(100vw / 10); } <h3>Color Manipulation (alpha)</h3> <div class="flex"> <div style="background-color: var(--link-color-10)"></div> <div style="background-color: var(--link-color-20)"></div> <div style="background-color: var(--link-color-30)"></div> <div style="background-color: var(--link-color-40)"></div> <div style="background-color: var(--link-color-50)"></div> <div style="background-color: var(--link-color-60)"></div> <div style="background-color: var(--link-color-70)"></div> <div style="background-color: var(--link-color-80)"></div> <div style="background-color: var(--link-color-90)"></div> <div style="background-color: var(--link-color)"></div> </div> <h3>Color Manipulation (Hue)</h3> <div class="flex"> <div style="background-color: var(--link-color-warm)"></div> <div style="background-color: var(--link-color)"></div> <div style="background-color: var(--link-color-cold)"></div> </div> <h3>Color Manipulation (Saturation)</h3> <div class="flex"> <div style="background-color: var(--link-color)"></div> <div style="background-color: var(--link-color-low)"></div> <div style="background-color: var(--link-color-lowest)"></div> </div> <h3>Color Manipulation (Lightness)</h3> <div class="flex"> <div style="background-color: var(--link-color-light)"></div> <div style="background-color: var(--link-color)"></div> <div style="background-color: var(--link-color-dark)"></div> </div>

我还创建了一个CSS框架(仍处于早期阶段)来提供基本的CSS变量支持,称为根变量。

其他回答

这是一个老问题,但大多数答案都需要使用预处理器或JavaScript来操作,否则它们不仅会影响元素的颜色,还会影响其中包含的元素的颜色。我将添加一种复杂的css方式来做同样的事情。也许在未来,随着更高级的CSS功能,这将更容易做到。

这个想法是基于使用:

RGB颜色,所以你有单独的值红,绿,蓝; CSS变量,用来存储颜色值和暗度;而且 calc函数,以应用更改。

默认情况下,暗度为1(对于100%,常规颜色),如果您乘以0到1之间的数字,您将使颜色变深。例如,如果您将每个值乘以0.85,您将使颜色暗15%(100% - 15% = 85% = 0.85)。

下面是一个例子,我创建了三个类:.dark, .dark和.darkest,这将使原始颜色分别暗25%,50%和75%:

html { --clarity: 1; } div { display: inline-block; height: 100px; width: 100px; line-height: 100px; color: white; text-align: center; font-family: arial, sans-serif; font-size: 20px; background: rgba( calc(var(--r) * var(--clarity)), calc(var(--g) * var(--clarity)), calc(var(--b) * var(--clarity)) ); } .dark { --clarity: 0.75; } .darker { --clarity: 0.50; } .darkest { --clarity: 0.25; } .red { --r: 255; --g: 0; --b: 0; } .purple { --r: 205; --g: 30; --b: 205; } <div class="red">0%</div> <div class="red dark">25%</div> <div class="red darker">50%</div> <div class="red darkest">75%</div> <br/><br/> <div class="purple">0%</div> <div class="purple dark">25%</div> <div class="purple darker">50%</div> <div class="purple darkest">75%</div>

我找到了一个PHP类,它可以让我在服务器端执行此操作。我只是输出一个内联CSS颜色样式,无论我需要更亮/更暗。伟大的工作。

http://www.barelyfitz.com/projects/csscolor/

(注意,这个类使用PEAR来抛出错误,但我不想只包括PEAR来修改颜色,所以我只是删除了所有的PEAR引用)

我把它变成了一个带有静态方法的静态类,这样我就可以直接调用“变亮”和“变暗”函数,而不需要创建一个新对象。

示例用法:

$original_color = 'E58D8D';  
$lighter_color = Css::lighten($original_color, .7);  
$darker_color = Css::darken($original_color, .7);

一个过时的简单答案(在2013年)是在颜色上使用50%透明的白色PNG:

div {
    background-color:red;
}

div:hover {
    background-image:url('lighten.png');
}

其中light . PNG是一个白色填充的PNG,透明度为50%。

现在有更好的方法。我希望人们现在停止评论。

在LESS中,你可以使用以下变量:

@primary-color: #999;
@primary-color-lighter: lighten(@primary-color, 20%);

这将使第一个变量减轻20%(或任何其他百分比)。在这个例子中,你最终会得到较浅的颜色:#ccc

HSL Colors提供了答案, HSL颜色值指定为:HSL (hue[0,255],饱和度%,明度%)。

HSL支持IE9+、Firefox、Chrome、Safari和Opera 10+

a
{
color:hsl(240,65%,50%);
}
a.lighter 
{
color:hsl(240,65%,75%);
}