我需要制作一个带有内嵌阴影的盒子,就像 CSS3 具有内嵌盒子阴影一样。到目前为止我发现的是一个带有 feGaussianBlur 的滤镜,但问题是它还在框外添加了阴影,这是我不想要的。这是我到目前为止得到的代码:
<svg> <defs> <filter id="drop-shadow"> <feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="5" /> <feGaussianBlur in="SourceAlpha" result="blur2" stdDeviation="10" /> <feGaussianBlur in="SourceAlpha" result="blur3" stdDeviation="15" /> <feMerge> <feMergeNode in="blur" mode="normal"/> <feMergeNode in="blur2" mode="normal"/> <feMergeNode in="blur3" mode="normal"/> <feMergeNode in="SourceGraphic" mode="normal"/> </feMerge> </filter> </defs> <rect x="10" y="10" width="100" height="100" stroke="black" stroke-width="4" fill="transparent" filter="url(#drop-shadow)"/> </svg>
我制作了一个演示,并将此代码与所需的 CSS 制作结果进行比较。该过滤器不仅适用于矩形,还适用于梯形和更复杂的多边形。
我已经尝试过使用 RadialGradient,但由于这会使渐变变成圆形,所以这也不好。
主要基于我发现的实验,这就是我的想法:
如果您希望看到填充,请取消注释最后一个
。不幸的是,fill="transparent"
不会为滤镜提供可使用的 Alpha,也不会产生阴影。如果你有实心填充,你可以添加
到过滤器的末尾,它会将模糊剪裁为 SourceGraphic 的形状。由于您的形状是透明的,因此您需要做更多的工作。我建议在原始图形上使用半透明填充,以便获得正确的合成选择,并使用 feFuncA 将最终操作的填充归零。事实证明这非常复杂。但这里有一个适用于任何实线形状的解决方案
这是我的小提琴分支:http://jsfiddle.net/kkPM4/