filter: url(#id)是唯一可靠、跨浏览器兼容的svg滤镜引用方式;svg滤镜必须定义在的内并设唯一id,且大小写敏感,目标元素需有尺寸、处于绘画上下文,否则静默失效。

filter: url(#id) 是唯一可靠写法
别试 filter: blur(2px) 或 filter: drop-shadow()——那些是 CSS 原生滤镜,和 SVG 滤镜无关。SVG 滤镜必须用 url(#id) 引用,且 id 必须严格匹配 <filter></filter> 的 id 属性值(大小写敏感、不能多空格)。浏览器不会报错,但写错就完全不生效。
常见失效场景:
-
<img src="a.jpg" filter="url(#blur)">:HTML 元素不支持filter属性(只有 SVG 元素支持),必须用 CSS 方式 -
filter: url(#Blur);但定义的是<filter id="blur"></filter>:大小写不一致 → 静默失败 -
filter: url(#blur)没加引号或括号:必须是filter: url("#blur"),漏引号在部分浏览器中会忽略
滤镜必须放在 里,且
<filter></filter> 不是独立标签,它必须嵌套在 <svg></svg> 的 <defs></defs> 内。哪怕你只用它给普通 <div> 加效果,这个 <code><svg></svg> 也得存在——可以隐藏:<svg width="0" height="0" style="position: absolute; left: -9999px;"><defs>...</defs></svg>。
不能这样写:<filter id="blur"><fegaussianblur stddeviation="2"></fegaussianblur></filter>(没包在 <svg><defs></defs></svg> 里 → 失效)
也不能外链 SVG 文件后直接 url(https://cdn.com/filters.svg#blur):跨域 + 安全策略双重拦截,现代浏览器基本都拒绝。
feColorMatrix 的 type 参数不是可选的
<fecolormatrix></fecolormatrix> 的 type 决定 values 解析方式,填错就等于没写。漏掉 type 时浏览器默认按 matrix 解析,但只读前 20 个数字,后面全丢弃。
-
type="matrix":必须提供 20 个数字(5×4 行优先),如values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" -
type="saturate":只接受一个 0–∞ 的数值,values="0.7"表示降饱和,values="2"表示增强 -
type="hueRotate":单位是度(values="90"合法,values="1.57"被忽略) -
type="sepia"或type="grayscale":不接受values,写了也无效
组合多个滤镜时顺序就是执行顺序
SVG 滤镜是线性流水线:in 指向上一步的输出,result 是这一步的命名出口。顺序反了,效果就错位。
例如想“先模糊再提亮”,必须:
<fegaussianblur in="SourceGraphic" stddeviation="3" result="blurred"></fegaussianblur><fecomponenttransfer in="blurred"><fefuncr type="linear" slope="1.2"></fefuncr></fecomponenttransfer>
如果把 <fecomponenttransfer></fecomponenttransfer> 放前面,它作用对象默认是 SourceGraphic(原始图),模糊就白做了。
容易被忽略的一点:<femerge></femerge> 里的 <femergenode></femergenode> 顺序决定图层叠放——后写的在上层。做阴影时,<femergenode in="blur"></femergenode> 要写在 <femergenode in="SourceGraphic"></femergenode> 前面,否则阴影盖不住原图。











