在 SVG 中绘制一个带有阴影的圆圈会夹住边缘

Posted

技术标签:

【中文标题】在 SVG 中绘制一个带有阴影的圆圈会夹住边缘【英文标题】:Drawing a circle with a dropshadow in SVG clips the edges 【发布时间】:2012-09-17 12:17:46 【问题描述】:

我正在尝试在 SVG 中绘制一个带有投影的简单圆圈,但由于某种原因,顶部和左侧边缘被剪裁了。这在 Chrome 和 Safari 中都会发生。

我使用的是在 w3schools 教程 SVG Drop Shadows 中找到的代码,已修改为使用圆圈。

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
    <filter id="f1" x="0" y="0"  >
      <feOffset result="offOut" in="SourceAlpha" dx="2" dy="2" />
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="1" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <circle r="30" cx="50" cy="50" style="stroke:gray; fill:aliceblue; stroke-width:3px" filter="url(#f1)" />
</svg>

我尝试移动圆圈,增加 SVG 容器的大小等,但得到了相同的结果。我还尝试使用谷歌搜索各种阴影教程,并始终修改示例代码以使用圆圈。每次结果都一样。

那么如何在 SVG 中绘制一个带有阴影的简单圆圈呢?

【问题讨论】:

【参考方案1】:

替换这个: &lt;filter id="f1" x="0" y="0" width="200%" height="200%"&gt;

对此: &lt;filter id="f1" x="-40%" y="-40%" height="200%" width="200%"&gt;

参见示例: http://jsfiddle.net/sRfck/1/

【讨论】:

【参考方案2】:

原来问题在于过滤器的偏移量。圆圈周围没有足够的填充来容纳新添加的过滤器。要添加它,请使用以下属性(根据需要进行调整):

<filter id="f1" x="-20%" y="-20%"  >

x 和 y 将过滤器的框向上和向左一些,这是以前缺少的。然后宽度和高度指定盒子的大小。在这种情况下,200% 是多余的,但对于较大的阴影可能是必要的。

【讨论】:

以上是关于在 SVG 中绘制一个带有阴影的圆圈会夹住边缘的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SVG 中制作插入阴影

SVG 阴影被切断

如何在 UIView 下绘制阴影?

怎么为android控件边缘添加阴影

使用 UIBezierPath 为带有阴影的选定边缘添加角半径 | iOS |斯威夫特 4.2

SVG:阴影的颜色