filter属性是将滤镜效果应用于网页元素(主要是图像)的CSS方法。

默认图像如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>CSS filter 滤镜学习</title>
  8. <style>
  9. html,
  10. body {
  11. padding: 0;
  12. margin: 0;
  13. }
  14. .img {
  15. width: 100vw;
  16. height: 100vh;
  17. position: fixed;
  18. top: 0;
  19. background-image: url("./1.jpg");
  20. }
  21. .container {
  22. position: relative;
  23. top: 0;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="img">
  29. </div>
  30. <!-- <div class="container">
  31. <h4>你不要过来啊</h4>
  32. </div> -->
  33. </body>
  34. </html>

image.png

属性列表

blur(px) 高斯模糊

给图像设置高斯模糊。”radius”一值设定高斯函数的标准差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊;如果没有设定值,则默认是0;这个参数可设置css长度值,但不接受百分比值。

  1. .img {
  2. width: 100vw;
  3. height: 100vh;
  4. background-image: url("./1.jpg");
  5. filter: blur(15px);
  6. }

image.png

brightness(%) 亮度

给图片应用一种线性乘法,使其看起来更亮或更暗。如果值是0%,图像会全黑。值是100%,则图像无变化。其他的值对应线性乘数效果。值超过100%也是可以的,图像会比原来更亮。如果没有设定值,默认是1。

filter: brightness(0%);
image.png

filter: brightness(20%);

image.png

  1. filter: brightness(50%);

image.png

filter: brightness(100%);

image.png

filter: brightness(180%);
image.png

contrast(%) 对比度

调整图像的对比度。值是0%的话,图像会全黑。值是100%,图像不变。值可以超过100%,意味着会运用更低的对比。若没有设置值,默认是1。

filter: contrast(0%);
image.png
filter: contrast(50%);

image.png

filter: contrast(100%);
image.png

filter: contrast(150%);
image.png

filter: contrast(200%);

image.png

brightness与contrast对比

设置100%的时候图像都是原图,0%时,brightness是全黑而contrast更偏灰色。感觉brightness和contrast的效果就像是给图片加了一层黑色/灰色的遮罩蒙版。

drop-shadow() 阴影

drop-shadow(h-shadow v-shadow blur spread color)

给图像设置一个阴影效果。阴影是合成在图像下面,可以有模糊度的,可以以特定颜色画出的遮罩图的偏移版本。
函数接受(在CSS3背景中定义)类型的值,除了”inset”关键字是不允许的。该函数与已有的box-shadow box-shadow属性很相似;不同之处在于,通过滤镜,一些浏览器为了更好的性能会提供硬件加速。

参数如下:
(必须) 这是设置阴影偏移量的两个 值.
设定水平方向距离. 负值会使阴影出现在元素左边.
设定垂直距离.负值会使阴影出现在元素上方。

如果两个值都是0, 则阴影出现在元素正后面 (如果设置了 and/or ,会有模糊效果).
滤镜filter - 图13

  1. .img {
  2. width: 90vw;
  3. height: 90vh;
  4. position: fixed;
  5. top: 0;
  6. background-image: url("./1.jpg");
  7. /* filter: blur(30px); */
  8. /* filter: brightness(100%); */
  9. /* filter: contrast(200%); */
  10. filter: drop-shadow(0px 0px 15px rgba(0, 0, 0, 0.5));
  11. }

image.png

(可选)这是第三个code>值. 值越大,越模糊,则阴影会变得更大更淡.不允许负值 若未设定,默认是0 (则阴影的边界很锐利).

(可选)这是第四个 值. 正值会使阴影扩张和变大,负值会是阴影缩小.若未设定,默认是0 (阴影会与元素一样大小).
注意: Webkit, 以及一些其他浏览器 不支持第四个长度,如果加了也不会渲染。

(可选) 。若未设定,颜色值基于浏览器。在Gecko (Firefox), Presto (Opera)和Trident (Internet Explorer)中, 会应用colorcolor属性的值。另外, 如果颜色值省略,WebKit中阴影是透明的。

CSS3 filter:drop-shadow滤镜与box-shadow区别应用

grayscale(%) 灰度

将图像转换为灰度图像。值定义转换的比例。值为100%则完全转为灰度图像,值为0%图像无变化。值在0%到100%之间,则是效果的线性乘子。若未设置,值默认是0;

filter: grayscale(0%); 原图
image.png
filter: grayscale(50%);
image.png
filter: grayscale(100%); 有黑白照内味了。
image.png

hue-rotate(deg) 色相旋转

给图像应用色相旋转。”angle”一值设定图像会被调整的色环角度值。值为0deg,则图像无变化。若值未设置,默认值是0deg == 360deg。该值虽然没有最大值,超过360deg的值相当于又绕一圈。

filter: hue-rotate(90deg);
image.png
filter: hue-rotate(180deg);

image.png

filter: hue-rotate(270deg);
image.png

hue-rotate滤镜除了支持deg,还支持其它CSS3单位,如圈数turn以及弧度rad等。

🌰

  1. hue-rotate(90deg) /* 90度旋转 */
  2. hue-rotate(.5turn) /* 180度旋转 */
  3. hue-rotate(3.142rad) /* 3.142弧度旋转,近似一圈,也就是360度 */

invert(%) 反相(反转输入图像)

反转输入图像。值定义转换的比例。100%的价值是完全反转。值为0%则图像无变化。值在0%和100%之间,则是效果的线性乘子。 若值未设置,值默认是0。

filter: invert(20%); 和 filter: contrast(50%);很像啊
image.png

filter: invert(50%);和filter: contrast(0%);很像啊,全灰了。
image.png
filter: invert(60%);
image.png

filter: invert(80%);
image.png
filter: invert(100%);
image.png

opacity(%) 透明度

转化图像的透明程度。值定义转换的比例。值为0%则是完全透明,值为100%则图像无变化。值在0%和100%之间,则是效果的线性乘子,也相当于图像样本乘以数量。 若值未设置,值默认是1。该函数与已有的opacity属性很相似,不同之处在于通过filter,一些浏览器为了提升性能会提供硬件加速。

  1. filter: opacity(10%);
  2. /*等价于*/
  3. opacity: 10%;

image.png

saturate(%) 饱和度

转换图像饱和度。值定义转换的比例。值为0%则是完全不饱和,值为100%则图像无变化。其他值,则是效果的线性乘子。超过100%的值是允许的,则有更高的饱和度。 若值未设置,值默认是1。

测试

filter: saturate(10%);

image.png

sepia(%) 深褐色

将图像转换为深褐色。值定义转换的比例。值为100%则完全是深褐色的,值为0%图像无变化。值在0%到100%之间,则是效果的线性乘子。若未设置,值默认是0;

filter: sepia(50%);
image.png

filter: sepia(100%);
image.png

url()

URL函数接受一个XML文件,该文件设置了 一个SVG滤镜,且可以包含一个锚点来指定一个具体的滤镜元素。
🌰:

  1. filter: url(svg-url#element-id)

initial 默认值

设置属性为默认值,可参阅: CSS initial 关键字

inherit 继承父元素

从父元素继承该属性,可参阅:CSS inherit 关键字

复合函数

使用多个滤镜,每个滤镜使用空格分隔。

注意: 顺序是非常重要的 (例如使用 grayscale() 后再使用 sepia()将产生一个完整的灰度图片)。

常用效果

filter:blur基础应用

一个是把封面图变得模糊,然后作为背景图。

滤镜filter - 图30

还有一个是弹框出现的时候,让弹框背后的元素模糊,从而让视觉更聚焦。

滤镜filter - 图31

filter:grayscale基础应用

点亮徽章再也不需要两张图了,只需要准备一张彩图,至于没有激活的灰图,我们可以使用滤镜控制:

滤镜filter - 图32

blur 局部模糊,径向模糊

🌰径向模糊:

  1. <div class="box-blur">
  2. <img src="./example.jpg" class="radial-blur">
  3. <img src="./example.jpg">
  4. </div>
  5. .box-blur {
  6. width: 256px; height: 192px;
  7. position: relative;
  8. overflow: hidden;
  9. }
  10. .radial-blur {
  11. position: absolute;
  12. left: 0; right: 0; top: 0; bottom: 0;
  13. filter: blur(20px);
  14. mask-image: radial-gradient(transparent, transparent 10%, black 60%);
  15. transform: scale(1.2);
  16. }

滤镜filter - 图33

🌰局部模糊:

  1. <div class="box-blur">
  2. <img src="./example.jpg" class="local-blur">
  3. <img src="./example.jpg">
  4. </div>
  5. .box-blur {
  6. width: 256px; height: 192px;
  7. position: relative;
  8. overflow: hidden;
  9. }
  10. .radial-blur {
  11. position: absolute;
  12. left: 0; right: 0; top: 0; bottom: 0;
  13. filter: blur(12px);
  14. mask: no-repeat center;
  15. mask-image: linear-gradient(black, black), linear-gradient(black, black);
  16. mask-size: cover, 60px 60px;
  17. mask-composite: exclude;
  18. mask-composite: source-out;
  19. transform: scale(1.1);
  20. }

滤镜filter - 图34

👅filter:hue-rotate色调旋转滤镜实现按钮颜色批量生产

传统按钮都是通过具体色值进行赋色的,例如下面这些按钮和其对应的色值(出自LuLu UI):
image.png

有如下缺点:

  1. 每种按钮还有不同的:hover:active颜色需要额外设置,按钮CSS代码量较多,出现颜色也很多;

  2. 如果出现新的状态按钮,例如今年流行紫色,需要一个紫色按钮。开发同学需要求助于设计师,因为自己选的紫色的亮度和饱和度往往和现有的按钮不搭。

实际上,有更简单的方法按钮赋色方法,可以规避上面的缺点,就是使用CSS3 filter滤镜中的hue-rotate()色调旋转滤镜。

实际上,我们只需要写好一个按钮样式,其他各种颜色按钮都无需再多此一举写一大堆CSS代码。例如,现有蓝色主按钮如下:

image.png

  1. .btn { filter: hue-rotate(60deg); }

CSS filter滤镜任意色值转换在线工具

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>👅filter:hue-rotate色调旋转滤镜实现按钮颜色批量生产</title>
  8. <link href="https://fonts.googleapis.com/css?family=Lato:400,400i|Roboto:500" rel="stylesheet">
  9. <style>
  10. .color {
  11. background-color: #f4615c;
  12. color: #fff;
  13. }
  14. .hue-rotate-60 {
  15. filter: hue-rotate(60deg);
  16. }
  17. .hue-rotate-90 {
  18. filter: hue-rotate(90deg);
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <h1 class="color">
  24. 👅filter:hue-rotate色调旋转滤镜实现按钮颜色批量生产
  25. </h1>
  26. <h1 class="color hue-rotate-60">
  27. 👅filter:hue-rotate色调旋转滤镜实现按钮颜色批量生产
  28. </h1>
  29. <h1 class="color hue-rotate-90">
  30. 👅filter:hue-rotate色调旋转滤镜实现按钮颜色批量生产
  31. </h1>
  32. </body>
  33. </html>

image.png

hue-rotate滤镜与动效

hue-rotate滤镜还可以用来实现很酷的动效,例如下面这个图像变色的效果(GIF截屏):
滤镜filter - 图38
实现代码其实很简单:
.bird {
animation: pulse 5s linear infinite;
}
@keyframes pulse {
from { filter: hue-rotate(0); }
to { filter: hue-rotate(360deg); }
}
就是一个色调360度不断旋转。
眼见为实,您可以狠狠地点击这里:CSS hue-rotate滤镜改变图片颜色动效demo
这种动效方法特别适合色彩丰富的图形或图像。

brightness 图标的变色

一个图标背景图希望从深色变成白色:

滤镜filter - 图39

如果是font字体图标的话直接设置文字即可,但图片怎么变色呢?

按照以前的时间,我们应该会准备两张不同颜色的图片,然后根据类名,然后进行切换,

实际上,我们可以借助CSS滤镜一步到位,例如这里图标变成白色,我们可以直接一行简单的CSS即可:

  1. .ui-button-primary .icon-delete {
  2. filter: brightness(100);
  3. }

也就是设置图标的亮度非常亮,自然就表现为白色了。

图标变色为任意指定颜色

纯CSS实现任意格式图标变色的研究

CSS filter滤镜任意色值转换在线工具

CSS mask遮罩实现任意颜色的小图标demo

色彩动画

主要展示hue-rotate色调旋转滤镜的一些应用。

  1. @keyframes hue {
  2. from { filter: hue-rotate(0deg); }
  3. to { filter: hue-rotate(360deg); }
  4. }

一个360度色调无缝旋转动画,这个动画可以用在任何元素上,尤其那些色彩丰富的元素,可以得到非常精彩的色彩流动效果。

引用SVG滤镜技术

CSS filter还支持直接引用SVG滤镜,语法如下:

  1. /* 外链 */
  2. .filter {
  3. filter: url("filter.svg#filter-id");
  4. }
  5. /* 内联 */
  6. .filter {
  7. filter: url("#filter-id");
  8. }

页面任意位置塞入这么一段SVG代码:

//
需要粘滞融合元素的父元素CSS加一句:

  1. filter: url("#goo");

滤镜filter - 图40

参考文章

https://www.zhangxinxu.com/wordpress/2019/06/fdcon2019-css-share/