为啥这个 SVG 投影过滤器在路径很短时会剪切路径?

Posted

技术标签:

【中文标题】为啥这个 SVG 投影过滤器在路径很短时会剪切路径?【英文标题】:Why is this SVG drop shadow filter clipping the path when it's short?为什么这个 SVG 投影过滤器在路径很短时会剪切路径? 【发布时间】:2021-11-01 07:45:20 【问题描述】:

所以我需要一些帮助来了解这个 SVG 发生了什么。

当路径很短并且我为投影应用过滤器时,我会得到一些奇怪的剪辑。路径较长时不会发生。

短路径,有阴影(破损)

路径短,没有阴影

更长的路径,有阴影

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250">
  <g transform="translate(125,125)">
    <filter id="dropshadow" x="-125" y="-125"  >
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"></feGaussianBlur>
      <feOffset dx="2" dy="2" result="offsetblur"></feOffset>
      <feComponentTransfer>
        <feFuncA type="linear" slope="0.5"></feFuncA>
      </feComponentTransfer>
      <feMerge>
        <feMergeNode></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
    <circle
      cx="0"
      cy="0"
      r="58.5"
      stroke="#BBE4D1"
      stroke-
      fill="none"
    ></circle>
    <path
      d="M 1.3612572924182083 -64.98574442586495 A 65 65 0 0 0 3.980102097228898e-15 -65"
      stroke="#28B681"
      stroke-
      fill="none"
      stroke-linecap="round"
      style="filter: url('#dropshadow')"
    ></path>
    <circle
      cx="0"
      cy="0"
      r="55"
      fill="white"
      style="filter: url('#dropshadow')"
    ></circle>
  </g>
</svg>

Plunker:link

【问题讨论】:

@RobertLongson 它应该看起来像第二张图片,在第三张图片中的深绿色周围有一个阴影。第一张被剪成破折号的图片是错误的。 【参考方案1】:

默认的filterUnits是objectBoundingBox

由于您没有指定 filterUnits 这就是您将得到的

objectBoundingBox 单位从 0 到 1,如果您的过滤器超出形状,您可能会使用稍大的值,但数百个数字显然是错误的。

我已经通过明确指定更合适的 userSpaceOnUse 单位来更正您的测试用例,这些值似乎可以保证。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250">
  <g transform="translate(125,125)">
    <filter id="dropshadow" x="-125" y="-125"   filterUnits="userSpaceOnUse">
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"></feGaussianBlur>
      <feOffset dx="2" dy="2" result="offsetblur"></feOffset>
      <feComponentTransfer>
        <feFuncA type="linear" slope="0.5"></feFuncA>
      </feComponentTransfer>
      <feMerge>
        <feMergeNode></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
    <circle
      cx="0"
      cy="0"
      r="58.5"
      stroke="#BBE4D1"
      stroke-
      fill="none"
    ></circle>
    <path
      d="M 1.3612572924182083 -64.98574442586495 A 65 65 0 0 0 3.980102097228898e-15 -65"
      stroke="#28B681"
      stroke-
      fill="none"
      stroke-linecap="round"
      style="filter: url('#dropshadow')"
    ></path>
    <circle
      cx="0"
      cy="0"
      r="55"
      fill="white"
      style="filter: url('#dropshadow')"
    ></circle>
  </g>
</svg>

【讨论】:

以上是关于为啥这个 SVG 投影过滤器在路径很短时会剪切路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 SVG 路径元素添加投影?

动态添加带剪切路径的SVG

html 自定义SVG图像的剪切路径

为啥在某些 Chrome 条件下 SVG 路径元素的填充属性会填充整个边界框?

为啥带有 SVG 的 CSS 剪辑路径在 Safari 中不起作用?

如何将剪切路径应用于 DIV 容器