来源 | https://www.cnblogs.com/dragonir/p/14807272.html

作者 | dragonir

背景

基本概念

css filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染。它的值可以为 filter 函数 <filter-function> 或使用 url 添加的svg滤镜。

filter: <filter-function> [<filter-function>]* | none
filter: url(file.svg#filter-element-id)

<filter-function> 可以用于 filter 和 backdrop-filter 属性。它的数据类型由下列过滤器函数之一指定。每个函数需要一个参数,如果参数无效,则滤镜不会生效。以下是对滤镜函数含义的解释:

blur():模糊图像
brightness() :让图像更明亮或更暗淡
contrast():增加或减少图像的对比度
drop-shadow():在图像后方应用投影
grayscale():将图像转为灰度图
hue-rotate():改变图像的整体色调
invert():反转图像颜色
opacity():改变图像透明度
saturate():超饱和或去饱和输入的图像
sepia():将图像转为棕褐色

用法示例:

/* 使用SVG filter */
filter: url("filters.svg#filter-id");
/* 使用filter函数 */
filter: blur(5px);
filter: brightness(0.4);
filter: contrast(200%);
filter: drop-shadow(16px 16px 20px blue);
filter: grayscale(50%);
filter: hue-rotate(90deg);
filter: invert(75%);
filter: opacity(25%);
filter: saturate(30%);
filter: sepia(60%);
/* 多个filter */
filter: contrast(175%) brightness(3%);
/* 不使用filter */
filter: none;
/* 全局变量 */
filter: inherit;
filter: initial;
filter: unset;

应用案例

更加智能的阴影效果

在给元素添加阴影的时候,我们一般采用 box-shadow 属性,通过 box-shadow(x偏移, y偏移, 模糊大小, 阴影大小, 色值, inset) 的语法形式很容易为元素添加阴影效果,但 box-shadow 也有一个缺点,就是在给透明图片添加阴影效果时,无法穿透元素,只能添加到透明图片元素的盒模型上。

这个时候,filter 属性的 drop-shadow 方法就能很好的解决这个问题,用它添加的阴影可以穿透元素,而不是添加到元素的盒模型边框上。

drop-shadow 添加的阴影除了可以穿透透明元素外,阴影效果和 box-shadow 是相同的,如果浏览器支持硬件加速的话,使用 filter 添加的阴影效果会更加逼真。

drop-shadow 语法如下(它除了不支持设置 inset,其他和 box-shadow 是完全相同的):

filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

如:

filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));

下图是分别使用 box-shadow 和 filter: drop-shadow 为透明元素添加阴影的对比:

<img src="futurama.png" />
<img src="futurama.png" />
.box-shadow {box-shadow: 1px 1px 15px rgba(0, 0, 0, .5);
}
.drop-shadow {filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));
}

元素、网页置灰

发生重大灾害事故或其他哀悼日时,国企政府网站往往有网页全部置灰的需求。或者很多网页中有鼠标 hover 悬浮到灰色元素上时变成彩色的样式效果。

此时就可以使用 filter 属性的 grayscale 方法实现,它可以调整元素灰度,通过给页面元素设置 filter: grayscale(100%) 就可将页面元素置灰。

以下示例中,body 标签下有 h1 和 img 标签,未添加 filter 样式前如下所示。

<body><h1>FUTURAMA</h1><img width="500" src="./images/futurama.png" />
</body>

现在我们给 body 元素添加一个 .gray 类,<body> 就可实现整个网页置灰效果。

.gray {filter: grayscale(100%);
}

为了兼容 IE8 等其他低版本浏览器,我们可以加上浏览器前缀和 svg 滤镜。

.gray {-webkit-filter: grayscale(1);-webkit-filter: grayscale(100%);-moz-filter: grayscale(100%);-ms-filter: grayscale(100%);-o-filter: grayscale(100%);filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);filter: grayscale(100%);
}

在做紧急置灰网页需求时,上线一段时间往往需要撤掉这个功能,我们还可以在首次上线时添加以下类似的方法,来控制置灰效果的自动上下线时间,这样到达预定时间就可自动撤去,不用走两次施工流程。

(function setGray() {var endTime = Date.parse("Apr 06 2077 00:00:01");var timestamp = Date.parse(new Date());if (timestamp <= endTime) {document.querySelector('html').classList.add('gray');}
})();

元素强调、高亮

brightness 方法实现元素高亮的效果,可以应用到菜单栏、图片列表 hover 效果,来强调鼠标当前悬浮或选中的内容。

下面是对一组按钮菜单栏添加 brightness 和 saturate 两个方法,通过改变亮度和饱和度来高亮元素。

<div><a>1</a><a>1</a><a>1</a>
</div>
.container {margin: 40px;
}
.button {padding: 0.5em 0.5em;background: #E0E0E0;border-radius: 3px;
}
.button.dark {background: #333;
}
.button:hover:not(.disabled) {cursor: pointer;border-radius: 3px;filter: brightness(110%) saturate(140%);
}
.button.disabled {filter: grayscale(100%);
}

毛玻璃效果

毛玻璃(Frosted glass)效果,顾名思义就是类似半透明毛玻璃的效果,在 iOS 系统、Windows 10 等系统 UI 中有广泛应用,使用毛玻璃效果可以增强视觉体验。

在 《css揭秘》 等著作中也有系统讲解,下面是我对分别使用 filter: blur 和 backdrop-filter: blur两种方法实现这种效果的总结。

有两个含有相同类名 glass 的 div 元素,它们分别被添加两个类 glass-by-filter 和 glass-by-backdrop-filter 来区分两种方法。

<div></div>
<div></div>

通用样式,设置毛玻璃元素的大小、圆角等基本样式:

.glass {height: 300px;width: 300px;border: 1px groove #EFEFEF;border-radius: 12px;background: rgba(242, 242, 242, 0.5);box-shadow: 0 0.3px 0.7px rgba(0, 0, 0, 0.126),0 0.9px 1.7px rgba(0, 0, 0, 0.179), 0 1.8px 3.5px rgba(0, 0, 0, 0.224),0 3.7px 7.3px rgba(0, 0, 0, 0.277), 0 10px 20px rgba(0, 0, 0, 0.4);
}

filter: blur 方法,给元素添加了一个 ::before 伪类设置 blur 方法并将其置于底层实现毛玻璃效果。

.glass-by-filter {z-index: 1;box-sizing: border-box;position: relative;
}
.glass-by-filter::before {content: "";position: absolute;top: 0; right: 0; bottom: 0; left: 0;z-index: -1;background: inherit;filter: blur(10px);
}

backdrop-filter: blur 直接在元素上添加 blur 方法实现毛玻璃效果。

.glass-by-backdrop-filter {backdrop-filter: blur(10px);
}

实现效果如下图所示(左:filter、右:backdrop-filter):

【阅读扩展】毛玻璃边框效果:https://css-tricks.com/blurred-borders-in-css

艺术照!甚至可以实现简易版 insatagram

复古、版画、油画、漫画、液化、老照片、性冷淡、莫兰迪、赛博朋克、旺达幻视风格通通都可以实现!

通过结合使用 filter 的所有方法,可以搭配出任意自己想要的效果。

以下是一个简单的 filter 方法调节器,可以调整每个方法的值,同时实时展示图片的滤镜效果。如下图所示。

页面主要代码如下,控制区 #imageEditor 是一个 form 表单,表单每一行分别控制一种filter方法的值,展示区 #imageContainer 内部包含一个 img 元素,产生的 filter 滤镜作用在该元素上。

<form id="imageEditor"><p><label for="gs">Grayscale</label><input id="gs" name="gs" type="range" min="0" max="100" value="0"></p><p><label for="blur">Blur</label><input id="blur" name="blur" type="range" min="0" max="10" value="0"></p><p><label for="br">Exposure</label><input id="br" name="br" type="range" min="0" max="200" value="100"></p><p><label for="ct">Contrast</label><input id="ct" name="ct" type="range" min="0" max="200" value="100"></p><p><label for="huer">Hue Rotate</label><input id="huer" name="huer" type="range" min="0" max="360" value="0"></p><p><label for="opacity">Opacity</label><input id="opacity" name="opacity" type="range" min="0" max="100" value="100"></p><p><label for="invert">Invert</label><input id="invert" name="invert" type="range" min="0" max="100" value="0"></p><p><label for="saturate">Saturate</label><input id="saturate" name="saturate" type="range" min="0" max="500" value="100"></p><p><label for="sepia">Sepia</label><input id="sepia" name="sepia" type="range" min="0" max="100" value="0"></p><input type="reset" form="imageEditor" id="reset" value="Reset" />
</form>
<div id="imageContainer"><img src="futurama.png">
</div>
function editImage() {var gs = $("#gs").val();                // grayscalevar blur = $("#blur").val();            // blurvar br = $("#br").val();                // brightnessvar ct = $("#ct").val();                // contrastvar huer = $("#huer").val();            // hue-rotatevar opacity = $("#opacity").val();      // opacityvar invert = $("#invert").val();        // invertvar saturate = $("#saturate").val();    // saturatevar sepia = $("#sepia").val();          // sepia$("#imageContainer img").css("filter", 'grayscale(' + gs+'%) blur(' + blur +'px) brightness(' + br +'%) contrast(' + ct +'%) hue-rotate(' + huer +'deg) opacity(' + opacity +'%) invert(' + invert +'%) saturate(' + saturate +'%) sepia(' + sepia + '%)');$("#imageContainer img").css("-webkit-filter", 'grayscale(' + gs+'%) blur(' + blur +'px) brightness(' + br +'%) contrast(' + ct +'%) hue-rotate(' + huer +'deg) opacity(' + opacity +'%) invert(' + invert +'%) saturate(' + saturate +'%) sepia(' + sepia + '%)');
}
// 当input值发生变化时即时应用滤镜
$("input[type=range]").change(editImage).mousemove(editImage);

现在只是实现了滤镜的实时预览,后续待实现功能包括支持复杂的 svg 滤镜模版、导出下载等,完成这些步骤,以后照片添加滤镜再也不用下载其他 APP了。实例完整版代码:https://codepen.io/dragonir/pen/abJmqxM

节省空间,提高网页加载速度

实践证明,同一图片减小亮度和对比度及色相饱和度之后的体积与原图相比,可以减小很大一部分体积空间 2M 左右的图片经过弱化后保存,就可以压缩到 1M 左右。

在网页中我们可以使用经过 弱化 的图片,然后通过 CSS filter 将其还原。这样就可以达到压缩资源体积,提升网页加载速度、提高用户体验的目的。

具体操作可阅读以下教程:

对比度交换技术:使用 CSS filter 提高图像性能 https://css-tricks.com/contrast-swap-technique-improved-image-performance-css-filters

兼容性

从 caniuse 查询结果可以看出,css filter 属性在现代浏览器中的支持性已经很好了,除了 IE 浏览器之外,其他浏览器中大多可以正常使用,必要时可添加浏览器内核前缀。

但是官网也有以下3个issue 提示,相信后续随着浏览器的升级,这些问题也会被逐步修复:

在 Safari 浏览器中,如果子元素具有动画效果,则不会被应用滤镜。

目前没有浏览器支持 drop-shadow 滤镜的 spread-radius 方法。

在 Edge 浏览器中如果元素或子元素被设置了 负值z-index,则无法应用滤镜。

总结

本篇文章只是简单列举了几种使用 CSS filter 常用的页面效果,其实 filter 的每一种内置方法都可以有无限可能的扩展应用,如 invert 反转色同样也可以应用到 hover 效果上、调整网页sepia 褐色值可以实现护眼效果等。

只要发挥想象力和创造力,filter 都可以在实践中得到很好的应用。

以下一些例子就是很好的应用,大家有兴趣可以拓展阅读学习:

毛玻璃效果 https://codepen.io/KazuyoshiGoto/pen/nhstF
破碎玻璃效果 https://codepen.io/bajjy/pen/vwrKk
使用filter实现的hover效果 https://codepen.io/nxworld/details/ZYNOBZ
反色按钮 https://codepen.io/monkey-company/pen/zZZvRp
老照片 https://codepen.io/dudleystorey/pen/pKoqa
高级版filter编辑器:https://codepen.io/stoumann/pen/MWeNmyb

最后附上一张用上面滤镜编辑器调出来的 复古莫兰迪色性冷淡油画效果 滤镜图片。(哇塞,这也太哇塞了吧,CSS 绝绝子 yyds)

学习更多技能

请点击下方公众号

深入学习下 CSS filter 相关的神奇属性相关推荐

  1. `CSS filter` 有哪些神奇用途

    CSS filter 有哪些神奇用途 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZmlSog1-1652076154463)(https://p6-juejin. ...

  2. CSS filter有哪些神奇用途

    来源 | https://www.cnblogs.com/dragonir/p/14807272.html 作者 | dragonir 背景 基本概念 css filter 属性将模糊或颜色偏移等图形 ...

  3. CSS filter 有哪些神奇用途

    背景 基本概念 CSS filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染.它的值可以为 filter 函数 <filter-function ...

  4. jquery奇偶选择器_jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)

    对此,我把CSS3标准中nth-child()用法大致介绍下: CSS3伪类选择器:nth-child() 简单的归纳下nth-child()的几种用法. 第一:nth-child(number) 直 ...

  5. 学习jQuery顺便学习下CSS选择器:奇偶匹配nth-child(even)

    原文转自:http://www.cnblogs.com/Elgin/archive/2010/05/24/1742563.html 首先解释一下两个单词,一个是odd,一个是even,这两个单词表示的 ...

  6. amazeui学习笔记--css(布局相关3)--辅助类Utility

    amazeui学习笔记--css(布局相关3)--辅助类Utility 一.总结 1.元素清除浮动: 添加 am-cf 这个 class 即可 2.水平滚动: .am-scrollable-horiz ...

  7. 学习写DSHOW 框架下的FILTER 之一

    时间:8:30 2011-1-4 8:30 --- 9:00 总结与计划 学习怎么样来编写FILTER. 要从全局的角度思考,以业务流程为具体的执行纲要. [ DSHOW与FILETR 之间的关系] ...

  8. CSS 动画相关属性动态实例大全(82种),2023年祝福第二弹(送你一只守护兔)(下),守护兔源代码免费下载

    2023年春节祝福第二弹--送你一只守护兔(下) CSS 动画相关属性动态实例大全(82种).守护兔源代码免费下载 本文目录: 五.CSS3 动画相关属性实例大全 (1).CSS3的动画基本属性 (2 ...

  9. amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid

    amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid 一.总结 1.与grid区别:网格中:am-g + am-u-xx-n 等分网格中只有一个: am-avg-sm-4(在u ...

最新文章

  1. Datawhale组队学习 Task03:栈与递归(2天)
  2. 使用wmi的snmp类查询计算机网卡信息的源代码,在java中使用SNMP和/或wmi / wmic进行进程到端口的映射...
  3. Entity SQL Language 三 Where/Exists/In/Like/参数及外键查询
  4. C语言模拟质点运动轨迹坐标,C语言定时器的使用 计算质点运动的移位
  5. php注解rbac,PHP的RBAC权限详解
  6. Android Studio解决未识别Java文件(出现红J)问题
  7. Django模板渲染——(二)
  8. 【Kafka】Kafka 配置 SASL_SSL jks鉴权验证方式
  9. Java创建对象小结
  10. 关于MyDockFinder
  11. 基于Nginx,搭建HLS(HTTP Live Streaming)server,点播直播
  12. c语言把鼠标变成别的图案,鼠标指针图案怎么换?换成自己喜欢的可以吗?
  13. Facebook广告的基础认知,看一下你是否了解
  14. 上岸重庆邮电大学软件工程学院学硕总结
  15. python中美元人汇率_Python爬虫练习:爬取美元历史汇率
  16. 模拟计算机打字,JS实现电脑虚拟键盘打字测试
  17. MySQL使用GROUP BY分组时如何留下指定的行
  18. 编程语言编年史:作为程序员的你怎能不知?
  19. 树莓派4B安装系统,配置远程连接和WiFi,更新源,更新中文支持,基本Linux命令,用Python输出hello和“你好,世界”
  20. C++(STL)学习笔记

热门文章

  1. Shadertoy 多个buffers 转成Threejs代码
  2. simulink 脱离 matlab,Simulink软件不能脱离MATLAB环境而运行
  3. 如何脱离AirtestIDE跑Airtest自动化脚本
  4. 汉语中的 熟语中的成语900个
  5. 应用ceph对象存储(ceph-13.2.10)
  6. 图像特征提取中的平移不变性、旋转不变性、尺度不变性
  7. 网页内嵌编辑器ueditor的使用
  8. wi-fi测试软件正确吗,几款Wi-Fi信号测试小工具
  9. DedeCMS找后台目录漏洞
  10. [19保研]北京大学信息工程学院关于举办“2018年全国优秀大学生科技夏令营”的通知...