用 filter: blur() 实现图片模糊最直接,关键在应用位置和数值(0.5px–3px为安全范围),需配合 overflow: hidden 或宽高约束防渲染异常,并注意移动端兼容性、性能影响及局部模糊替代方案。

图片模糊用 filter: blur() 最直接
零基础也能立刻生效,不用 JS,纯 CSS 就行。关键不是“怎么加”,而是“加在哪”和“加多少”。blur() 的单位是像素,值越小越轻微,0.5px 到 3px 是常用安全范围;超过 5px 容易糊成色块,且在低分辨率屏上可能渲染异常。
常见错误是直接给 <img> 标签加 filter,结果发现 hover 时模糊不平滑、或父容器裁剪后边缘发虚。原因在于 filter 会扩大元素渲染区域,必须配合 overflow: hidden 或明确宽高约束。
- 写法示例:
@@##@@
- 若要 hover 清晰 → 模糊,记得加
transition: filter 0.3s ease,否则切换生硬 - 移动端 Safari 对
blur()支持较弱,低于 iOS 15.4 可能完全不生效,需 fallback(比如用半透明遮罩模拟“弱化感”)
<picture></picture> + blur() 不是组合技,别混用
<picture></picture> 是为响应式换图服务的,和滤镜无关。有人误以为在里面套 filter 能“对不同尺寸图分别模糊”,其实不行——filter 是作用于最终渲染的 DOM 元素,不是 source 节点。所有 <source></source> 和 <img src="photo.jpg" style="max-width:90%"> 都共享同一个样式层。
真正需要差异化处理时(比如小图不模糊、大图模糊),得靠媒体查询控制样式:
@media (min-width: 768px) {<br> .hero-img { filter: blur(0.8px); }<br>}-
<picture></picture>里每个<source></source>的media属性只决定“选哪张图”,不影响滤镜逻辑 - 注意:如果用了
srcset,模糊效果仍统一应用在最终渲染的<img>上,和加载的是 1x 还是 2x 图无关
想局部模糊?clip-path 或伪元素更靠谱
原生 filter: blur() 是全图生效,没法只糊脸或只糊背景。强行用 canvas 或 SVG 做局部模糊对零基础太重,推荐两个轻量方案:
- 用
::before伪元素盖一层带模糊的渐变遮罩,再用clip-path切出要模糊的区域(比如圆形头像):.avatar { position: relative; }<br>.avatar::before {<br> content: "";<br> position: absolute;<br> top: 0; left: 0; right: 0; bottom: 0;<br> background: radial-gradient(circle at 50% 50%, rgba(0,0,0,0.3), transparent 70%);<br> filter: blur(8px);<br> clip-path: circle(40px at 50% 50%);<br>} - 如果只是想“文字+模糊背景”,别给图片加
blur(),改用backdrop-filter: blur(4px)(注意:iOS Safari 15.5+ 才稳定支持) - 避免用
box-shadow模拟模糊——它只是外发光,不是图像像素级模糊,边缘会假
性能警告:大量 blur() 会拖慢页面
哪怕只是 1px 模糊,浏览器也要做高斯卷积运算。滚动区域里有 5 张以上带 filter: blur() 的图,低端安卓机就可能掉帧。尤其别在 position: fixed 或 transform 动画元素上叠加 blur(),触发频繁重绘。
- 优化办法:用
will-change: filter提前告知浏览器,但仅对即将变化的元素加,别全局滥用 - 真正卡顿时,优先降级为
opacity: 0.9或浅色 overlay,视觉上也有“弱化”效果 - 构建时可通过 PostCSS 插件自动检测并 warn 多余的
blur()使用
模糊不是装饰开关,是渲染负担。调数值前先打开 Chrome DevTools 的 Rendering 面板,勾选 “FPS meter” 和 “Paint flashing”,看真实影响。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











