CSS 滤镜与混合模式

系统掌握 CSS 滤镜的十种效果、混合模式的原理与应用、isolation 的层叠隔离作用,以及滤镜和混合模式在现代 UI 开发中的实际场景。

CSS 滤镜与混合模式

滤镜和混合模式是 UI 视觉效果的支柱

在现代 Web UI 开发中,磨砂玻璃效果、暗黑主题的图片处理、渐变叠加、阴影效果——这些都离不开 CSS 滤镜和混合模式。CSS 滤镜提供了一套强大的图像处理能力,而混合模式则定义了元素叠加时的颜色计算规则。

理解这两个机制不仅是为了视觉效果,更是为了理解 CSS 在图形处理方面的能力边界。

面试定位:滤镜和混合模式虽然不是面试高频考点,但它们涉及的颜色理论、图层概念和性能注意事项,体现了前端工程师对视觉渲染的深层理解。


CSS 滤镜详解

filter 的十种效果函数

.filter-demo {
  /* 1. blur — 高斯模糊 */
  filter: blur(5px);

  /* 2. brightness — 亮度调整 */
  filter: brightness(1.2);    /* 120% */
  filter: brightness(0.5);     /* 50% 变暗 */

  /* 3. contrast — 对比度调整 */
  filter: contrast(150%);      /* 增加对比 */
  filter: contrast(0.8);        /* 降低对比 */

  /* 4. grayscale — 灰度转换 */
  filter: grayscale(100%);      /* 完全灰度 */
  filter: grayscale(0.5);      /* 50% 灰度 */

  /* 5. sepia — 棕褐色调(复古照片) */
  filter: sepia(80%);
  filter: sepia(1);            /* 完全 sepia */

  /* 6. hue-rotate — 色相旋转 */
  filter: hue-rotate(90deg);    /* 旋转 90 度 */
  filter: hue-rotate(180deg);   /* 色相反转(类似 invert) */
  filter: hue-rotate(270deg);   /* -90 度 */

  /* 7. invert — 反相 */
  filter: invert(100%);         /* 完全反相 */
  filter: invert(0.5);         /* 50% 反相 */

  /* 8. opacity — 透明度(与 CSS opacity 不同,滤镜版本可被硬件加速) */
  filter: opacity(0.8);

  /* 9. saturate — 饱和度 */
  filter: saturate(200%);       /* 过度饱和 */
  filter: saturate(0);          /* 完全去饱和(类似 grayscale) */

  /* 10. drop-shadow — 投影(与 box-shadow 不同,能沿图像 alpha 通道) */
  filter: drop-shadow(2px 4px 6px rgba(0, 0, 0, 0.3));
}

滤镜的组合使用

.combined {
  /* 多个滤镜可以组合,用空格分隔 */
  filter: blur(2px) brightness(1.1) contrast(1.2);

  /* 注意:顺序会影响结果 */
  filter: grayscale(100%) brightness(1.2);  /* 先灰度再提亮 */
  filter: brightness(1.2) grayscale(100%);  /* 先提亮再灰度 */
}

drop-shadow vs box-shadow

.comparison {
  padding: 20px;
}

/* box-shadow:沿 border-box 投影 */
.box-shadow {
  box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.3);
}

/* drop-shadow:沿图像 alpha 通道投影 */
.drop-shadow {
  filter: drop-shadow(4px 4px 8px rgba(0, 0, 0, 0.3));
}

关键区别:对于 PNG 图标或有透明度的元素,box-shadow 只会在元素边界投影,而 drop-shadow 会沿图像的实际形状投影。


混合模式(Blend Modes)

mix-blend-mode

mix-blend-mode 定义元素内容与背景的混合方式:

.blend {
  mix-blend-mode: normal;         /* 默认:正常叠加 */
  mix-blend-mode: multiply;       /* 正片叠底 */
  mix-blend-mode: screen;         /* 滤色 */
  mix-blend-mode: overlay;        /* 叠加 */
  mix-blend-mode: darken;         /* 变暗 */
  mix-blend-mode: lighten;        /* 变亮 */
  mix-blend-mode: color-dodge;    /* 颜色减淡 */
  mix-blend-mode: color-burn;     /* 颜色加深 */
  mix-blend-mode: hard-light;     /* 强光 */
  mix-blend-mode: soft-light;     /* 柔光 */
  mix-blend-mode: difference;     /* 差值 */
  mix-blend-mode: exclusion;      /* 排除 */
  mix-blend-mode: hue;            /* 色相 */
  mix-blend-mode: saturation;     /* 饱和度 */
  mix-blend-mode: color;          /* 颜色 */
  mix-blend-mode: luminosity;     /* 亮度 */
}

常用混合模式的应用

/* 1. 文字覆盖在图片上(文字反白效果) */
.text-on-image {
  position: relative;
}

.text-on-image::after {
  content: attr(data-text);
  position: absolute;
  inset: 0;
  background: black;
  color: white;
  mix-blend-mode: difference; /* 文字自动反白 */
}

/* 2. 双色调图片效果 */
.duotone {
  position: relative;
}

.duotone::before {
  content: "";
  position: absolute;
  inset: 0;
  background: #00ff00; /* 替换为高光色 */
  mix-blend-mode: multiply;
}

/* 3. 磨砂玻璃效果 */
.frosted-glass {
  background: rgba(255, 255, 255, 0.1);
  backdrop-filter: blur(10px);
  border: 1px solid rgba(255, 255, 255, 0.2);
}

background-blend-mode

针对多背景图像的混合模式:

.multi-bg {
  background-image:
    url(texture.png),
    linear-gradient(45deg, #ff0000, #0000ff);
  background-blend-mode: overlay; /* 两层背景混合 */
}

isolation 层叠隔离

isolation 的作用

isolation 强制创建一个新的层叠上下文,阻止混合模式向外部传播:

.isolate {
  isolation: isolate; /* 创建新的层叠上下文 */
  /* 相当于 isolation: isolate 的元素会成为混合的边界 */
}

实际应用:避免混合模式污染

/* 问题:.blended 的混合模式会影响外部 */
.page {
  background: url(pattern.png);
}

.blended {
  background: red;
  mix-blend-mode: multiply;
}

/* 解决方案:隔离混合上下文 */
.isolated-container {
  isolation: isolate;
}

.isolated-container .blended {
  background: red;
  mix-blend-mode: multiply;
  /* 混合只在这个容器内部发生 */
}

backdrop-filter 背景滤镜

磨砂玻璃效果

.glass {
  backdrop-filter: blur(10px);                    /* 模糊 */
  backdrop-filter: saturate(180%) blur(10px);    /* 模糊+饱和 */
  backdrop-filter: brightness(0.8) contrast(120%); /* 调色 */
  -webkit-backdrop-filter: blur(10px);            /* Safari 需要前缀 */
}

注意事项

/* backdrop-filter 的性能考量 */

/* 好:少量使用 */
.good-glass {
  backdrop-filter: blur(10px);
}

/* 坏:大量使用或动画 */
.bad {
  animation: glass-shimmer {
    backdrop-filter: blur(10px); /* 性能问题 */
  }
}

/* 更好的做法:使用 will-change */
.optimized {
  backdrop-filter: blur(10px);
  will-change: backdrop-filter;
}

实战:常见视觉效果

1. 图片灰度 + hover 彩色

.image {
  filter: grayscale(100%);
  transition: filter 0.3s ease;
}

.image:hover {
  filter: grayscale(0%);
}

2. 文字描边效果

.outline-text {
  color: transparent;
  -webkit-text-stroke: 1px white;
  text-stroke: 1px white;
}

3. 复古照片效果

.vintage {
  filter: sepia(40%) contrast(110%) brightness(90%) saturate(85%);
}

4. 霓虹发光效果

.neon {
  color: black;
  text-shadow:
    0 0 5px white,
    0 0 10px cyan,
    0 0 20px cyan,
    0 0 40px cyan;
}

面试高频问题

Q: filter 和 opacity 有什么区别?

回答要点opacity 改变整个元素的透明度,包括背景和边框;filter: opacity() 作用于元素的内容(可能包含子元素)。更重要的是,filter 版本可以利用浏览器的硬件加速,在某些场景下性能更好。但两者在视觉效果上基本一致。

Q: mix-blend-mode 和 background-blend-mode 有什么区别?

回答要点mix-blend-mode 作用于元素内容与整个背景的混合;background-blend-mode 只作用于元素的多层背景图像之间的混合。简单说:mix-blend-mode 是元素与外部的混合,background-blend-mode 是背景图像之间的混合。

Q: isolation: isolate 解决了什么问题?

回答要点isolation: isolate 强制创建一个新的层叠上下文,阻止混合模式向外部传播。这在需要限制混合模式作用范围时非常有用,比如在一个有混合背景的页面上,某些组件不想被背景的混合模式影响。


延展阅读