当输入不是过滤器对象的一部分时如何使用feComposite?

Posted

技术标签:

【中文标题】当输入不是过滤器对象的一部分时如何使用feComposite?【英文标题】:How to use feComposite when an input is not a part of the object of the filter? 【发布时间】:2021-11-08 10:25:02 【问题描述】:
<svg>
  <style>
    #ani
      stroke-dasharray: var(--len);
      stroke-dashoffset: var(--len);
    
    #shadow
      filter:url(#Blur);/*omit*/
    
  <style>
  <script>
    document.onclick=()=>
      document.getElementById("ani").atyle="stroke-dashoffset: 0;"
    
  </script>
  <path id="ani" d="..." />
  <line id="shadow" x1y1... /><!--overlapped-->
</svg>

上面显示了代码的简化版本,我希望阴影仅在#ani 重叠时出现,但如果我在#shadow 上使用 feComposite,我无法指定它的另一个输入。

【问题讨论】:

【参考方案1】:

您需要使用 feImage 和片段标识符将“ani”路径导入过滤器。 (如果您还希望它在 Firefox 中工作,则必须将路径转换为 ​​feImage 中的完整内联 SVG。您可以单独查找如何执行此操作。)此版本应该可以在其他任何地方使用。

<svg  >
<defs>

  <filter id="overlap-shadow" filterUnits="userSpaceOnUse" >
    <feImage xlink:href="#ani-path" x="0" y="0" result="imported-ani"/>
    <feComposite operator="in" in="SourceGraphic" in2="imported-ani" result="overlap"/>
    <feGaussianBlur stdDeviation="4" in="overlap" result="blurred-overlap"/>
    <feComposite operator="over" in="blurred-overlap" in2="SourceGraphic"/>
  </filter>
</defs>

<line filter="url(#overlap-shadow)" x1="50" x2="400" y1="50" y2="50" stroke="red" stroke-/>

<path id="ani-path" d="M 0 0 L 100 50 h 100 L 300 150" stroke="black" stroke- fill="none"/>
</svg>

【讨论】:

我试过你的方法,但是输入输出的缺失让我看不懂,能不能补充一下? 好的,我在过滤器中明确了所有输入和输出。

以上是关于当输入不是过滤器对象的一部分时如何使用feComposite?的主要内容,如果未能解决你的问题,请参考以下文章

当查询字段为objectId时,geoNear聚合是不是不起作用?

使用重复参数而不是链接过滤器时,如何使用 Q 对象进行 AND 查找?

如何使用vuejs过滤器

“过滤器输入,转义输出”对 PDO 是不是仍然有效

使用 ng-repeat 有条件地应用过滤器

Spark 过滤器未按预期工作。“列”对象不可调用