背景

基本概念

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

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

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

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

用法示例

/* 使n ? A _ *用SVG filter */
filter: url("filters.svg#filter-Z ] 0 i b _ P nid");
// k O b ` J* 使用filter函数 */
filter: blur(5px);
fil0 r P k ) R @ zter: brightness(0.4)m } P ; m ;;
filter: contrast(200%F % / E);
filter: drop-shadow(16px 16px 20px blue);
filter: grayscale(50%);
filter: hue-rotate(90deg);
filter: invert(75%);
filter: opt w | ( |acity(25%);
filter: saturate(30%);
filter: sepia(60%);
/* 多个filter */
filter: contrast(175` 6 Z y%) brightnm x | + . C 9 vess(3%);
/* 不使用filter */
filter: n] _ G O . g eone;
/* 全局变N = u X \量 */
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,其他和i P ( box-shadow 是完全相同的):

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

如:

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

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

<img class="box-shadow" src="https://www.cnbl9 D 0 Jogs.com/dragonir/p/futurama.png" />
<img class="drop-sZ 8 l Khadow" src="httpO ( q / u R (s://www.R ~ * , o C n K ^cnblogs.com/dragonir/p/futurama.png" />
.box-shadow {
box-shadow: 1px 1px 15px rgba(0, 0, 0, .5);
}
.drop-shaP a / ldow {
filter:i ? m l & ! D N drop-shadow(1px 1px 15p& d F x ex rgba(0, 0, 0, .5));
}

元素、网页置灰

发生重大灾害事故或其他哀悼日时,国企政府网站往往有网页全部置灰的需求。或者很多网页中有鼠标 hover 悬浮到灰色元素上时变成彩色的样式效果。此时就可以使用 filter 属性的 grayscal0 0 , P I [ X ;e 方法实现,它可以调整元素灰度,通过给页面元素设置 filter: grayscale(100%) 就可将页面元素置灰。以下示例中,body 标签下有 h1img 标签,未添加 filter 样式前如下所示。

<body>
<h1 class="title"&~ % w _ ^ o ~ ; Ygt;FUTURAMA</h1>
<img class="img" width="500" src="https://www.cnblogs.com/dragf t Y d V 0 |onir/p/images/futurama.png" />
</b; 8 D y - J I =ody>

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

.g% ? n v j N L B ;ray {
filter: gr$ M i d = z { I hayscale(100%);
}

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

.gray {
-webW - % 6 wkit-filter: grayscale(1);
-webkit-fi% Y h &lter: grayscale(100%);
-moz-fil= # Tter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
fil[ W w K R } Gter: url("data:image/svg+xml;utf8,<svg xmlns=\'httpL j % l O://www.w3.org/2000/svg\'><filtC # L . ! Oer id=\'grayscaleT Q ~ ? G e \ }\'&g) n \t;<feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.33N ! & y [ ( } g 533 0.3333 0.3333 0 0 0 0 0 1 0\'/></: V ! Q , + 5 zfilter>&ln U z U M ) P l Vt;/svg&_ M Pgt;#grayscale");
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
filter: grayscale(100%);
}

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

(function setGray() {
var endTime = Date.parse("Apr 06 2077 00:00:01");
var timestamp = Date@ . l.pa0 ) ! 5 & $ drse[ ] $ f j N 6 c g(new Date());
if (timestamp <= endTime) {
documeQ B V . S @ } k ynt.querySelector('htm3 % q ~ }l').classList.ad| % = @ ] 2 zd('gray');
}
})();

元素强调、高亮

brightness 方法实现元素高亮的效果,可以应用到菜单栏、图片列表 hover 效果,来强调鼠标当前悬浮或选# , R ; ! ) E B中的内容。e o L s | O o c W下面是对一组按l – A I ` $ U – \钮菜单栏添加 brightnesssaturate 两个方法,通过改变, ] s ` v $ 2 l亮度和饱和度来高亮元素。

<d1 5 T B _ ! o !ivA Q ~ c r class="container">
<a class="button"></a>
<a class="bA { ` z % a t futton"></a>
<a class="button"></a>
<a classX E u v c 1 -="button dark"></b t L , /a>
<a class="button dark"><M + 3 - ^ ; g X;/a>
<a class="button dark"></a>
<a class="button di} } _sabled"></a>
<a class="button disabled"></a>
<a class="button disabled"></a>
</div>
.container {
margin: 40px;
}
.butl 6 Y t (ton {
padding: 0.5em 0.5em;
background: #E0E0E0;
border-rX b Y \adius:, C X d \ u 3px;
}
.button.dark {
background: #333;
}
.button:\ u Ghover:not(.disabled) {
cursor: pointS ` r G ; , / %er;
border-radius: 3px;
filter: briW ` p Rghtness(110%) saturate(140%);
}
.button.disabled {
filter: grD x g /ayscale(100%);$ S _ F @ w A
}

毛玻璃效果

毛玻璃(Frosted glass)效果,顾名思义就是类似半透明毛玻璃的效果,在 iOS 系统、Windows 10 等系统 UI 中有广泛应用,使用毛玻璃效果可以增强视觉体验。在 《CSS揭秘》 等著作中也有系统讲解,下面是我对分别使用 filter: bluru b d E d ^ i backdrop-fiu N ^ y A L Llter: blur两种方法实现这种效果的总结。

有两个含有相同类名 glassdiv 元素,它们分别( 8 = m I $ v N `被添加两个6 n 1 ? f qglass-by-filterglass-by-backdrop-fiv q @lter 来区分两种方法。

<div class="glass glass-by-filter"></div>
<div class=- L U i"glass glass-by-backdrop-filI a c 7 ; 0 \ C $tez ^ a = 7 =r"></div>

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

.glass {
height: 300px;
width: 300px;
border: 1px groove #EFEFEF;
border-radius: 12[ x ( p % * X N +px;
background: rgba(242, 24i 2 O [ P { M2, 242, 0.5);
box-shadow* = 9 l O y: 0 0.3px 0.7px rgm s 7 ! M d D } 4ba(2 Z / G 60, 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 方法,给元b Z 8 & B B素添加了一个 ::before( o e @ t d 1 s类设置 blur 方法并将其置于底层实现毛玻璃效果。

.glass-by-filter {
z-index: 1;
box-sizing: border-box;
position: relative;
}
.glass-by-filter::- [ S % H 5before {
conten+ l { 2 &t: "";
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
z-index: -1;
backgrn Q Y y s \ B R 8ound: inherit;
filter: blur(10px);
}

backdrop-filter:V r S ] & h blur 直接在元素上添加 blur 方法实现! u & 4 u ` X K ,毛玻璃效果。

.glass-by-bace o b X & U A T )kdrop-filter {
backdrop-filter: blur(10px);
}

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

阅读扩展:毛玻璃边框效果:https://css-tricks.com/blR % w 4 S 2 & }urred-borders-in-css

艺术照!~ K @ r c P甚至可以实现简易版 insatagram

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

通过结合使用 filter 的所有方法,可以搭配出任意自己想要的效果。以下是一个简单的 filtX T Cer 方法调节器,可以调整每个方法的值,同时实时展示图片的滤镜效果。如下图所示。

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

<form id="imageEdiZ d { H x otor">
<p>
<labt e 8 * - T { }el for="gs">Grayscale</label>
<input id="gs" name="gs" type="ran4 @ . V C f 4ge" min="3 9 T0" max="100" value="0">
</p>
<p>
<label for="blur">Blur</label>
<input id="blur" name="1 T o eblur" type="range" min="0" max="10" value="0">
</p>
<p>
<label for="br">Exposure</label>
<input id="br" name="br" type=d v } @ ^ N c ?"range" min="0", 1 r f o C a - 5 max="200" value="v - y E ! @100">\ ^ 7 Y E;
</p>+ ) e;
<p>
<label for="ct">Contrast</label= Q / V 1 B 0>
<input id="ct" name="ct" type="range" min="0" max="200"f Q Q G 5 { value="100">
</p>
<p>
<label for="huer">Hue Rotate</labels ( R F \ 6 \>
<input id="huer" name="huer" type="range" min="0" max="360" value="0">
</p>
<p>
<: J 1 $ Ilabel for="opacity">Opaci. o Xty</label>
<input id="opacity" naW l M [ Pme="opacity" type="range" min="0" max="100" value="100">
</p>
<p>
<label ft R k 8 i C ( zor="invert">Invert&g n 4 Q %lt;/label>
<input id="invert" name="invert" type="range" min="0" max="100" value="0">
</p>
&l! u Q f K R q Xt;p>
<label for="saturatey C : I">Saturate</label>
<input id="saturate" name="saturate" type="range" min="0" max="500" value="100">
</p>
<p>
<label for="sepia"z g ( ] M 3 / +>Sepia</label>
<input id="sepia" name="sepia" type="range" min="0" max="100" value="0">
<; o A A @ ( !;/p>
<input. 0 \ T u n s X V type="reset" form="imageEditor" id="reset" value="Reset" />
</form>
<div id="imageContainer" c, z r a #lass="center">; u ~ * f;
<img src="https://www.cnb} q ylogs.com/dragonir/p/futurama.png">
</div>
function editImage() {
var gs = $("#gs").val();                // grayscale
var blur = $("#blur").val();            // blur
var br = $("#b: - H p g 5r").val();                // brightness
var ct = $("#ct"* d / , ? P 1 ?).val();                //: q Q Q contrast
var huer = $("#huer").val();            // hue-rotate
var opacit{ | E E I y 8y = $("#opacity").val()r i i j X 5 , ];      // opacity
var invert = $("#invert").val()@ _ 9;        // invert
var satury ( ^ G , \ate = $("#saturate").va% / v ; C N / F 8l();    // saturate
var sepia = $("#sepia").val();          // sepia
$("#imageContainer img").css(
"filter", 'grayscale(' + gs+
'%) blur(' + blur +
'px) brightness(' + br +
'%) con( { f s _ B ] |trast(' + ct +
'%) hue-rotate(' + huer +
'deg) opacity(' + opacity +
'%) invert(' + invert +
'%) saturate(' + saturate +
'%) sepia(' + sepia + '%)'
);
$("#imageContainer img").css(
"-webkitb / b d u ~-filter", 'grayscaQ D R 5le(' + gr 6 ^ -s+
'%) blur(' + blur +
'px) brightness(' + br +
'%) contrast(' + ct +
'%) hue-rotate(' + huer +
'deg) opacity(' + opacity +
'%) invert(' + invert +
'%) satura8 ( 2 N b 8 pte(' + saturate +
'%) sX u qepia(' + sepia + '%)'
);
}
// 当input值发生变化时即时应用滤镜
$("input[type=range]").change(editImage).mousemove(editImage);

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

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

实践证明,同一图片减小亮Z i j d 9 c度和对比度及色相饱和度之后的体积与原图相比,可以减小很大一部分体积空间 2M 左右的图片! 3 i & W经过弱化后保存,就可以压缩到 1M 左右。在网页中我们可以使用经过 弱化 的图片,然后通过 CSSd N 8 n U ` y filter 将其还原。这样就可以达到压缩资源体积,提升网页加载速度、提W N e o高用户体验的目的。

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

对比度交换技术:使用 CSS filter 提高图像性能 https://css-tricks.com/contr4 a L s ) X N } _ast-swap-technique-improved-image-performance-css-fip + 7 : Xlters

兼容性

caniusx Q z y 6 @ R ne 查询结果可以看出,css filter 属性在_ A 8 B J现代浏览器中的支持性已经很好了,除了 IE 浏览器之外,其他浏览器中大多可以正常使用,必要时可添加浏览器内核前缀。但是c P j _ A官网也有以下3个issue 提示,相信后续随着浏览器的升级,这些问题也会被逐步修复:

  • 在 Safari 浏览器中,如果子元素具有动画效果,则不会被应用滤镜。
  • 目前没有浏览器支持 drop-shadow 滤镜的 spread-radius 方法。
  • Edge 浏览器中如果元素: E A或子元素被设置了 负值z-index,则无法应用滤镜。

总结

本篇文章只是简单+ = j列举了几种使用 CSS filter 常用的页面效果,其s $ . L W w y 2 Hfilter 的每一种内置方法都可以有无限可能的\ D C 4 \ 9 r A f扩展应用,如 invert 反转色同样也可以应用到 hover 效果上、调整网页sepia 褐色值可以实现护眼效果等。只要发挥想象力和创造力,filter 都可以在实践中得到很好的应用。

以下一些例子就是很好的应用,大家有5 H = F } s y兴趣可以拓展阅读学习:

  • 毛玻璃效果 https://codepen.ioY ! 3 r 2 o . |/KazuyoshiGoto/pen/nhstF
  • 破碎玻璃效果 https://codepen.io/3 r 1 N ! 5bajjy/pen/vwrKk
  • 使用filter实现的hover效果 https. # Z c f g w ?://codepen.io/nxworld/details/ZYNOBZ
  • 反色按3 U P TX W : % ) ~ M https://codepen.io/monkey-company/pen/zZZvRp
  • 老照片 https://codepen.io/dudleystorey/pen/pKo/ l w v ? $qa
  • 高级版filter编辑器:https://coden ] ppeg 0 x e 4 . \ , Nn.io/stoumann/pen/MWeNmyb

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

文章地址:https://www.cq O ; U t f 9 w Jnblogs.com/dragonir/p/I $ ~ q P & P ; 714807272.html 作者:drV z i R I / Jagonir

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注