阻止 SVG feSpecularLighting 滤镜填充 外部元素
我正在 Chrome 和 Firefox 中进行开发,但我在使用 SVG 过滤器时遇到了问题。当应用于矩形时,它似乎不仅仅影响
元素。下面是结果的屏幕截图。正如您所看到的,它在
之外着色,这是不希望的。
下面是 Chrome 中的结果:
下面是 Firefox 中的结果:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" width="100%" height="100%">
<defs>
<filter id="dropshadow" height="130%">
<feGaussianBlur in="SourceAlpha" stdDeviation="10"/>
<feOffset dx="5" dy="5" result="offsetblur"/>
<feMerge>
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
<filter id = "I">
<feSpecularLighting specularExponent="2" lighting-color="#F3F4F3">
<fePointLight x="300" y="100" z="100"/>
</feSpecularLighting>
</filter>
</filter>
</defs>
<rect x="33%" y="33%" rx="30" ry="30" width="33%" height="300px" style="fill:#FFFFFF; filter:url(#I)"></rect>
</svg>
</body>
</html>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
发生这种情况是因为默认的滤镜效果区域,由
元素上的 >x、y
、width
和height
参数为边界框的 120%过滤后的元素,不是 100%。规范明确:
不过,将其更改为 100% 仍会影响整个边界框,因此包括
圆角之外的区域。如果您想将其限制为矩形,可以使用feComposite< /代码>
。例如
,此外,您已将
#I
过滤器嵌套在#dropshadow
过滤器内。那不是你能做的事。您是否想将照明和阴影结合起来?如果是这样,你可以这样做:不过,这似乎在 Firefox 中不起作用,但是你原来的示例对我来说在 Firefox 中也不起作用。
This happens because the default filter effects region, as defined by the
x
,y
,width
andheight
parameters on the<filter>
element, is 120% of the bounding box of the filtered element, not 100%.The specification clarifies:
Changing this to 100% would still affect the entire bounding box, though, so including the areas outside the rounded corners of the
<rect>
. If you want to limit it to just the rectangle, you can usefeComposite
. E.g.Also, you've nested the
#I
filter inside the#dropshadow
filter. That's not something you can do. Are you trying to combine the lighting and drop shadow? If so, you could do that like this:This doesn't seem to work to work in Firefox, though, but then your original example doesn't work in Firefox for me either.