ChatGPT解决这个技术问题 Extra ChatGPT

按百分比 CSS 动态将颜色更改为更亮或更暗

css

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

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

假设以下代码是 CSS:

a {
  color: blue;
}

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

或者

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

有没有办法按百分比减少颜色?

我不喜欢 CSS,但减少颜色是什么意思?让它更透明?或者您想更改颜色的各个 RGB 通道?
不,不是透明的,而是使颜色减少 hex 或 rbg 或 hsl
如果您不愿意,您可以手动选择颜色,例如使用此在线工具:hexcolortool.com

i
imjared

您可以在所有现代浏览器中使用 CSS filters 执行此操作(请参阅 caniuse compatibility table)。

.button { 颜色:#ff0000; } /* 注意:100% 是基线,所以 85% 稍微暗一点,20% 会明显更暗 */ .button:hover { filter: brightness(85%); }

下面是 CSS Tricks 中关于您可以使用的各种过滤器的更多信息:https://css-tricks.com/almanac/properties/f/filter/


另请注意,brightness() 级别不限于 100%。你也可以让它比原来的更亮。
过滤器还将应用于与您的元素关联的任何背景图像。假设您以这种方式用图标装饰链接,则该过滤器将更改图标亮度。
根据... caniuse.com/#feat=css-filters ... IE11 不支持此功能... 根据... w3counter.com/globalstats.php?year=2017&month=8 ... IE11 仍然是最常用的 10 种浏览器。虽然我很想使用这个功能,但在 IE11 死之前,它看起来不像我会的。 :-(
我可以将其仅应用于 background-color 吗?我看到它对整体不利。 jsfiddle.net/6trjmaq3/1
这是使用具有无限数量的步骤/级别的递归(例如嵌套的 DIV)时的最佳答案,但它会影响整个元素,而不仅仅是背景颜色或文本颜色。
T
TylerH

所有现代浏览器都有 100% 的 filter 支持 since January 2020。甚至 适用于 Android 的 UC 浏览器(而不是 Chrome,在 80 美元的手机上)也支持它。

a {
    /* a nice, modern blue for links */
    color: #118bee;
}
a:active {
    /* Darken on click by 15% (down to 85%) */
    filter: brightness(0.85);
}

此外,您可以使用 CSS 变量动态控制这一点,大多数浏览器都支持 since October 2017(QQ 除外):

:root {
    --color: #118bee;
    --hover-brightness: 1.2;
}
a {
    color: var(--color);
}
a:active {
    /* Darken on click */
    filter: brightness(var(--hover-brightness));
}

不是我的项目,而是一个非常适合查看现代 CSS 有多棒的真实示例的项目,请查看:MVP.css

原始答案

如果您使用的堆栈允许您使用 SassLess,则可以使用 lighten 函数:

$linkcolour: #0000FF;

a {
  color: $linkcolour;
}

a.lighter {
  color: lighten($linkcolour, 50%);
}

还有 darken 做同样的事情,但方向相反。


在内联中动态设置背景颜色时怎么办?但我只想在悬停时让它变暗?
这个不错的 NPM 模块允许 JavaScript 中的十六进制颜色变暗/变亮 - https://www.npmjs.com/package/shader
如果您想仅使用 CSS3 和 SVG 数据为任何具有悬停效果的按钮动态应用较浅或较深的阴影,请尝试我的回答 stackoverflow.com/a/55828346/6730421
这是否可以通过在运行时传递自定义 css 属性来即时工作?
这可以与颜色名称一起使用吗? orange 例如。
P
Pekka

有“不透明度”可以使背景发光:

opacity: 0.5;

但我不确定这就是你的意思。定义“减少颜色”:使透明?还是加白?


@Basit“我猜”?你应该知道。但无论如何,如果您的背景是白色的,您可以通过使其更透明来“伪造”亮度 - 我最近使用它效果很好。
如果背景是黑色的,“不透明度”技巧也可以工作(不透明度 0.5 使黑色背景上的颜色更暗)。
如果就“更轻”或“更亮”的含义和 Google 搜索而言,这 用于 css background: 而不是 foreground:,这可能是大多数人正在寻找的答案。此外,无需担心支持:caniuse.com/#feat=css-opacity
S
Spliff

HSL 颜色提供了一个答案,HSL 颜色值指定为:hsl(hue [0,255],saturation %,lightness %)。

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

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

s
sparanoid

在撰写本文时,这是我发现的用于颜色处理的最佳纯 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 { 显示:弹性; } .flex > div { flex: 1;高度:计算(100vw / 10); }

颜色处理(alpha)

颜色处理(色调)

颜色处理(饱和度)

div>

颜色处理(亮度)

< /div>

我还创建了一个 CSS 框架(仍处于早期阶段)以提供名为 root-variables 的基本 CSS 变量支持。


是否有可能让它与 css 颜色名称一起使用:(即:orange
A
AmerllicA

使用 filter 纯 CSS 属性。有关 filter 属性函数的完整描述,请阅读 this awesome article

我遇到了和你一样的问题,我使用 filter 属性的 brightness 函数修复了它:

.my-class {
  background-color: #18d176;
  filter: brightness(90%);
}

看上面。 IE11 不喜欢这样。
2021 年 8 月 17 日,IE 报废🥳✌️🎉
@amarinediary IE 本身的 EoL 是 2022 年 6 月 15 日。2021 年 8 月 17 日是 IE 中 M365 服务支持的结束……另一件事。
他们在四月份对我们撒了谎!它只是不会消失!我们都等这一天好久了! @泰勒H
@amarinediary IE11 的完整故事在于它与它所包含的嵌入式操作系统的生命周期相关,因此它只会在 2022 年 6 月 15 日开始消失。任何内置 IE11 的操作系统在此之后达到 EoL 将意味着在那些 EoL 之前,该操作系统也支持 IE11。但是,就您在 Web 开发中需要支持的内容而言,您现在可以有效地将 IE 视为 EoL。如果您需要支持 IE,您会知道,因为您的客户会特别需要它,即便如此,您也可以在 Edge 中使用 IE 模式。
t
trebor1979

在 LESS 中,您将使用以下变量:

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

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


n
nCardot

如果你想要更深的颜色,你可以使用rgba低不透明度的黑色:

rgba(0, 0, 0, 0.3);

对于打火机使用白色:

rgba(255, 255, 255, 0.3);

这取决于背景是什么,因为它变得半透明,而不是更轻
A
Alvaro Montoro

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

这个想法是基于使用:

RGB 颜色,因此您有单独的红色、绿色和蓝色值;

CSS 变量,用于存储颜色值和暗度;和

calc 函数,用于应用更改。

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

这是一个示例,我创建了三个类:.dark.darker.darkest,它们将分别使原始颜色暗 25%、50% 和 75%:

html { --清晰度:1; } div { 显示:内联块;高度:100px;宽度:100px;行高:100px;白颜色;文本对齐:居中;字体系列:arial、sans-serif;字体大小:20px;背景:rgba( calc(var(--r) * var(--clarity)), calc(var(--g) * var(--clarity)), calc(var(--b) * var(- -清晰度))); } .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; }

0%
25%
50%
75%


0%
25%
50%
75%


J
Joao Tavora

如果您决定使用 http://compass-style.org/,一个基于 sass 的 css 框架,它提供了非常有用的 darken()lighten() sass 函数来动态生成 css。很干净:

@import compass/utilities

$link_color: #bb8f8f
a
  color: $link_color
a:visited
  color: $link_color
a:hover
  color: darken($link_color,10)

生成

a {
  color: #bb8f8f;
}

a:visited {
  color: #bb8f8f;
}

a:hover {
  color: #a86f6f;
}

c
ctford

据我所知,你无法在 CSS 中做到这一点。

但我认为一点服务器端逻辑可以按照您的建议轻松完成。 CSS 样式表通常是静态资产,但它们没有理由不能由服务器端代码动态生成。您的服务器端脚本将:

检查 URL 参数以确定用户,从而确定用户选择的颜色。使用 URL 参数而不是会话变量,以便您仍然可以缓存 CSS。将颜色分解为其红色、绿色和蓝色分量 将三个分量中的每一个增量一个设定的量。对此进行试验以获得您所追求的结果。生成包含新颜色的 CSS

指向这个 CSS 生成页面的链接如下所示:

<link rel="stylesheet" href="http://yoursite.com/custom.ashx?user=1231">

如果您不使用 .css 扩展名,请务必正确设置 MIME 类型,以便浏览器知道将文件解释为 CSS。

(请注意,要使颜色更亮,您必须提高每个 RGB 值)


有一些基于 JavaScript 的方法可能更容易实现。参见例如experts-exchange.com/Programming/Languages/Scripting/JavaScript/…
有趣的建议。如果使用 JS,会不会有页面加载时颜色闪烁的风险?
我使用了这样的技术——每个用户都有自己的样式表——与用户指定颜色选择的首选项页面结合使用。请注意,您不必复制整个样式表,也不应该这样做。您可以在一个页面中有多个样式表,因此您可以为每个人都相同的东西创建一个通用样式表,然后为不同的东西创建一个自定义样式表。在我们的例子中,我们为刚刚采用默认设置的(大多数)用户提供了一个默认的自定义样式表。
现在支持 HSL 值(IE9+、Firefox、Chrome、Safari 和 Opera 10+),可以只更改亮度而无需计算新的 rgb (w3schools.com/cssref/css_colors_legal.asp) ... 向下滚动到 HSL /HSLA 部分...
Y
Yangshun Tay

如果您只需要更改 background 颜色,这是一种面向未来的好方法 - 在 background 图像上使用 linear-gradient 方法!

看看下面的例子:

document .getElementById('colorpicker') .addEventListener('change', function(event) { document .documentElement .style.setProperty('--color', event.target.value); });跨度{显示:内联块;边框半径:20px;高度:40px;宽度:40px;垂直对齐:中间; } .red { 背景颜色:红色; } .red-darker { 背景:线性渐变(到顶部,rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.25) )红色; } :root { --color: 石灰; } .dynamic-color { 背景色:var(--color); } .dynamic-color-darker { 背景:线性渐变(到顶部,rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.25) ) var(--color); }

静态颜色
动态颜色 < /span>

更改动态颜色:

学分:https://css-tricks.com/css-custom-properties-theming/


这是一个非常聪明的答案。我见过使用这个的生产代码: background-image: linear-gradient(rgba(0,0,0,0.30), rgba(0,0,0,0.30));
太好了,与过滤器答案相反,这不会影响我的边框颜色。
N
Nathan Arthur

您可以使用一点 javascript 来使用 rgb() 计算较深和较浅的颜色。

Fiddle :不是很好,但这只是为了说明。

它本质上所做的是设置一种颜色并选择 20 种颜色,它们的 rgb 数量(相互比较)只有 10 种。

for (var i=-10; i < $('.row:eq(0) .block').length/2 ; i++) {
 var r = 91;
 var g = 192;
 var b = 222;
 $('.row:eq(1) .block:eq('+(i+10)+')').css('background' , color(r+(i*10),g+(i*10),b+   (i*10))      );
};

C
Chris

不直接,不。但是您可以使用一个网站,例如 colorschemedesigner.com,它会为您提供基本颜色,然后为您提供不同范围的基本颜色的十六进制和 rgb 代码。

一旦我找到了我的网站的配色方案,我将颜色的十六进制代码放在我的样式表顶部的评论部分中并命名它们。

其他一些配色方案生成器包括:

http://www.colorschemer.com/online.html

http://colorschemegenerator.com/

http://www.cssjuice.com/25-popular-color-scheme-and-palette-generators/


你会如何动态地做到这一点?因为那是OP要求的
C
Cryptc

如果您需要强制使用旧版浏览器兼容性,您可以使用 Colllor 自动选择相似的颜色变化。

示例(颜色:#a9dbb4):

https://i.stack.imgur.com/UxWQ8.png


s
stephenhay

您可以使用 RGBa('a' 表示 alpha 透明度),但它尚未得到广泛支持。不过,它会是,所以你现在可以使用它并添加一个后备:

a:link { 
    color: rgb(0,0,255); 
    }
a:link.lighter {
    color: rgb(128,128,255); /* This gets applied only in browsers that don't apply the rgba line */
    }
a:link.lighter { /* This comes after the previous line, so has priority in supporting browsers */
    color: rgba(0,0,255,0.5); /* last value is transparency */
    }

如果主要浏览器支持它,这可能会有很大帮助。
A
Adam Whateverson

我正在使用原始 CSS3 和 SVG 添加答案,而不需要 LESS 或 SASS。

基本上,如果问题是为了全局悬停效果而使颜色变亮或变暗 10%、25%、50%,您可以像这样创建 SVG 数据调用

:root{
--lighten-bg: url('data:image/svg+xml;utf8,<svg version="1.1" id="cssLighten" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve"><rect opacity="0.2" fill="white" width="50" height="50"/></svg>') !important;
--darken-bg: url('data:image/svg+xml;utf8,<svg version="1.1" id="cssDarken" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve"><rect opacity="0.2" fill="black" width="50" height="50"/></svg>') !important;

}

.myButton{
    color: white;
    background-color:blue;
}
.myButton:hover{
    background-image: var(--lighten-bg);
}

出于某种原因,我不知道,SVG 不允许我在“填充”属性中输入十六进制值,但“白色”和“黑色”满足我的需要。

深思熟虑:如果您不介意使用图像,只需使用 50% 透明的 PNG 作为背景图像。如果你想花哨的话,可以调用一个 PHP 脚本作为背景图像,并将 HEX 和 OPACITY 值传递给它,然后让它吐出上面的 SVG 代码。


要将十六进制值用于填充颜色,请尝试使用 # 的 sted 中的 %23 对哈希字符进行编码。示例:fill="%23bb9988"
L
LordRathan

尝试:

a {
  color: hsl(240, 100%, 50%);
}

a:hover {
  color: hsl(240, 100%, 70%);
}

感谢您的回答 - 您应该注意它与其他答案之一重复。最好在回复之前检查其他答案。
谢谢你的提示。看来我错过了另一个答案,对不起。
N
NA Hoijtink

综合起来,一个纯粹用 DIV 和 CSS 完成的表格解决方案,试试吧;)浏览器应该支持 RGBA 颜色...。

<head>
<style>
    .colored-div-table {
        display: table;
        table-layout: fixed;
    }
    .colored-div-table #col {
        display: table-column;
    }
    .colored-div-table #col:nth-child(odd) {
    }
    .colored-div-table #col:nth-child(even) {
    }
    .colored-div-table #col:nth-child(1){
        background-color: lightblue;
        width: 50px !important;
    }
    .colored-div-table #col:nth-child(2){
        background-color: lightyellow;
        width: 200px !important;
    }
    .colored-div-table #col:nth-child(3){
        background-color: lightcyan;
        width: 50px !important;
    }
    .colored-div-table #row {
        display: table-row;
    }
    .colored-div-table #row div {
        display: table-cell;
    }
    .colored-div-table #row div:nth-child(1) {

    }
    .colored-div-table #row div:nth-child(2) {
    }
    .colored-div-table #row div:nth-child(3) {
    }
    .colored-div-table #row:nth-child(odd) {
        background-color: rgba(0,0,0,0.1)
    }
    .colored-div-table #row:nth-child(even) {
    }
</style>
</head>
<body>

<div id="divtable" class="colored-div-table">
    <div id="col"></div>
    <div id="col"></div>
    <div id="col"></div>  

    <div id="row">
        <div>First Line</div><div>FL C2</div><div>FL C3></div>
    </div>

    <div id="row">
        <div>Second Line</div><div>SL C2</div><div>SL C3></div>
    </div>

    <div id="row">
        <div>Third Line</div><div>TL C2</div><div>TL C3></div>
    </div>

    <div id="row">
        <div>Forth Line</div><div>FL C2</div><div>FL C3></div>
    </div>
    <div id="row">
        <div>Fifth Line</div><div>FL C2</div><div>FL C3></div>
    </div>
    <div id="row">
        <div>Sixth Line</div><div>SL C2</div><div>SL C3></div>
    </div>
    <div id="row">
        <div>Seventh Line</div><div>SL C2</div><div>SL C3></div>
    </div>
    <div id="row">
        <div>Eight Line</div><div>EL C2</div><div>EL C3></div>
    </div>
    <div id="row">
        <div>Nineth Line</div><div>NL C2</div><div>NL C3></div>
    </div>
    <div id="row">
        <div>Tenth Line</div><div>TL C2</div><div>TL C3></div>
    </div>

</div>
</body>

A
Aron Koffler

我知道已经很晚了,但是您可以对按钮使用包装器并更改 rgba 颜色函数不透明度级别,如其他答案中所述,但没有明确的示例。

这是一支笔:

https://codepen.io/aronkof/pen/WzGmjR

#wrapper { 宽度:50vw;高度:50vh;背景颜色:#AAA;边距:20px 自动;边框半径:5px;显示:网格;放置项目:中心; } .btn-wrap { 背景颜色:#000;显示:内联块; } 按钮 { 过渡:所有 0.6s 线性;背景颜色:rgba(0, 255, 0, 1);边框:无;大纲:无;颜色:#fff;填充:50px;字体粗细:700;字体大小:2em; } 按钮:悬停 { 背景颜色:rgba(0, 255, 0, .5); }


s
somedev

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

div {
    background-color:red;
}

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

其中 lighten.png 是具有 50% 透明度的白色填充的 PNG。

今天有更好的方法来做到这一点。我希望人们现在停止评论。


这很糟糕,原因有两个: 1. 您在悬停时加载了一个额外的文件。 2. 按钮会有不同的大小。
更好的是使用 base-64 编码的图像来跳过额外的文件加载。
这是很久以前有用的非常古老的解决方案。现在你最好不要使用它。只需使用过滤器/hsl/opacity 等。如果您可以通过程序方式解决它,请不要使用丑陋的图像加载方式
这真是一个可怕的黑客,无论你做什么,都不要这样做
这是一段历史。让我们这样尊重它。 ;)
J
Jay

请参阅我对 Ctford 回复的评论。

我认为使颜色变亮的简单方法是将每个 RGB 分量添加到 0xff 并除以 2。如果这不能给出您想要的确切结果,请将 0xff 减去当前值乘以某个常数然后加回当前值。例如,如果您想将 1/3 的路径移向白色,请采用 (0xff - current)/3+current。

你必须玩它才能看到你得到了什么结果。我担心通过这个简单的公式,一个足以使深色很好地褪色的因素可能会使浅色变成完全白色,而一个小到足以使浅色仅变亮一点的因素可能会使深色不够亮。

尽管如此,我认为走一小部分距离到白色比固定数量的步数更有希望。


C
Costa

我找到了一个 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);

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅