34

我有以下 SVG 图形:

<svg version="1.1" id="diagram" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="375px" height="150px">
    <path d="M45,11.5H33.333c0.735-1.159,1.167-2.528,1.167-4C34.5,3.364,31.136,0,27,0s-7.5,3.364-7.5,7.5c0,1.472,0.432,2.841,1.167,4H9l-9,32h54L45,11.5z M22.5,7.5C22.5,5.019,24.519,3,27,3s4.5,2.019,4.5,4.5c0,1.752-1.017,3.257-2.481,4h-4.037 C23.517,10.757,22.5,9.252,22.5,7.5z" id="control"/>
</svg>

我想以编程方式更改此对象的比例,但我希望它从中心点缩放。

我试过把它包裹在<g>标签上,就像这样

<g transform="translate(0,0)">
<path x="0" y="0" id="control" transform="scale(2)">...</path>
</g>

但这似乎不起作用。我一直在网上寻找,似乎缩放路径需要操纵路径矩阵,这似乎非常困难。令人讨厌的是,它很容易使用additive="sum" 属性进行缩放,但在这种情况下,我没有使用变换动画。

谁能帮我吗?

编辑:设法让这个工作很好,对于任何被困在同一件事上的人来说,这是一种以编程方式进行的好方法:

var elem = document.getElementById("control");
var bBox = elem.getBBox();
var scaleX = 2;
var scaleY = 2;
$(elem).attr("transform", "scale("+scaleX+", "+scaleY+") translate("+-bBox.width/2+","+-bBox.height/2+") ");
4

3 回答 3

50

如果您知道中心点的坐标,那么您可以在一次转换中结合平移和缩放。翻译计算为:(1 - scale) * currentPosition

如果中心是(10, 20)并且您正在缩放,则按=3平移:(1 - 3)*10, (1 - 3)*20(-20, -40)

<g transform="translate(-20, -40) scale(3)">
    <path d="M45,11.5H33.333c0.735-1.159,1.167-2.528,1.167-4C34.5,3.364,31.136,0,27,0s-7.5,3.364-7.5,7.5c0,1.472,0.432,2.841,1.167,4H9l-9,32h54L45,11.5z M22.5,7.5C22.5,5.019,24.519,3,27,3s4.5,2.019,4.5,4.5c0,1.752-1.017,3.257-2.481,4h-4.037 C23.517,10.757,22.5,9.252,22.5,7.5z" id="control"/>
</g>

转换的应用顺序与声明它们的顺序相反,因此在上面的示例中,首先scale执行 ,然后执行translate. 缩放会影响坐标,因此这里的平移是缩放坐标。

您可以使用 以编程方式计算中心点element.getBBox()

于 2012-07-26T14:20:45.047 回答
20

您可以将原点更改为中心:

.scaled-path-svg {
  svg {
    path {
      transform-origin: center;
      transform: scale(1.1);
    }
  }
}
于 2017-09-01T21:40:01.187 回答
2

aetheria之前提供的答案很棒。还有一件事需要注意——笔画宽度,以便在对象缩放时轮廓保持相同的宽度。用法:

stroke-width: (1/scaling-factor)

所以,如果你的缩放比例是 2,那么:

stroke-width: (0.5)

注意:你不应该错过 aetheriatransform: translate(...) scale(2)提到的。

于 2016-01-22T00:38:38.530 回答