我有一个白色的图像,我正在使用作为一个div的背景,我想 colored颜色 匹配的主题主色.我知道我能做到:

filter: sepia() saturate(10000%) hue-rotate(30deg);

并在hue-rotate之间循环以找到 colored颜色 ,但是否可以预先计算此值?鉴于指定的祸不单行值相当暗,我想我还需要包括invert(%)个过滤.

假设祸不单行的值为#689d94时,我需要做什么数学运算才能计算出所需的hue-rotate值和invert值,才能将白色背景图像转换为相同的 colored颜色 ?

编辑

这是div的一个片段,白色背景图像被过滤成绿色.这里的诀窍是,被过滤的不仅仅是图像,而是这div个人中的整个人.如果我在div中输入一些文本,文本 colored颜色 也会变成绿色.

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat scroll 0 0 transparent;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
  filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
}
<div>
  </div>

推荐答案

在这种情况下,关键是定义初始 colored颜色 .从技术上讲,白色、黑色或任何灰度级都是实际的 colored颜色 -你不能使其饱和或旋转.你得想办法给它"上色",而深褐色的过滤是唯一可以上色的过滤.

如果你的图像是100%纯红的,那就容易多了.然后,您可以直接添加目标度数,并使用目标的HSL调整饱和度和亮度.对于白色起始点,第一步是转换和定义中间色,这样我们就可以在以后饱和和旋转它.

让我们首先将白色图像变暗,然后应用深褐色来获得我们可以使用的"基色":

filter: brightness(50%) sepia(1);

这将产生大约为的RGB colored颜色 值:

rgb(178, 160, 128)

第二步是convert that to HSL color-space,这给了我们:

hsl(38, 24.5%, 60%);

Base color result

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: brightness(50%) sepia(1);
  filter: brightness(50%) sepia(1);
}
<div></div>

Converting base color to target color

这两个第一步就是静电,每次我们需要找到目标调整的时候,都会重用它的结果(实际的sepia值是在SVG Filters specification中定义的).

现在我们需要计算我们需要对这个基色应用什么才能获得目标 colored颜色 .首先将目标 colored颜色 (例如问题中给出的#689d94)转换为HSL:

hsl(170, 21.3%, 51.2%);

然后我们必须计算它们之间的差额.色调只需从目标中减go 底色即可.饱和度和亮度也是如此,但由于我们假设基值为100%,因此需要从100%中减go 结果,以得出累加值的差值:

H:  170 - 38             ->  132°
S:  100 + (24.5 - 21.3)  ->  103.2%  (relative to base 100% =  3.2%)
L:  100 + (51.2 - 60.0)  ->   91.2%  (relative to base 100% = -8.8%)

通过将这些值附加到现有筛选器,将其转换为筛选器字符串,然后在div上设置:

/*      ------ base color ------  -------  new target -------------------------------*/
filter: brightness(50%) sepia(1)  hue-rotate(132deg) saturate(103.2%) brightness(91.2%);

要设置它,假设已经声明了filter和divElement,您可能会执行如下操作:

...
filter = "brightness(0.5) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%)";
divElement.style.filter = filter;
divElement.style.webkitFilter = filter;

请注意,可能存在舍入误差,因为RGB表示为整数,而HSL表示为浮点,因此实际结果可能不准确,但应该非常接近.

Live example

div {
  background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
  background-size:5em;
  width:5em;
  height:5em;
  -webkit-filter: 
      brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
  filter: 
      brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
}
<div></div>
<span style="font:14px sans-serif;padding:7px;color:#fff;background:#689d94">
Target color</span>

可行的备选方案包括:

  • 使用已设置的 colored颜色 预定义SVG.
  • 直接在JavaScript中使用HSL/RGB,并使用形状的 colored颜色 直接修改SVG树,而不是使用滤镜.筛选器在性能方面非常昂贵,特别是当许多筛选器像这里一样链接在一起,并且它们是页面的主要部分时更是如此.它们在所有浏览器中都不受支持.

Css相关问答推荐

Css:有没有更快捷的方式来编写多媒体查询?

悬停时可展开的按钮与屏幕右侧对齐,如何保持未悬停的按钮正确对齐?

如何在react 路由中设置活动类?

如何将React应用程序主页的内容居中?

如果 css 仅位于 razor 页面中的一页上,我是否仍应在 wwwroot 中写入或仅将其放在页面上?

当鼠标移到侧边栏之外时,如何防止shiny 仪表板侧边栏菜单中的 pickerInput 选项被切断?

使用普通 CSS 的视口对角线长度

不明白为什么 div 不均匀并且不填满页面

使用CSS Grid是否可以跳过下一列?

Vuetify 抽屉标签溢出/z-index

在 CSS 中,如何用破折号填充段落中每一行的空白区域?

如何在变量中插入 SCSS 变量?

如何在真实文本旁边制作文本阴影,使其看起来像 css 中的重复文本?

使用 css 网格和 nth-child 交替行

CSS3 - RotateY() 居中

选中时从 HTML 文本输入中移除蓝色光晕

CSS媒体查询仅针对iPad和iPad?

iPhone X / 8 / 8 Plus CSS 媒体查询

位置固定宽度 100%

单选按钮和标签显示在同一行