【问题标题】:opacity vs fill-opacity in svgsvg中的不透明度与填充不透明度
【发布时间】:2016-10-12 02:38:08
【问题描述】:

SVG 中的opacity 与fill-opacity 有什么区别?

我参考了 fill-opacity 和 opacity 的文档,但我很困惑这是什么意思

fill-opacity:当前对象内容的不透明度

对

不透明度:对象的透明度

【问题讨论】:

    标签: javascript css svg


    【解决方案1】:

    区别正是名称所表示的:)。 fill-opacity 仅适用于元素的fill(或者换句话说,仅适用于其背景),stroke-opacity 仅适用于stroke,而opacity 则适用于两者。

    opacity 是一种后处理操作。也就是说,元素(或组)作为一个整体(填充+描边)被渲染,然后根据不透明度设置调整透明度,而fill-opacity和stroke-opacity是中间步骤,因此单独添加透明度到描边和填充。因此,当stroke-opacity 和fill-opacity 一起使用时,结果仍然与使用opacity 不同(因为填充上的透明度将使填充颜色在它们重叠的地方显示出来)。您可以在下面的前两个元素中直观地看到差异。

    正如 Robert(以 cmets 表示)所指出的,fill-opacity 不适用于 image,而 opacity 确实有效。

    svg {
      width: 100vw;
      height: 100vh;
    }
    body {
      background: url(http://lorempixel.com/600/600/nature/1);
      height: 100vh;
    }
    polygon {
      stroke-width: 3;
    }
    <svg viewBox='0 0 40 190'>
      <polygon points='10,10 30,10 30,30 10,30' fill='steelblue' stroke='crimson' opacity='0.5' />
      <polygon points='10,40 30,40 30,60 10,60' fill='steelblue' stroke='crimson' fill-opacity='0.5' stroke-opacity='0.5' />
      <polygon points='10,70 30,70 30,90 10,90' fill='steelblue' stroke='crimson' fill-opacity='0.5' />
      <polygon points='10,100 30,100 30,120 10,120' fill='steelblue' stroke='crimson' stroke-opacity='0.5' />
      <image xlink:href='http://lorempixel.com/100/100/nature/3' x='8.5' y='130' width='23' height='23' stroke='crimson' opacity='0.5' />
      <image xlink:href='http://lorempixel.com/100/100/nature/3' x='8.5' y='160' width='23' height='23' stroke='crimson' fill-opacity='0.5' />
    </svg>

    在 CSS 世界中,您可以将其视为类似于以下 sn-p 中的内容。 (请注意,我并不是说它们是平等的,SVG 和 CSS 之间存在细微差别。这只是试图解释这些 SVG 属性在 CSS 中的含义。)

    div {
      height: 20vh;
      width: 20vh;
      margin: 30px auto;
      font-family: Verdana;
      font-size: 2vw;
    }
    div:nth-of-type(1) {
      opacity: 0.5;
      background: rgba(70, 130, 180, 1);
      border: .35vw solid rgba(220, 20, 60, 1);
    }
    div:nth-of-type(2) {
      background: rgba(70, 130, 180, 0.5);
      border: .35vw solid rgba(220, 20, 60, 1);
    }
    div:nth-of-type(3) {
      background: rgba(70, 130, 180, 1);
      border: .35vw solid rgba(220, 20, 60, 0.5);
    }
    body {
      background: url(http://lorempixel.com/600/600/nature/1);
      height: 100vh;
    }
    <div></div>
    <div></div>
    <div></div>

    【讨论】:

    • 这里没有错,但理想情况下,您应该解释 opacity=0.5 与同时设置 fill-opacity=0.5 和 stroke-opacity=0.5 有何不同。
    • @RobertLongson:哦,是的。想为此添加一个示例,但似乎忘记了。根据我的理解,唯一的区别是opacity='0.5' 是作为后期处理完成的,所以它就像填充+描边,然后不透明度降低,而其他两个就像中间选项,所以当两者一起使用时笔触的不透明度将通过(它们重叠的地方)显示一些填充的颜色。还有其他区别吗?
    • 正确 + 不透明度适用于图像,填充/描边不透明度不适用。
    • 感谢您的详细回答,这消除了我的困惑。感谢@RobertLongson 提供更多信息。
    【解决方案2】:

    fill-opacity 控制填充颜色的不透明度。 opacity 控制整个事物的不透明度。

    看看这个演示:https://jsfiddle.net/DerekL/9mvrL66g/

    【讨论】:

    • 感谢您的演示.. 有帮助
    【解决方案3】:

    我发现此表在考虑将 opacity 与 SVG 一起使用时很有帮助。别忘了stroke-opacity 和stop-opacity。

    |    Attribute   |             Explanation            |              Applies to:             | 
    |:--------------:|:----------------------------------:|:------------------------------------:|
    | opacity        | The overall opacity of the element.| Everything but gradient stops        |   
    | fill-opacity   | The opacity of the fill paint.     | Elements with the attribute 'fill'   | 
    | stroke-opacity | The opacity of the stroke paint.   | Elements with the attribute 'stroke' |
    | stop-opacity   | The opacity of the gradient stop.  | Gradient stops                       |
    

    【讨论】:

    • 洪水不透明度怎么样?
    • 谢谢。这张桌子很有帮助。
    【解决方案4】:

    除了影响每个单独元素的哪些部分受到影响(例如填充与描边)之外,另一个区别是当元素在组内重叠时会发生什么。 opacity 影响整个组的透明度,而fill-opacity 影响组内各个元素的透明度。这样做的一个结果是,当此类组中的元素重叠时,在使用 fill-opacity 而在使用 opacity 时不会在重叠区域中产生复合效应。当(填充)不透明度 0.5 应用于组内的每个元素或组本身时,下图演示了这一点。

    <svg height="200">
      <g transform="translate(0, 0)">
        <rect x="10" y="10" width="40" height="40"   fill-opacity="0.5"/>
        <rect x="30" y="30" width="40" height="40"   fill-opacity="0.5"/>
      </g>
      <g transform="translate(80, 0)"                fill-opacity="0.5">
        <rect x="10" y="10" width="40" height="40"/>
        <rect x="30" y="30" width="40" height="40"/>
      </g>
      <g transform="translate(0, 80)">
        <rect x="10" y="10" width="40" height="40"        opacity="0.5"/>
        <rect x="30" y="30" width="40" height="40"        opacity="0.5"/>
      </g>
      <g transform="translate(80, 80)"                    opacity="0.5">
        <rect x="10" y="10" width="40" height="40"/>
        <rect x="30" y="30" width="40" height="40"/>
      </g>
      <text transform="translate(170,45)">fill-opacity</text>
      <text transform="translate(170,125)">opacity</text>
      <text transform="translate(10,175)">applied to</text>
      <text transform="translate(0,190)">each element</text>
      <text transform="translate(90,175)">applied to</text>
      <text transform="translate(103,190)">group</text>
    </svg>

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2015-03-31
      • 2011-08-27
      • 2017-10-04
      相关资源
      最近更新 更多