【问题标题】:Humongous height value for <filter> not preventing cutoff<filter> 的巨大高度值不会阻止截止
【发布时间】:2018-02-17 15:06:18
【问题描述】:

我正在尝试在&lt;path&gt; 上应用&lt;filter&gt;,但我遇到了一些东西被剪裁的问题,不仅是模糊,还有原始图像的一部分,即标记。

所以我尝试增加默认过滤器高度(即120%),但似乎没有帮助。

<svg style="height:400px;width:100%;background-color:LightCyan">

<defs>
  <filter id="colorFilter" height="999%">
    <feGaussianBlur in="SourceAlpha" stdDeviation="1" result="blur"></feGaussianBlur>
    <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 3 0" result="lightenedBlur"></feColorMatrix>
    <feMerge>
      <feMergeNode in="lightenedBlur"></feMergeNode>
      <feMergeNode in="SourceGraphic"></feMergeNode>
    </feMerge>
  </filter>
  <marker id="arrow" viewBox="0 -5 10 10" refX="0" refY="0" markerWidth="8" markerHeight="8" orient="auto" style="fill: grey;">
    <path d="M0,-5L10,0L0,5"></path>
  </marker>
</defs>

<g transform="scale(2)">

  <g transform="translate(-500,-230)">
    <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.4632873535149,274L657.4632873535149,271.03831481933645L759.92657470703,271.03831481933645"></path>
  </g>

  <g transform="translate(-500,-200)" filter="url(#colorFilter)">
    <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.4632873535149,274L657.4632873535149,271.03831481933645L759.92657470703,271.03831481933645"></path>
  </g>

  <g transform="translate(-500,-120)" filter="url(#colorFilter)">
    <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.6947631835931,274L657.6947631835931,222.58172607421926L760.3895263671862,222.58172607421926"></path>
  </g>

</g>

</svg>

现在&lt;g&gt; 的跨度足以包围它的所有子元素,这意味着对于顶部箭头,高度不是很开始,所以我尝试对@987654326 使用绝对值而不是相对值@ 但这也无济于事:

<svg style="height:300px;width:100%;background-color:LightCyan">

<defs>
  <filter id="colorFilter" height="1234">
    <feGaussianBlur in="SourceAlpha" stdDeviation="1" result="blur"></feGaussianBlur>
    <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 3 0" result="lightenedBlur"></feColorMatrix>
    <feMerge>
      <feMergeNode in="lightenedBlur"></feMergeNode>
      <feMergeNode in="SourceGraphic"></feMergeNode>
    </feMerge>
  </filter>
  <marker id="arrow" viewBox="0 -5 10 10" refX="0" refY="0" markerWidth="8" markerHeight="8" orient="auto" style="fill: grey;">
    <path d="M0,-5L10,0L0,5"></path>
  </marker>
</defs>

<g transform="scale(2)">

  <g transform="translate(-500,-230)" filter="url(#colorFilter)">
    <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.4632873535149,274L657.4632873535149,271.03831481933645L759.92657470703,271.03831481933645"></path>
  </g>

  <g transform="translate(-500,-150)" filter="url(#colorFilter)">
    <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.6947631835931,274L657.6947631835931,222.58172607421926L760.3895263671862,222.58172607421926"></path>
  </g>

</g>

</svg>

知道什么可能导致这种剪裁以及可以做些什么吗?为什么height属性值高于某个点在这里没有效果?

(在 Chrome、Firefox 和 Edge 中重现 - 看起来不像浏览器错误。)

【问题讨论】:

    标签: svg svg-filters


    【解决方案1】:

    您还必须移动滤镜效果区域的上边框。默认为y=-10%

    <svg style="height:400px;width:100%;background-color:LightCyan">
    
    <defs>
      <filter id="colorFilter" y="-200%" height="500%">
        <feGaussianBlur in="SourceAlpha" stdDeviation="1" result="blur"></feGaussianBlur>
        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 3 0" result="lightenedBlur"></feColorMatrix>
        <feMerge>
          <feMergeNode in="lightenedBlur"></feMergeNode>
          <feMergeNode in="SourceGraphic"></feMergeNode>
        </feMerge>
      </filter>
      <marker id="arrow" viewBox="0 -5 10 10" refX="0" refY="0" markerWidth="8" markerHeight="8" orient="auto" style="fill: grey;">
        <path d="M0,-5L10,0L0,5"></path>
      </marker>
    </defs>
    
    <g transform="scale(2)">
    
      <g transform="translate(-500,-230)">
        <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.4632873535149,274L657.4632873535149,271.03831481933645L759.92657470703,271.03831481933645"></path>
      </g>
    
      <g transform="translate(-500,-200)" filter="url(#colorFilter)">
        <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.4632873535149,274L657.4632873535149,271.03831481933645L759.92657470703,271.03831481933645"></path>
      </g>
    
      <g transform="translate(-500,-120)" filter="url(#colorFilter)">
        <path stroke="grey" fill="none" marker-end="url(#arrow)" d="M555,274L657.6947631835931,274L657.6947631835931,222.58172607421926L760.3895263671862,222.58172607421926"></path>
      </g>
    
    </g>
    
    </svg>

    顺便说一句,仅当您设置filterUnits="userSpaceOnUse" 时,使用绝对值才有效。使用 y 值的注意事项相同。

    【讨论】:

    • 似乎 g 元素会因为“colorFilter”而减少内容,因此添加过滤器的上边框会使所有内容再次进入 g 元素。
    • 为了迂腐,过滤器是进行裁剪的。 g 元素除了在其属性中定义的内容之外什么都不做。
    • @ccprog 顺便说一句,y="-200%" height="500%" 而不是 y="-200%" height="600%" 实际上不会导致过滤画布实际上以过滤内容为中心,还是我误解了它的计算方式?
    • 请注意,颜色矩阵中的“255”与“1”没有任何不同 - 固定偏移列是统一的,因此 0 -> 1 相当于正常的 rgb 0->255 .
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2019-01-03
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多