SVG中的固定笔划宽度


103

我希望能够将SVG元素的笔触宽度设置为“像素感知”,无论当前应用了什么缩放转换,该宽度始终为1px。我知道这很可能是不可能的,因为SVG的全部要点是像素无关的。

上下文如下:

我有一个SVG元素,其viewBox和prepareAspectRatio属性设置了。看起来像这样

<svg version="1.1" baseProfile="full"
    viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet"
    xmlns="http://www.w3.org/2000/svg" >
</svg>

这意味着当我缩放该元素时,其内部的实际形状也会相应缩放(到目前为止很好)。

如您所见,我已经设置了viewBox,以使原点位于中心。我想在该元素内绘制一个x轴和y轴,因此我这样做:

<line x1="-1000" x2="1000" y1="0" y2="0" />

同样,这很好。但是,理想情况下,此轴始终始终只有1px宽。当我缩放父级svg元素时,我对轴变得更胖没有兴趣。

那我搞砸了吗?

Answers:


128

您可以使用vector-effect设置为的属性non-scaling-stroke,请参阅文档。另一种方法是使用transform(ref)

这将在支持SVG Tiny 1.2中那些部分的浏览器中起作用,例如Opera10。回退包括编写一个小的脚本来执行此操作,基本上是反转CTM并将其应用于不应该扩展的元素上。

如果您想要更清晰的线条,还可以禁用抗锯齿shape-rendering=optimizeSpeedshape-rendering=crispEdges)和/或使用定位功能。


1
不幸的是,这是在XUL应用程序中,似乎还不支持矢量效果。那好吧。
wxs

1
这应该会在Firefox 15中很好地显示,因此一旦您在壁虎15上构建XUL应用程序,您就应该能够使用它
。– Robert Longson

2
IE11仍然不支持vector-effect属性。是否有可能达到与vector-effect: non-scaling-strokeIE11 相同的效果?
merlin 2014年

1
@merlin是的,使用js可以在IE中模拟它。
ErikDahlström2014年

3
@merlin克隆元素(将设置fillnone,反之亦然stroke),计算并设置适当的变换(一个用于填充部分,一个用于描边部分)。肯定会有些混乱,但是确实存在-您可能还想请Microsoft添加对此的支持。无论如何,我认为您的问题应该是一个独立的问题。
ErikDahlström2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.