纯CSS渐变仅能实现基础颗粒,真正可控、有艺术感的噪声需用SVG内联滤镜+background-blend-mode组合;feTurbulence须设type="fractalNoise"、baseFrequency="0.55"、numOctaves="2",配合overlay(深色)或multiply(浅色)混合模式,并确保SVG viewBox与编码正确。

直接上结论:纯 CSS 渐变能做出基础颗粒,但要真正可控、有艺术感的噪声(比如带灰度层次、方向性噪点、或与渐变融合不生硬),必须用 SVG 内联 常见错误是这样写: 结果发现按钮点击反馈变慢、文字边缘模糊、阴影失真——因为 type、baseFrequency、numOctaves 这三个值决定“艺术感”上限: 噪声 SVG 本身是单色(#000)灰度图,靠混合模式把它“染”成你要的颜色。错用 很多人复制在线生成器的 Data URL,粘贴后颗粒消失——大概率是 URL 编码错了或 viewBox 尺寸不匹配:filter: url(#noise) 到整个容器上,只会让文字发虚、边框糊掉。
为什么不能对 div 直接加 SVG 噪声滤镜
div { filter: url(#noise); }
filter 会把整个元素(含子内容)都送进滤镜管线,而 feTurbulence 是逐像素扰动,没有语义保护。
feTurbulence 输出的是灰度图,必须和颜色层做混合,否则看到的是纯灰噪点background-image: url("data:image/svg+xml,...") 内联方式,才能确保只作用于背景,且不触发额外 HTTP 请求用
feTurbulence 生成可调噪点纹理的关键参数
type="fractalNoise" —— 必须设这个,type="turbulence" 会偏移坐标而非扰动颜色,不适合做背景纹理baseFrequency="0.55" —— 小于 0.4 粒子太疏、大于 0.7 又太密;0.55 是深色背景下颗粒清晰又不刺眼的甜点值numOctaves="2" —— 设 3 或 4 容易过载,尤其在 Safari 下渲染卡顿;2 层足够叠加出丰富频谱,且兼容性稳stitchTiles="stitch" —— 看似防平铺接缝,实则在某些 Chrome 版本引发渲染撕裂,去掉更安全
background-blend-mode 怎么选才不糊底色multiply 在深色背景上会吞掉细节,screen 又太亮:
overlay:保留底层色相,同时让噪点在暗区显灰、亮区显白,模拟胶片颗粒的光学响应multiply 更稳妥,但记得把噪声图 baseFrequency 调低到 0.3 左右,避免糊成一块normal —— 那等于直接盖一层 PNG,失去 SVG 滤镜的动态可调性 的 fill 改成 #333,再配 overlay,比后期调色更自然内联 SVG Data URL 的尺寸与编码陷阱
真正难的不是写出第一版噪点,而是让同一段代码在深色/浅色模式下都保持颗粒存在感而不抢戏——这需要把 viewBox="0 0 100 100",且 ,否则平铺时接缝错位# 要编码为 %23, 为
%3C,> 为 %3E,少一个就解析失败feTurbulence 的输出灰度范围、background-blend-mode 的混合阈值、以及顶层 rgba() 色层的透明度三者拧在一起调,差 0.05 的 alpha 值,视觉情绪就偏冷或偏躁。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











