背景
基本概念
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 class="box-shadow" src="futurama.png" />
<img class="drop-shadow" 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 class="title">FUTURAMA</h1>
<img class="img" width="500" src="./images/futurama.png" />
</body>
现在我们给 body
元素添加一个 .gray
类,<body class="gray">
就可实现整个网页置灰效果。
.gray {
filter: grayscale(100%);
}
为了兼容 IE8
等其他低版本浏览器,我们可以加上浏览器前缀和 svg
滤镜。