[译] 4 个 CSS 调色滤镜

SVG 提供了一种非破坏性的方式来更改图像或图形的某些颜色属性。但不幸的是,有一些更改实现起来比较麻烦。CSS 滤镜容许你以非破坏性的方式更改某些颜色属性,而且比 SVG 滤镜更简单。css

过去几周里,我一直把 CSS 滤镜做为 SVG 滤镜的备选方案来探讨。首先我大致介绍了一下滤镜,并展现了滤镜函数 blur() 的示例;而后我介绍了 url() 和 drop-shadow() 滤镜函数并分别提供了示例。html

今天我想带你了解另外四个 CSS 滤镜函数,这些函数都是 SVG 滤镜函数 feColorMatrix 不一样类型和值的快捷方式。前端

feColorMatrix

feColorMatrix 能够做为更改元素中某些颜色基本属性的通常方法。顾名思义,它经过使用值矩阵来为元素添加不一样的滤镜效果。android

CSS 中有四个不一样的滤镜函数,它们能够复制使用 feColorMatrix 建立的效果。这有力地证实了,单个 SVG 滤镜比任何一个单独的 CSS 滤镜函数都要强大。ios

如下是那四个 CSS 滤镜:git

  • grayscale();
  • hue-rotate();
  • saturate();
  • sepia();

那就让咱们依次探究这些 CSS 滤镜函数,用它们为这张熟悉的(若是你一直在关注本系列文章的话)图片改变颜色吧。github

strawberry.jpg

grayscale()

grayscale() 将图像转换为灰度图像。web

grayscale() = grayscale( [ <number> | <percentage> ] )
复制代码

你能够经过提供介于 0.0 和 1.0 之间的数字或 0% 到 100% 之间的百分比来肯定转换图像的比例。100%(或 1.0)将图像彻底转换为灰度图像,0%(或 0.0)不会转换图像。0.0 到 1.0(或 0% 到 100%)之间的值是效果的线性乘数。不容许使用负值。后端

在第一个例子中,我给滤镜函数传入了值 1,给图片赋予了 100% 灰度的效果。bash

.strawberry {
 filter: grayscale(1);
}
复制代码

原始图像包含大量灰色,但我认为你依然能够看到滤镜的效果,由于如今全部彩色都已被擦除。

为了比较,我在下面列出了与滤镜函数等效的矩阵实现方式。公平地说,使用 feColorMatrix 来删除彩色的更简便方法,是把 type 属性设置为 saturate。我稍后会告诉你的。

<filter id="grayscale">
 <feColorMatrix type="matrix" values="(0.2126 + 0.7874 * [1 - amount]) (0.7152 - 0.7152 * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0 (0.2126 - 0.2126 * [1 - amount]) (0.7152 + 0.2848 * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0 (0.2126 - 0.2126 * [1 - amount]) (0.7152 - 0.7152 * [1 - amount]) (0.0722 + 0.9278 * [1 - amount]) 0 0 0 0 0 1 0"/>
</filter>
复制代码

尽管如此,这个示例还是 CSS 滤镜功能更易用的有力佐证。使用这个特定矩阵,只是由于我在网上看到了该方法的一个应用示例。我不须要在 CSS 滤镜函数中搜索值 1。

hue-rotate()

hue-rotate() 按指定的量更改元素中每一个像素的色调。

hue-rotate() = hue-rotate( <angle> )
复制代码

参数 angle(角度)以度为单位,你须要将单位指定为 deg。0deg 使元素保持不变,360deg 的任意倍数(720deg、1080deg、1440px 等)也是如此。

在这个例子中,我将色相旋转了 225 度。

.strawberry {
 filter: hue-rotate(225deg);
}
复制代码

该值将本来是红色和黄色的花色,变得更加偏向粉色、紫色和蓝色。

这是用于比较的 SVG 滤镜。相比之下,CSS 滤镜仍然更简单,但在这种状况下的差距不大。

<filter id="hue-rotate">
 <feColorMatrix type="hueRotate" values="225"/>
</filter>
复制代码

saturate()

CSS 还提供了 saturate(),可用于提升或下降元素颜色的饱和度。

saturate() = saturate( [ <number> | <percentage> ] )
复制代码

与灰度函数同样,该函数的参数值定义了转换的比例。0%(或 0.0)使元素彻底去饱和,100%(1.0)使元素保持不变。0 到 100 之间的值是效果的线性乘数。

在这里,我将元素设置为 50% 饱和度。

.strawberry {
 filter: saturate(0.5);
}
复制代码

这生成了下面的图像效果。

saturate() 不容许使用负值,但你能够设置大于 100% 或 1.0 的值使元素过饱和。下面是同一张图片施加 900% 饱和度的效果(filter: saturate(9);)。

和 saturate() 对应的 SVG 滤镜也很简单。

<filter id="saturate">
 <feColorMatrix type="saturate" values="0.5"/>
</filter>
复制代码

在以前我曾经提到,用 feColorMatrix 来建立灰度图像,有一种更简单的方式,那就是把 type 属性设为 saturate。你所要作的就是将值设置为 0 以使图像彻底去饱和,这与将其设置为 saturate(100%) 相同。

sepia()

最后是 sepia(),它将图像转换为棕褐色。

sepia() = sepia( [ <number> | <percentage> ] )
复制代码

如今你应该很熟悉这种写法了。这里的值定义了转换比例,100%(1.0)展示为彻底棕褐色,0%(0.0)使图像效果保持不变。从 0% 到 100%,效果线性加强。

这个函数不容许使用负值,你能够设置大于 100%(1.0)的值,但效果不会继续加强。

这里我将 sepia 设为 75%:

.strawberry {
 filter: sepia(75%);
}
复制代码

下图是滤镜的效果展现:

5.jpg

feColorMatrix 不支持棕褐色效果模式。若是要得到相同的棕褐色效果,你须要使用另外一个模型。

<filter id="sepia">
 <feColorMatrix type="matrix" values="(0.393 + 0.607 * [1 - amount]) (0.769 - 0.769 * [1 - amount]) (0.189 - 0.189 * [1 - amount]) 0 0 (0.349 - 0.349 * [1 - amount]) (0.686 + 0.314 * [1 - amount]) (0.168 - 0.168 * [1 - amount]) 0 0 (0.272 - 0.272 * [1 - amount]) (0.534 - 0.534 * [1 - amount]) (0.131 + 0.869 * [1 - amount]) 0 0 0 0 0 1 0"/>
</filter>
复制代码

我认为,在达成相同效果上,SVG 能够为你提供更大的灵活性,CSS 滤镜函数更简单。

结论

上面提到的这四个 CSS 滤镜函数都是 feColorMatrix 的快捷方式。其中有两个(grayscale()sepia())替换了复杂矩阵,另外两个替换了特定类型的函数。

我但愿你能了解到这四个滤镜函数都简单易用好理解。但恐怕你在使用这些函数调整图像图形参数时,仍是会遇到一些困难。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索