【发布时间】:2016-10-12 02:38:08
【问题描述】:
SVG 中的opacity 与fill-opacity 有什么区别?
我参考了 fill-opacity 和 opacity 的文档,但我很困惑这是什么意思
fill-opacity:当前对象内容的不透明度
对
不透明度:对象的透明度
【问题讨论】:
标签: javascript css svg
SVG 中的opacity 与fill-opacity 有什么区别?
我参考了 fill-opacity 和 opacity 的文档,但我很困惑这是什么意思
fill-opacity:当前对象内容的不透明度
对
不透明度:对象的透明度
【问题讨论】:
标签: javascript css svg
区别正是名称所表示的:)。 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 控制填充颜色的不透明度。 opacity 控制整个事物的不透明度。
【讨论】:
我发现此表在考虑将 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 |
【讨论】:
除了影响每个单独元素的哪些部分受到影响(例如填充与描边)之外,另一个区别是当元素在组内重叠时会发生什么。 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>
【讨论】: