从中心缩放路径

Han*_*pan 19 html5 svg

我有以下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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

但这似乎不起作用.我一直在网上看,似乎缩放路径需要操纵路径矩阵,这看起来非常困难.令人讨厌的是,它易于使用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+") ");
Run Code Online (Sandbox Code Playgroud)

ᴇʟᴇ*_*ᴀтᴇ 32

如果您知道中心点的坐标,则可以在一次转换中组合平移和缩放.翻译计算如下:(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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我相信您可以通过进行额外的翻译来避免中心的数学计算。例如,如果中心是 `(cx, cy)` 你可以做 `transform="translate(cx, cy) scale(3) translate(-cx, -cy)"` (5认同)
  • 请注意,如果路径不在 `0, 0` 处,则需要将 `bbox.x` 和 `bbox.y` 值添加到计算中,例如 `(1-scale) * (bbox.x + bbox .width/2)` (2认同)

Ela*_*lem 10

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

.scaled-path-svg {
  svg {
    path {
      transform-origin: center;
      transform: scale(1.1);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 添加一个额外的“transform-b​​ox:fill-box;”怎么样? (4认同)
  • 请注意,这会围绕整个 SVG 的中心(而不是 SHAPE 的中心)缩放形状。如果不像接受的答案那样进行繁琐的计算,就没有简单的方法可以从其中心向上/向下缩放形状。 (3认同)