我正在尝试在单个SVG过滤器中实现多个投影,但我相信我的问题比这更通用:如何在单个SVG过滤器中添加多个效果?在我的案例,这是我正在努力做的事情。
我有一个当前包含单个路径元素的SVG文档,并且我已对此路径元素应用了单个阴影效果。
我的SVG文件
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="1750">
<defs>
<filter id="dropshadow">
<feGaussianBlur in="SourceAlpha" stdDeviation="2.2"></feGaussianBlur>
<feOffset dx="12" dy="12" result="offsetblur"></feOffset>
<feFlood flood-color="rgba(0,0,0,0.5)"></feFlood>
<feComposite in2="offsetblur" operator="in"></feComposite>
<feMerge>
<feMergeNode></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
</defs>
<path xmlns:xlink="http://www.w3.org/1999/xlink" d="M 100 100 L 300 100 L 200 300 z z" fill="#2DA9D6" filter="url(#dropshadow)"></path>
</svg>
这给了我一个看起来像这样的SVG:
现在,我想在这个相同的路径元素中添加第二个(完全不同的)阴影。例如,假设一个上升到元素左侧的阴影。在CSS中,我的整个阴影可能看起来像:
box-shadow: 5px 5px 5px rgba(0,0,0,0.5), -5px -5px 5px rgba(0,0,0,0.5);
如何使用SVG滤镜执行这些多重阴影?我看过this question,建议将多个效果放到一个过滤器中,但我不确定如何将多个效果合并到一个过滤器中。
感谢您的帮助!
答案 0 :(得分:10)
您可以使用result
属性为过滤器基元元素的输出命名,将其视为一种过滤器本地id
属性。然后,您可以将该名称用作具有in
或in2
属性的过滤器输入。
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="1750">
<defs>
<filter id="dropshadow">
<feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur"/>
<feOffset dx="12" dy="12" result="offsetblur"/>
<feOffset dx="-20" dy="-12" result="offsetblur2" in="blur"/>
<feComponentTransfer result="shadow1" in="offsetblur">
<feFuncA type="linear" slope="0.5"/>
</feComponentTransfer>
<feComponentTransfer result="shadow2" in="offsetblur2">
<feFuncA type="linear" slope="0.2"/>
</feComponentTransfer>
<feMerge>
<feMergeNode in="shadow1"/>
<feMergeNode in="shadow2"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<path xmlns:xlink="http://www.w3.org/1999/xlink" d="M 100 100 L 300 100 L 200 300 z z" fill="#2DA9D6" filter="url(#dropshadow)"></path>
</svg>
请参阅fiddle。
答案 1 :(得分:0)
您可以仅使用CSS进行多个过滤器!对每个用空格分隔的过滤器使用一个函数:
.multiple-different-filters {
filter: blur(20px) grayscale(20%);
}
.double-dropshadow {
filter: drop-shadow(5px 5px 5px rgba(0,0,0,0.5)) drop-shadow(-5px -5px 5px rgba(0,0,0,0.5));
}
您需要分别为每个阴影调用drop-shadow()
函数。