ToolPal
代表 CSS 滤镜变换的彩色光线和视觉效果

CSS filter 完全指南:blur、grayscale、hue-rotate 实战用法

📷 Denys Nevozhai / Pexels

CSS filter 完全指南:blur、grayscale、hue-rotate 实战用法

CSS filter 属性无需图像编辑器,即可用纯 CSS 实现模糊、灰度、亮度调整和色相旋转等效果。了解各个滤镜的实际应用场景和性能注意事项。

2026年4月15日3分钟阅读

CSS filter 属性是很多开发者偶然发现后觉得"挺有意思",然后就忘掉的属性之一。直到在图像编辑软件里花了一小时后才意识到,CSS 几行代码就能搞定。

filter 属性可以将 blur、grayscale、brightness、contrast、sepia、hue-rotate 等图形效果直接用 CSS 应用,无需修改图像文件或使用 Canvas API。它适用于所有 HTML 元素,多个效果可以叠加组合,也很容易用 transition 做动画。

使用 CSS Filter Generator 可以用滑块实时调整各个值,查看预览效果后直接复制 CSS。

filter 属性的工作原理

从技术上讲,CSS filter 将 SVG 滤镜效果应用于元素的渲染输出,但你不需要直接接触 SVG。多个滤镜用空格分隔,从左到右依次应用:

img {
  filter: grayscale(1) brightness(1.1);
}

需要注意的是,filter 会作用于元素及其所有子元素。如果对一个卡片设置 filter: blur(4px),卡片内的文字也会模糊。如果只想模糊背景图片,需要另外的方法。

各滤镜与实际应用场景

blur()

视觉效果最明显的滤镜,以像素为单位应用高斯模糊。

.background-image {
  filter: blur(8px);
}

应用场景:背景图片模糊处理。 让 hero 区背景模糊,同时保持内容清晰:

.hero-bg {
  position: absolute;
  inset: 0;
  background-image: url('/hero.jpg');
  background-size: cover;
  filter: blur(6px);
  transform: scale(1.05); /* 防止模糊边缘露出 */
  z-index: 0;
}

scale(1.05) 的技巧可以防止模糊处理后的边缘在画面中显示出来。

grayscale()

将元素颜色转换为灰度。1 为完全灰度,0 为原始颜色。

应用场景:禁用状态的视觉表达。 与不透明度结合使用,更清晰地传达不可用状态:

.product-card.disabled img {
  filter: grayscale(1);
  opacity: 0.7;
}

应用场景:hover 时显示彩色。 默认灰度,hover 时切换为彩色,在作品集和团队介绍页面中常见:

.team-photo {
  filter: grayscale(1);
  transition: filter 0.4s ease;
}

.team-photo:hover {
  filter: grayscale(0);
}

brightness() 和 contrast()

brightness() 调整亮度,1 为原始值,小于 1 变暗,大于 1 变亮。contrast() 调整对比度。

两者结合可以大幅改变图像氛围:

/* 强烈的冲击感 */
.editorial-image {
  filter: brightness(1.05) contrast(1.4);
}

/* 柔和复古感 */
.vintage-image {
  filter: brightness(1.1) contrast(0.85) sepia(0.3);
}

应用场景:按钮交互反馈。

.cta-button {
  transition: filter 0.15s ease;
}

.cta-button:hover {
  filter: brightness(1.1);
}

.cta-button:active {
  filter: brightness(0.9);
}

sepia()

为所有颜色添加温暖的棕黄色调,营造老照片的感觉。

.retro-photo {
  filter: sepia(0.8) brightness(1.05) contrast(0.9);
}

完全在 CSS 中处理,无需为不同主题准备单独的图像文件。

hue-rotate()

将所有颜色的色相旋转指定角度,保持饱和度和亮度不变。

应用场景:用单张图像实现多种主题。

.theme-blue .logo-icon { filter: hue-rotate(0deg); }
.theme-purple .logo-icon { filter: hue-rotate(60deg); }
.theme-green .logo-icon { filter: hue-rotate(120deg); }

应用场景:彩虹动画效果。

@keyframes rainbow {
  from { filter: hue-rotate(0deg); }
  to { filter: hue-rotate(360deg); }
}

.rainbow-element {
  animation: rainbow 4s linear infinite;
}

drop-shadow()

沿元素实际形状应用阴影。与 box-shadow 的关键区别在于,它能正确处理透明 PNG 和 SVG 等非矩形形状。

img {
  filter: drop-shadow(4px 4px 8px rgba(0, 0, 0, 0.4));
}

对透明背景的 PNG 使用 box-shadow 会产生矩形阴影,drop-shadow() 可以解决这个问题。

invert()

反转所有颜色。深色模式图标适配非常实用:

@media (prefers-color-scheme: dark) {
  .icon {
    filter: invert(1);
  }
}

对单色图标是一种可靠的方法。

filter 与 backdrop-filter 的区别

这两个属性容易混淆:

  • filter:对元素本身及其内容应用效果。
  • backdrop-filter:对元素背后的区域应用效果,元素本身正常渲染。
/* 磨砂玻璃面板 */
.glass-panel {
  background: rgba(255, 255, 255, 0.2);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px); /* Safari */
}

截至 2026 年初,Safari 仍然需要 -webkit-backdrop-filter 前缀,请务必同时写上。

filter 动画

滤镜支持 transition 和 animation 动画,运用得当可以创造出令人满意的微交互效果:

/* 彩色 reveal 效果 */
.portfolio-item img {
  filter: grayscale(1) brightness(0.9);
  transition: filter 0.4s ease;
}

.portfolio-item:hover img {
  filter: grayscale(0) brightness(1);
}

/* blur-in 入场效果 */
@keyframes blurIn {
  from {
    filter: blur(12px);
    opacity: 0;
  }
  to {
    filter: blur(0px);
    opacity: 1;
  }
}

.hero-content {
  animation: blurIn 0.8s ease-out forwards;
}

性能注意事项

CSS filter 使用 GPU 加速,但有以下注意点:

  • blur() 成本最高。模糊半径越大、元素越大,开销越高。
  • 对大型元素做 filter 动画可能在中端移动设备上导致掉帧。
  • 滤镜组合会叠加成本。链中每个滤镜都会依次处理。
  • will-change: filter 仅在必要时使用,它会消耗 GPU 内存。

总结

CSS filter 因为看起来像图像编辑功能,往往不被当作样式工具。但将其视为样式基本单元后,应用场景就会大大扩展。

灰度处理的禁用状态、沿形状的 drop-shadow、用于主题切换的 hue-rotate、磨砂玻璃的 backdrop-filter——这些都是现代 CSS 中切实可用的技巧。

使用 CSS Filter Generator,可以直观地看到各滤镜对实际图像的效果,快速找到合适的参数组合。

常见问题

分享文章

XLinkedIn

相关文章