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元素才能完成的视觉效果。

彩蛋

本文在Cnb平台上全面展示了CSS backdroop-filter 的示例代码,欢迎访问《CSS backdrop-filter 完整演示》以获取更多详细内容。