深入理解CSS3滤镜(filter)功能和实例详解
CSS3滤镜功能源自SVG滤镜规范,SVG滤镜最早用来给矢量图添加类似PS中像素图的一些特效。
把这个滤镜功能引入到普通HTML元素中可以带来很有趣的效果(模糊、变形、色度等),这赋予开发者更多创意表达的空间。
为止SVG和CSS工作组联合起来制定一个协调统一的滤镜规范:https://drafts.fxtf.org/filters/
该规范目前尚处于编辑者草稿阶段(Editor's Draft),还在不断实验和发展中,但以Chrome和FF为代表的现代浏览器已经提供了支持。
本文简单介绍CSS3中常用滤镜效果的工作方式。
使用语法
filter被作为一个新的属性引入CSS3,语法示例如下:
div { filter: grayscale(100%); }
这里我们忽略浏览器前缀。
工作原理
HTML元素绘制到页面的过程分为两步,第一步是绘制当前元素及其子元素到一个缓存中,然后和其父元素组合并最终绘制到屏幕。
滤镜效果发生在“组合”这一步之前,也就是对缓存中的数据进行处理后再和父元素组合(Composite),这个数据处理过程和像素图的处理方式类似,对原图做一个通过CSS3 filter属性指定的图像算法运算得到一个新图,然后两者复合而成,就好比在相机镜头前加了一个过滤镜片一样。
SVG和CSS滤镜
CSS3中可以直接使用SVG的滤镜,SVG中的filer是通过xml语法来定义,这样结合起来使用固然可以复用SVG已有滤镜的强大功能,但写起来比较复杂,因此CSS3中新定义了一些内置的常用滤镜,使用起来要容易得多。这里将只讨论后者。
1.灰度滤镜
img{ filter: grayscale(100%); }
你可以修改上面代码中的灰度比例值,来观察效果的变换。
2.发黄滤镜
img{ filter: sepia(100%); }
这个滤镜接受百分比参数,可以用来制作老照片特效。
3.饱和度滤镜
img{ filter: saturate(10); }
这个滤镜用来改变图片的饱和度,使得图片更加醒目刺眼(与之相反的是色彩柔和度)。一般用于海报制作突出重点部分。
4.色轮滤镜
img{ filter: hue-rotate(50deg); }
这个滤镜利用色轮(color-wheel)来转换颜色,比如50deg表示图像的颜色转换为在色轮上旋转50度后的颜色值。
5.反转滤镜
img{ filter: invert(100%); }
该滤镜用来反转当前颜色,可以接受百分比参数。和PS中的反转效果类似。
6.透明度滤镜
img{ filter: opacity(50%); }
该滤镜用来改变图像的透明度。可以接受百分比参数。
7.亮度滤镜
img{ filter: brightness(50%); }
该滤镜可用来模拟环境光照效果,比如聚光特效或暗夜特效。
8.对比度滤镜
img{ filter: contrast(20%); }
该滤镜用来加强或减弱颜色对比度(即最亮颜色和最暗颜色之间的差异,100%表示和原图一样)。
9.模糊滤镜
img{ filter: blur(10px); }
该滤镜用来获取图像模糊特效,接受模糊半径(尺寸单位)参数。视觉上类似相机镜头失焦一样,其工作方式是把像素周边一定区域(由模糊半径参数所确定)的像素颜色进行混合,从而达到失去焦点的效果。
10.投影滤镜
img{ filter: drop-shadow(3px 3px 5px black); }
该滤镜用来获取图像外部的模糊阴影效果,和blur不同是,blur应用于图像本身,而drop-shadow是图像外部投影。
其工作方式是获取原图像的一个快照,然后使用指定颜色替换,再加上blur(模糊)效果,最后偏移指定位置后和原图复合。
该滤镜方法接受的参数为2到3个长度单位,比如上面代码中前面2个3px单位分别表示右阴影和下阴影长度,第3个参数5px表示模糊半径,最后的颜色参数表示阴影颜色。
性能考量
对于桌面系统而言,因为浏览器计算能力足够强大,一般不需要考虑性能,但是对于手机设备,需要小心应对和测试,尤其是blur效果(包括drop-shadow,因其内置blur操作),应该尽量减少blur半径,在效果和性能之间取得平衡。
关于在CSS3滤镜中直接用url引用SVG滤镜,可以在本站动效资源中搜索“SVG滤镜”,有很多果冻(粘稠液体)特效是用这种方法来制作的。
最新评论
- 相关文章
2019年NodeJS框架Koa和Express选型比较
Koa和Express都是NodeJS的主流应用开发框架。
Express是一个完整的nodejs应用框架。Koa是由Express团队开发的,但是它有不同的关注点。Koa致力于核心中间件...常用光照类型基本概念工作原理及其计算公式
在三维场景中,原理上物体的渲染效果取决于光照与物体表面的相互作用,对于渲染程序而言,可以通过把一些数学公式应用于像素着色来实现,从而模拟出真实生活中的...
JavaScript事件模型图解
在JavaScript中用户交互的核心部分就是事件处理。本文为对事件模型和处理机制的总体性描述。Event是什么?
event是用户操作网页时发生的交互动作,比如clic...如何使用CSS3合成模式(blend-mode)和滤镜(filter)实现彩色蜡笔(时光机)照片特效
在之前的文章中我们已经详细讲解过CSS3滤镜(filter,也可称之为过滤器)的工作方式,本文将实现一个当下流行的时光机相片特效实例来说明其实际用途。
我们...HTML5动画背后的数学2 - 仿生智能算法综述
HTTP1.1协议现状、问题和解决方案
HTTP的现状最早的HTTP协议非常简单,只能用来传送文本,方法也只有GET,后来逐步发展到1.1,能够支持多种MIME格式数据(如文本、文件),支持GET,POST,HEAD,OPTI...
使用SVG和CSS3创建圆形进度条动画
圆形进度条是一个经典的控制面板元素,常用于显示任务进度,比如用户档案的完整程度,或者升级状态。有很多方法来实现圆形进度条,比如用JS, CSS3, Canvas, SVG...
计算WebGL中的uniforms变量使用数
在使用Three.js为人体模型加载皮肤材料时,启用了skinning:true的参数。有时候会导致GL编译错误,提示“too many uniforms”。下面的文章有助于理解错误原因和检...
Three.js入门教程1 - 基础知识和创建一个红色球体
[ TECHBROOD注:Three.js是一个主流的开源WebGL库,WebGL允许使用JavaScript直接操作GPU,在网页上实现3D效果。
Google的工程师Paul在网站aerotwist.com上...WebGL入门教程4 - 使用纹理贴图(Texture Map)
3D建模和纹理贴图的关系就好比人体和皮肤(或着装)的关系,3D建模用来处理空间属性,而贴图适合用来处理细腻的表面属性。如果不使用贴图,而想在表面达到足够的...
WebGL入门教程2 - GPU基本概念和工作流水线(渲染管道)
使用requestAnimationFrame和Canvas给按钮添加绕边动画
要给按钮添加酷炫的绕边动画,可以使用Canvas来实现。基本的思路是创建一个和按钮大小相同的Canvas元素,内置在按钮元素中。然后在Canvas上实现边线环绕的动画。...
SVG过滤器feColorMatrix矩阵变换效果用法详解
在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...
更多...