我有以下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+") ");
答案 0 :(得分:27)
如果您知道中心点的坐标,则可以在一次变换中组合平移和缩放。翻译计算方式为:(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()
以编程方式计算中心点。
答案 1 :(得分:6)
您可以将原点更改为居中位置:
.scaled-path-svg {
svg {
path {
transform-origin: center;
transform: scale(1.1);
}
}
}
答案 2 :(得分:1)
之前aetheria提供的答案很棒。还有另一个需要注意的事项 - 笔划宽度,以便在对象缩放时轮廓保持相同的宽度。用法:
stroke-width: (1/scaling-factor)
所以,如果您的缩放比例是2,那么:
stroke-width: (0.5)
注意:您不应该错过aetheria提到的transform: translate(...) scale(2)
。