svg滤镜需通过in/result链构建处理流水线,分层控制alpha通道(从sourcealpha起始)、多层偏移模糊合成、颜色干预及显式设置滤镜区域尺寸,才能实现高质量发光与立体阴影效果。

SVG滤镜堆叠不是简单地把多个<fegaussianblur></fegaussianblur>摞在一起,而是通过明确的输入输出链(in → result → 下一个in)构建视觉处理流水线。真正实现高级发光与阴影效果的关键,在于分层控制 Alpha 通道、精准偏移、多层合成与颜色干预。
分层处理 Alpha 通道是基础
发光和阴影都依赖元素轮廓,而非整个图形本身。必须从SourceAlpha开始——它只提取透明度信息,避免模糊整块内容。
-
<fegaussianblur in="SourceAlpha" stddeviation="6" result="blur-out"></fegaussianblur>:生成外围发光或阴影的模糊基底 -
<fegaussianblur in="SourceAlpha" stddeviation="2" result="blur-in"></fegaussianblur>:用于内发光时更紧凑的柔化边缘 - 切忌直接对
SourceGraphic模糊,否则文字或图标本体会变虚,失去清晰度
多层阴影叠加增强立体感
单层<fedropshadow></fedropshadow>或一次偏移+模糊,只能模拟平面投影。真实阴影需明暗分离、方向错落、透明度渐变。
- 外层深色阴影:
<feoffset dx="4" dy="4" result="shadow1"></feoffset>+<fegaussianblur in="shadow1" stddeviation="8"></fegaussianblur> - 内层浅色高光:
<feoffset dx="-2" dy="-2" result="highlight"></feoffset>+<fegaussianblur in="highlight" stddeviation="1.5"></fegaussianblur> - 用
<femerge></femerge>按顺序合并:<femergenode in="SourceGraphic"></femergenode>(原图)→<femergenode in="highlight"></femergenode>(上层高光)→<femergenode in="shadow1"></femergenode>(底层阴影)
发光效果需颜色与透明度协同干预
纯白模糊只是“泛光”,要做出霓虹、暖光或金属光泽,必须介入颜色和 alpha 值。
- 先用
<fecolormatrix type="matrix"></fecolormatrix>调整模糊层颜色:例如values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.3 0"降低透明度并保留 RGB - 或用
<fecomponenttransfer></fecomponenttransfer>单独调亮/压暗某通道,如<fefunca type="linear" slope="0.7"></fefunca>统一降低整体不透明度 - 再通过
<fecomposite operator="over"></fecomposite>将调色后的发光层叠加到原图上,避免硬边融合
尺寸与裁剪边界必须显式声明
默认<filter></filter>区域仅覆盖元素自身尺寸,大模糊值(stdDeviation ≥ 5)会直接被裁掉边缘,导致发光“断层”或阴影消失。
- 务必设置
x="-30%" y="-30%" width="160%" height="160%",留足扩散空间 - 数值不是固定像素,而是相对滤镜引用元素的百分比,经验上
stdDeviation=8建议至少x="-25%" - 若用于文字,还需确保文字容器有明确宽高(
display: inline-block+line-height或min-width),否则SourceAlpha可能为空











