在 CSS3 出现之前,若想给元素添加模糊、灰度、阴影等视觉效果,往往需要依赖 Photoshop 等图像工具预处理图片,或借助复杂的 JavaScript 库实现。而 CSS3 滤镜(filter) 的诞生,彻底改变了这一现状 ------ 它允许开发者通过简单的 CSS 语法,直接在浏览器中对元素(图片、文字、背景甚至视频)进行实时图形效果处理,极大提升了前端视觉开发的效率与灵活性。
一、滤镜(filter)的核心概念
CSS filter 属性本质是通过浏览器的图形渲染引擎,对元素的像素进行一系列算法处理(如模糊、颜色调整、对比度增强等),最终呈现出特定的视觉效果。其核心特点包括:
- 实时性:效果由浏览器实时计算生成,无需预处理资源;
- 可交互性 :可结合
hover、animation、transition实现动态效果; - 通用性 :支持作用于所有 HTML 元素(
img、div、text、video等); - 可叠加性:多个滤镜效果可通过空格分隔组合使用。
二、常用滤镜函数详解
filter 属性的语法为:filter: 滤镜函数1(参数) 滤镜函数2(参数) ...;,若无需效果可设为 filter: none;。以下是 10 个最常用的滤镜函数,包含语法、参数含义及实际效果说明:
| 滤镜函数 | 语法格式 | 参数含义 | 效果说明 |
|---|---|---|---|
| 模糊(blur) | blur(radius) |
radius:模糊半径,单位为 px/em/rem(默认 0,值越大越模糊) |
模拟高斯模糊效果,常用于背景模糊、毛玻璃效果 |
| 亮度(brightness) | brightness(value) |
value:亮度值,可设百分比(0% 全黑,100% 原图,>100% 更亮)或数值 |
调整元素亮度,0% 时元素完全变黑,数值越大亮度越高 |
| 对比度(contrast) | contrast(value) |
value:对比度值,规则同 brightness(0% 全灰,100% 原图) |
增强或降低元素明暗对比,>100% 时对比更强烈,0% 时元素呈纯灰色 |
| 灰度(grayscale) | grayscale(percentage) |
percentage:灰度占比(0% 原图,100% 全灰度,支持小数如 0.5) |
将元素转为黑白效果,值越大颜色越淡,100% 时完全失去色彩 |
| 褐色(sepia) | sepia(percentage) |
规则同 grayscale(0% 原图,100% 全褐色) |
模拟老照片的黄褐色调,营造复古氛围 |
| 饱和度(saturate) | saturate(value) |
规则同 brightness(0% 无饱和,100% 原图,>100% 超饱和) |
调整元素色彩饱和度,0% 时等同于灰度,>100% 时颜色更鲜艳 |
| 色相旋转(hue-rotate) | hue-rotate(angle) |
angle:色相旋转角度,单位为 deg(0deg 原图,360deg 回到初始色相) |
整体改变元素的色相(如红色转蓝色),不影响亮度和饱和度 |
| 反色(invert) | invert(percentage) |
规则同 grayscale(0% 原图,100% 完全反色) |
反转元素的颜色(如白色变黑、红色变青色),常用于实现 "暗黑模式" 局部效果 |
| 透明度(opacity) | opacity(percentage) |
规则同 grayscale(0% 完全透明,100% 不透明) |
控制元素透明度,与 opacity 属性功能类似,但 filter: opacity() 可被继承 |
| 阴影(drop-shadow) | drop-shadow(x y blur color) |
x:水平偏移,y:垂直偏移,blur:模糊半径,color:阴影颜色 |
给元素添加投影(类似 box-shadow),但支持透明背景元素(box-shadow 不支持) |
基础示例:单个滤镜效果
以下代码展示了 4 个常用滤镜对图片的作用:
html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
img {
width: 300px;
margin: 0 10px;
}
/* 模糊效果 */
.blur {
filter: blur(5px);
}
/* 灰度效果 */
.grayscale {
filter: grayscale(100%);
}
/* 老照片效果(褐色+对比度) */
.sepia {
filter: sepia(80%) contrast(120%);
}
/* 反色效果 */
.invert {
filter: invert(100%);
}
</style>
</head>
<body>
<img src="https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg" alt="原图" />
<img src="https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg" alt="模糊" class="blur" />
<img src="https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg" alt="灰度" class="grayscale" />
<img src="https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg" alt="反色" class="invert" />
</body>
</html>

三、滤镜的进阶用法:组合与动态效果
filter 的强大之处在于 多滤镜组合 和 与交互 / 动画结合,以下是两个高频实战场景:
场景 1:图片 hover 动态效果
通过 transition 实现鼠标悬浮时的滤镜切换,提升交互体验:
html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.card {
width: 300px;
height: 200px;
background: url('https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg') center/cover;
border-radius: 8px;
filter: grayscale(80%) contrast(80%); /* 初始状态 */
transition: all 2s ease; /* 只针对 filter */
will-change: filter; /* 提示浏览器优化 */
}
/* hover 状态:恢复色彩+增强亮度 */
.card:hover {
width: 400px;
height: 266px;
filter: grayscale(0%) contrast(80%) brightness(110%) saturate(120%);
}
</style>
</head>
<body>
<div class="card"></div>
</body>
</html>
效果:卡片默认呈 "褪色" 状态,鼠标悬浮时逐渐恢复鲜艳色彩并提亮,过渡自然。
这是鼠标没有悬浮上去的样子

这是悬浮上去后的样子

场景 2:毛玻璃(背景模糊)效果
结合 blur 和 backdrop-filter(背景滤镜)实现经典的毛玻璃效果(注意:backdrop-filter 作用于元素背后的内容,需配合半透明背景):
html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
/* 背景图 */
.bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('https://pic.sucaibar.com/pic/201306/13/db1d26c115.jpg') center/cover;
z-index: -1;
}
/* 毛玻璃卡片 */
.glass {
width: 500px;
height: 300px;
margin: 50px auto;
padding: 20px;
/* 关键:背景半透明 + 背景模糊 */
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px); /* 模糊背后的背景 */
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body>
<div class="bg"></div>
<div class="glass"></div>
</body>
</html>
效果:卡片背景透出背后的图片,但呈现模糊效果,类似 "磨砂玻璃" 质感。

场景 3:暗黑模式局部反色
通过 invert 滤镜快速实现页面局部的 "暗黑模式",无需单独写两套样式:
css
/* 正常模式 */
.page {
background: #fff;
color: #333;
transition: filter 0.3s ease;
}
/* 暗黑模式(添加 dark 类时) */
.page.dark {
filter: invert(100%) hue-rotate(180deg); /* 反色+修正色相(避免偏色) */
}
/* 图片/视频不反色(避免图片失真) */
.page.dark img, .page.dark video {
filter: invert(100%) hue-rotate(180deg); /* 再反色一次,恢复原图 */
}
原理:invert(100%) 反转页面颜色(白→黑,黑→白),但会导致图片偏色,因此对图片单独再反色一次,恢复正常色彩。
四、浏览器兼容性与注意事项
1. 兼容性
- 主流浏览器 :Chrome、Firefox、Safari、Edge 均完全支持
filter及常用函数; - 特殊情况 :
- IE 浏览器完全不支持
filter; - Safari 15.4 之前版本需添加
-webkit-前缀(如-webkit-filter: blur(5px);)。
- IE 浏览器完全不支持
可通过 caniuse 查看最新兼容性数据。
2. 性能注意事项
blur()、drop-shadow()等涉及像素计算的滤镜,若作用于大面积元素或频繁动画,可能导致性能问题(如卡顿);- 优化建议:
- 尽量减少滤镜作用的元素尺寸;
- 动画时避免使用高模糊半径(如
blur(20px)); - 给元素添加
will-change: filter;,提前告知浏览器准备优化渲染。
3. 与其他属性的区别
filter: opacity()vsopacity属性 :两者功能类似,但filter: opacity()可被 CSS 动画继承,且在某些浏览器中渲染性能更优;filter: drop-shadow()vsbox-shadow属性 :box-shadow只作用于元素的盒模型,而drop-shadow会跟随元素的透明区域(如 PNG 图片的形状)生成阴影,更灵活。
五、总结
CSS3 滤镜(filter)是前端视觉开发的 "瑞士军刀",它无需依赖外部工具,即可实现从简单的模糊、灰度到复杂的动态交互效果,极大简化了视觉开发流程。无论是日常的图片美化、交互反馈,还是进阶的毛玻璃、暗黑模式,filter 都能胜任。
掌握 filter 的关键在于:
- 熟悉各滤镜函数的参数与效果;
- 灵活组合多滤镜实现复杂效果;
- 结合
transition/animation实现动态交互; - 注意兼容性与性能优化。