Menu

CSS 模糊和滤镜:blur()、grayscale、brightness

filter: blur(5px) 让元素变模糊,backdrop-filter: blur() 让元素背后的内容变模糊。通过实时滑块学习所有滤镜函数(brightness、contrast、grayscale、sepia、saturate、hue-rotate、invert、drop-shadow)、如何组合使用,以及模糊边缘的问题。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

让元素变模糊

filter: blur() 接收一个长度,即模糊半径。值越大,元素越模糊:

filter 可以用在任何元素上,不只是图片:模糊一个 div,它的文字、边框和子元素也会一起变模糊。注意模糊图片的边缘会变得柔和:模糊会把画面向外扩散,并混入周围的透明区域。解决方法在下面的“模糊边缘的问题”中。

让背景变模糊:backdrop-filter

要让元素背后的内容变模糊(比如盖在照片或页面上的毛玻璃面板),使用 backdrop-filter。元素自身的内容保持清晰。它需要一个半透明的背景才能显示出模糊效果:

面板周围的条纹和圆形是清晰的,面板背后的则变模糊了,而面板里的文字不受影响。要保证文字清晰易读:在内容复杂的图片上,背景色带一点偏浅或偏深的色调会有帮助。

所有滤镜函数,实时演示

拖动任意滑块。图片下面那一行就是准确的 filter 值,可以直接复制:

只有被你调离中性值的函数才会写出来,这样值会保持简短。brightness(1) 或 blur(0px) 什么都不会改变,所以没有必要列出来。

滤镜函数

函数中性值作用示例
blur(r)0半径为 r 的高斯模糊blur(4px)
brightness(n)1小于 1 变暗,大于 1 变亮brightness(0.7)
contrast(n)1小于 1 变平淡,大于 1 更鲜明contrast(1.3)
grayscale(n)01(或 100%)为完全灰度grayscale(100%)
sepia(n)0温暖的棕褐色调sepia(0.6)
saturate(n)10 为灰色,大于 1 更鲜艳saturate(1.5)
hue-rotate(a)0deg让每种色相沿色轮旋转hue-rotate(90deg)
invert(n)01 为完全的颜色反相invert(1)
opacity(n)1类似 opacity 属性opacity(0.5)
drop-shadow(x y blur color)沿形状投下的阴影drop-shadow(2px 4px 6px rgb(0 0 0 / 0.3))

数字也可以写成百分比(grayscale(100%) 等于 grayscale(1))。多个函数可以写在同一个值里,用空格分隔,并按顺序应用:filter: grayscale(1) sepia(1) 得到棕色调,而 sepia(1) grayscale(1) 最终只是普通的灰色。

drop-shadow 沿着形状

box-shadow 永远是矩形(最多带圆角)。drop-shadow() 根据可见的像素绘制,所以透明图标的阴影会带着图标的轮廓:

第一颗星从它不可见的边界框投下了一个方形阴影。第二颗星投下的是星形阴影。和 box-shadow 不同,drop-shadow() 没有扩展值,也没有 inset;这些内容见 box-shadow 页面。

模糊边缘的问题

模糊后的图片在边缘会逐渐淡出,因为模糊会把周围的透明像素拉进来。要保留清晰的边缘(例如做模糊的首屏背景时),把图片放进带 overflow: hidden 的容器中,并把图片稍微放大,这样柔和的边缘就被裁掉了:

.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }

用 filter 做悬停效果

filter 可以做过渡动画,所以一面从灰色变彩色的 logo 墙,或者一张悬停前保持暗淡的卡片,只需要两条规则:

把鼠标悬停在某个方块上(或用 Tab 键聚焦它),它的颜色就会渐渐出现。

值得了解

  • 性能。 在大面积上使用大的模糊半径开销最大,尤其是用在会移动或滚动的元素上的 backdrop-filter。请在手机上测试。
  • 可读性。 永远不要模糊需要阅读的文字,并检查毛玻璃面板上文字的对比度。
  • 层叠。 任何不为 none 的 filter 都会创建新的层叠上下文,并且和 transform 一样,会成为 position: fixed 后代元素的包含块。

常见错误

  • filter: blur(5)。 半径需要单位:blur(5px)。
  • 用 filter: blur() 做毛玻璃面板。 它会让面板自己的文字也变模糊。请用 backdrop-filter 加透明背景。
  • backdrop-filter 什么效果都没有。 元素的背景必须至少部分透明,而且它背后必须有内容。
  • 写了两条 filter 声明。 第二条会替换第一条。把所有函数放在同一个值里。
  • 透明图标上出现方形阴影。 用 filter: drop-shadow() 代替 box-shadow。

常见问题

CSS 中如何让元素变模糊?

使用 filter: blur(5px);。这个长度是模糊半径:0 表示清晰,值越大越模糊。它会让元素及其内部的所有内容变模糊,包括文字和图片。

如何让元素背后的背景变模糊?

在元素上使用 backdrop-filter: blur(10px);,并配合部分透明的背景,例如 rgb(255 255 255 / 0.5)。元素自身的内容保持清晰,背后的内容则变模糊,这就是毛玻璃效果。

drop-shadow() 和 box-shadow 有什么区别?

box-shadow 始终沿着元素的矩形盒子。filter: drop-shadow() 沿着可见的形状,包括 PNG 或 SVG 中的透明区域,所以图标的阴影会是图标的轮廓。

CSS 中如何把图片变成黑白?

使用 filter: grayscale(100%);(或 grayscale(1))。再加上过渡效果,并在悬停时设置 filter: grayscale(0),就能让颜色恢复。

可以同时使用多个滤镜吗?

可以,用空格分隔列出它们:filter: grayscale(1) brightness(1.2) blur(1px);。它们会按顺序应用,所以顺序可能会改变结果。第二条 filter 声明会替换第一条。

Coddy 编程语言插图

和 Coddy 一起学编程

开始