在SVG中围绕其自身中心旋转矩形

Vin*_*ale 42 svg

我有以下代码:

<svg>

<defs>
<rect id = "myRect"
      x = "10"
      y = "10"
      height = "120"
      width = "120"
      stroke-width = "2px"
      stroke = "red"
      fill = "blue" />

</defs>


<g transform = "translate(100,30)">
  <use xlink:href = "#myRect" />
</g>

<g transform = "translate(100, 100) rotate(45 ? ?)">

  <rect id = "myRect"
      x = "10"
      y = "10"
      height = "120"
      width = "120"
      stroke-width = "2px"
      stroke = "green"
      fill = "yellow" />
</g>

</svg>
Run Code Online (Sandbox Code Playgroud)

当我翻译矩形而不旋转时,它工作正常.但是当我旋转它时,我想围绕它的中心轴点旋转它.我需要传递什么来旋转属性?

小智 82

您必须将中心设置为填充元素的中心。像这样:

svg .rotate {
  transform-box: fill-box;
  transform-origin: center;
  transform: rotate(45deg);
}
Run Code Online (Sandbox Code Playgroud)

  • `transform-b​​ox: fill-box`:谢谢你拯救了我的日子。 (18认同)
  • @vinay-bagale 这应该是公认的答案;) (2认同)
  • “transform-b​​ox: fill-box”是我一直缺少的。多谢! (2认同)
  • 惊人的。我经常用图像旋转动画。SVG 需要它以正确的方式旋转。谢谢。 (2认同)

Rob*_*son 54

您只需要添加矩形宽度/高度的一半即可获得其中心.

<g transform = "translate(100, 100) rotate(45 60 60)">
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅rotate函数的转换文档.

  • 注意,语法是`rotate(degree xy)`,所以如果你的矩形例如以100x100 viewBox为中心,那么它不是"半宽/高",那么它就是"旋转(45 50 50)". (18认同)
  • 只是为了添加这个答案,您可以将`transform`属性直接应用于`<rect />`元素,如果只有一个形状,则不需要使用`<g />`(group).我还是SVG标准的新手,这对我来说并不是很明显,也许它可以节省一些时间. (7认同)
  • 另外,对我有帮助的是,如果您的svg说`viewBox =“ 0 0 23 19”`,那么您必须将其分成两半,例如:`transform =“ rotate(180 11.5 9.5)`以便将其上下翻转。 (2认同)

Nim*_*mir 41

如果您从点(0,0)开始绘制矩形(OP案例),则接受的答案有效.但对我来说不是!

这对我有用:

  • 要获得我使用的$('#rectID').getBBox() 方法的矩形坐标,应返回[ rect-height,rect-width,rect-y,rect x ]
  • 中心点是(rect-x +(rect-width/2),rect-y +(rect-height/2))

这是我在浏览器控制台上使用的代码段:

var coord = $('#elemID')[0].getBBox();
coord.x + (coord.width/2) +' '+ coord.y + (coord.height/2)
Run Code Online (Sandbox Code Playgroud)

  • OP甚至没有提到这将在浏览器中显示,javascript与任何东西有什么关系?更别说jQuery了...... (11认同)

小智 8

原点
x = x + width / 2
y = y + height / 2
在这里
x 是 10
y 是 10
宽度是 120
高度是 120

<g transform = "translate(100, 100) rotate(45 70 70)">
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个答案是帮助我最好地理解这一点的答案! (2认同)