【问题标题】:SVG drop shadow with filters is truncated带有过滤器的 SVG 投影被截断
【发布时间】:2014-06-16 18:11:30
【问题描述】:

我正在尝试为以下 SVG 形状制作投影:

<svg style="overflow:visible; ">
<defs>
    <marker orient="auto" refY="4" refX="2" markerHeight="13" markerWidth="13" id="_x0000_s1094end">
        <path style="fill:yellow; " d="M2,2 L2,6 L6,4 L2,2" />
    </marker>
</defs>
<path d="M 288,164 L 108,176" style="stroke-width:8; stroke:yellow; marker-end:url(#_x0000_s1094end); " y="4" x="4"/>
</svg>

投影后的形状应该是这样的(忽略除箭头及其阴影之外的位):

我尝试了以下 SVG:

<svg style="overflow:visible; ">
<defs>
    <marker orient="auto" refY="4" refX="2" markerHeight="13" markerWidth="13" id="_x0000_s1094end">
        <path style="fill:yellow; " d="M2,2 L2,6 L6,4 L2,2" />
    </marker>
    <filter id="f1" x="0" y="0" width="500%" height="500%">
        <feOffset result="offOut" in="SourceAlpha" dx="-8" dy="-8" />
        <feBlend in="SourceGraphic" in2="offOut" mode="normal" />
    </filter>
</defs>
<path d="M 288,164 L 108,176" style="stroke-width:8; stroke:yellow; marker-end:url(#_x0000_s1094end); " y="4" x="4" filter="url(#f1)"/>
</svg>

http://fiddle.jshell.net/md3rT/

我得到的是这样的:

生成的 SVG 被截断。 另外,如何改变阴影的不透明度?

提前谢谢!

【问题讨论】:

    标签: html css svg svg-filters


    【解决方案1】:

    要停止截断,只需使过滤器覆盖形状(阴影在上方和左侧,因此过滤器需要覆盖该区域)。

        <filter id="f1" x="-180%" y="-500%" width="500%" height="1000%">
            <feOffset result="offOut" in="SourceAlpha" dx="-8" dy="-8" />
            <feBlend in="SourceGraphic" in2="offOut" mode="normal" />
        </filter>
    

    如果您希望阴影不透明,则涉及非透明泛洪的东西似乎可以解决问题。对于一般的阴影,你需要这样的东西......

    <feGaussianBlur in="alpha-channel-of-feDropShadow-in" stdDeviation="stdDeviation-of-feDropShadow"/> 
      <feOffset dx="dx-of-feDropShadow" dy="dy-of-feDropShadow" result="offsetblur"/> 
      <feFlood flood-color="flood-color-of-feDropShadow" flood-opacity="flood-opacity-of-feDropShadow"/> 
      <feComposite in2="offsetblur" operator="in"/> 
      <feMerge> 
        <feMergeNode/>
        <feMergeNode in="in-of-feDropShadow"/> 
      </feMerge>
    

    尽管在 Firefox 和 Chrome 中,您可以改用 SVG Filter Effects &lt;feDropShadow&gt; 过滤器或 CSS 阴影过滤器。

    【讨论】:

    • 感谢您的建议解决了截断问题。但是使用洪水过滤器不起作用。泛光滤镜用指定的颜色填充整个滤镜区域(即 x="-180%" y="-500%" width="500%" height="1000%")。
    • 参见jsfiddle.net/2DpBz,了解使用后一种模板的阴影效果的实际示例。
    • Surender - 这行得通 - 检查以确保您已将 Robert 的所有占位符替换为您的实际值(又名“alpha-channel-of-feDropShadow-in”需要替换为“SourceAlpha "。
    【解决方案2】:

    这就是我认为您正在寻找的东西。它扩展了滤镜区域,保持阴影不模糊,并将阴影的不透明度降低到 50%。 (我还发现,当您不为内联 SVG 提供明确的尺寸时,浏览器会变得古怪。)

    <svg x="0px" y="0px" width="500px" height="300px" style="overflow:visible;" viewBox="0 0 500 300">
        <defs>
            <marker orient="auto" refY="4" refX="2" markerHeight="13" markerWidth="13" id="_x0000_s1094end">
                <path style="fill:yellow; " d="M2,2 L2,6 L6,4 L2,2" />
            </marker>
            <filter id="f1" x="-50%" y="-100%" width="200%" height="400%">
                <feOffset result="offOut" in="SourceAlpha" dx="-8" dy="-8" />
                <feComponentTransfer>
                    <feFuncA type="discrete" tableValues="0 .5"/>
                </feComponentTransfer>
                <feComposite operator="over" in="SourceGraphic"/>
            </filter>
        </defs>
        <path d="M 288,164 L 108,176" style="stroke-width:8; stroke:yellow; marker-end:url(#_x0000_s1094end); " y="4" x="4" filter="url(#f1)"/>
    
    </svg>
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2021-12-28
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      相关资源
      最近更新 更多