一文讲透 backdrop-filter:毛玻璃与背景滤镜的终极方案
backdrop-filter 是 css 中一个强大的视觉效果属性,它与 filter 属性类似,但作用对象不同。backdrop-filter 用于 对元素背后的区域(即“背景幕布”)应用图形效果(如模糊、颜色偏移) ,而元素本身及其内容不受影响。
“背景幕布”是什么?
它是指被当前元素 所覆盖住 的那部分页面区域(包括背景图片、颜色、以及在该元素之下的其他元素)。
你可以把它想象成在元素后面拉起的一块“幕布”,然后在这块“幕布”上做滤镜处理。
最终视觉效果是:你透过一个“滤镜玻璃”(当前元素)去看它后面的东西。如下图所示:
工作原理详解:
背景层:这是网页的底层,包含各种背景元素和内容。
背景幕布:当元素设置了 backdrop-filter 时,浏览器会创建其背后区域的"快照",这个快照就是"背景幕布"。
滤镜应用:CSS 滤镜(模糊、亮度调整等)被应用到这块"背景幕布"上,而不是元素本身。
合成显示:经过滤镜处理的背景幕布与前景元素合成,最终呈现给用户。
关键点:前景元素(文本、边框、图标等)完全不受滤镜影响,保持原始清晰度。
一、基本语法
backdrop-filter: <filter-function> [<filter-function>]*;与 filter 属性一样,可以同时应用多个滤镜函数,用空格分隔。
二、常用滤镜函数
backdrop-filter 几乎支持所有与 filter 属性相同的滤镜函数:
函数名 | 作用 | 参数说明 |
blur() | 模糊效果 | 长度值(如5px),值越大越模糊 |
brightness() | 亮度调整 | 数字或百分比(0% 全黑,100% 原图,>100% 更亮) |
contrast() | 对比度调整 | 数字或百分比(0% 全灰,100% 原图,>100% 更高对比度) |
grayscale() | 灰度转换 | 数字或百分比(0% 原图,100% 全灰) |
hue-rotate() | 色相旋转 | 角度值(如 90deg),360deg 为一圈 |
invert() | 颜色反转 | 数字或百分比(0% 原图,100% 完全反转) |
opacity() | 透明度调整 | 数字或百分比(0% 完全透明,100% 完全不透明) |
saturate() | 饱和度调整 | 数字或百分比(0% 无色彩,100% 原图,>100% 更高饱和度) |
sepia() | 褐色调(复古效果) | 数字或百分比(0% 原图,100% 完全褐色) |
url() | 引用SVG滤镜 | svg路径 |
注意:backdrop-filter属性不包含drop-shadow()函数。
以下从参数解析、应用场景到使用示例,逐一细致阐述各滤镜函数的特性与用法:
2.1 blur() - 模糊 (最常用)
backdrop-filter: blur(5px);对背景进行高斯模糊,创建经典的“毛玻璃”效果。
2.2 brightness() - 亮度
backdrop-filter: brightness(0.8);让背景变暗(<1)或变亮(>1)。常用于使背景变暗以突出前景内容。
2.3 contrast() - 对比度
backdrop-filter: contrast(1.5);调整背景的对比度。
2.4 grayscale() - 灰度
backdrop-filter: grayscale(1);将背景变为完全黑白(1)或部分黑白(0到1之间)。
2.5 sepia() - 褐色滤镜
backdrop-filter: sepia(1);为背景添加褐色(复古)滤镜。
2.6 saturate() - 饱和度
backdrop-filter: saturate(2);增加背景颜色的饱和度。
2.7 hue-rotate() - 色相旋转
backdrop-filter: hue-rotate(90deg);旋转背景的色相环,产生色彩变化。
2.8 invert() - 反色
backdrop-filter: invert(1);反转背景颜色。
2.9 opacity() - 透明度
backdrop-filter: opacity(0.5);降低背景的不透明度。通常更推荐用 rgba 背景色或 brightness 来间接实现类似效果。
注意:标准已弃用,部分浏览器可能不支持。
2.10 组合使用
backdrop-filter: blur(6px) brightness(0.8) saturate(1.2);同时应用模糊、变暗和增加饱和度,效果通常比单一滤镜更自然。
三、关键特性与使用要点
3.1 需要元素(部分)透明
如果元素背景是完全不透明的(如:background: white;),你将看不到 backdrop-filter 的效果,因为“幕布”被完全挡住了。通常需要:
.element {
background-color: rgba(255, 255, 255, 0.3); /* 半透明背景 */
backdrop-filter: blur(10px);
}3.2 性能考量
backdrop-filter 是 硬件加速 的,性能通常不错。
但过度使用(尤其是大面积、高强度的 blur )或在低性能设备上,仍可能导致 滚动或动画卡顿。务必在实际设备上测试。
3.3 边界与堆叠上下文
效果会收束于元素的 border-box 边界(包括 border-radius 定义的圆角)。
应用 backdrop-filter 的元素会创建一个 新的堆叠上下文 (就像 opacity 小于1、transform 等属性一样)。
3.4 -webkit- 前缀
虽然现代浏览器已普遍支持,但为了最佳兼容性(尤其是 Safari),通常仍需同时使用带前缀的版本:
.element {
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}四、经典应用场景
4.1 毛玻璃效果(Frosted Glass)
这是最经典的应用,模仿 iOS 和 macOS 的模糊透明效果。
示例:
.frosted-glass {
background-color: rgba(255, 255, 255, 0.15);
-webkit-backdrop-filter: blur(10px) saturate(1.3);
backdrop-filter: blur(10px) saturate(1.3);
border: 1px solid rgba(255, 255, 255, 0.2);
}4.2 模态框/对话框背景
打开对话框时,让背后的页面内容模糊或变暗,引导用户聚焦于对话框。
示例:
.dialog-backdrop {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background-color: rgba(0, 0, 0, 0.2); /* 轻微遮罩 */
-webkit-backdrop-filter: blur(3px) brightness(0.9);
backdrop-filter: blur(3px) brightness(0.9);
}4.3 悬浮导航栏或标题栏
当页面滚动时,让导航栏背景模糊,与内容产生层次感。
示例:
.sticky-header {
position: sticky;
top: 0;
background-color: rgba(255, 255, 255, 0.8);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
}4.4 高亮卡片或工具提示
突出显示重要内容,同时保持与背景的视觉链接。适合用于特色内容、数据统计或行动号召。
示例:
.highlight-card {
background-color: rgba(255, 255, 255, 0.6);
-webkit-backdrop-filter: blur(20px) contrast(1.1);
backdrop-filter: blur(20px) contrast(1.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}4.5 图像预览或滤镜切换器
为图像上方的控制面板添加效果,使其可读又不完全遮挡图片。
示例:
.image-controls {
background-color: rgba(0, 0, 0, 0.4);
-webkit-backdrop-filter: blur(4px) grayscale(0.5);
backdrop-filter: blur(4px) grayscale(0.5);
color: white;
}五、浏览器兼容性与回退方案
兼容性:所有现代浏览器(Chrome, Firefox, Edge, Safari)都已支持。详细数据可查看 [Can I use:css-backdrop-filter ]。
回退方案:对于不支持的老旧浏览器,最重要的是确保 内容的可读性 。通常的做法是先设置一个纯色或半透明的备用背景。
.element {
/* 备用样式:不支持 backdrop-filter 的浏览器会使用这个 */
background-color: rgba(255, 255, 255, 0.9);
/* 支持 backdrop-filter 的浏览器会叠加此效果 */
@supports ((-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px))) {
background-color: rgba(255, 255, 255, 0.6);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
}总结
backdrop-filter 是一个强大的 CSS 属性,它通过简单的代码即可创建出极具现代感和层次感的视觉界面。其核心在于 操作元素背后的“背景幕布”,与 filter 形成互补。要掌握它,关键在于:
理解其作用对象:是背景,不是元素自身。
配合透明度使用:确保背景可见。
善用滤镜组合:blur() + brightness() / saturate() 能让效果更自然。
注意性能与兼容性:谨慎使用高强度模糊,并始终提供优雅降级方案。
掌握了它,你就能轻松实现过去需要复杂图片处理或额外html元素才能完成的视觉效果。
来源:https://mp.weixin.qq.com/s/WhGO_OIbNI4wZvuS8bLEJA
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!