【问题标题】:Svg image changes size after setting transform rotate设置变换旋转后,SVG图像改变大小
【发布时间】:2019-12-10 17:53:26
【问题描述】:

我用一辆汽车(图像)制作了一个 svg,它跟随鼠标并将其保持在圆心。

这在 Windows 中运行良好。 (在 Chrome、Firefox、Edge 上测试)。


问题

当位置改变并设置旋转时,汽车会无缘无故地改变大小。这发生在 IOS 设备上(我认为)(在 Macbook - Safari 和 iPhone - Safari 和 Chrome 上测试)

通过设置图像的xy 来简单地改变位置。通过设置属性transform 来更改旋转(我认为是导致问题的原因)。

image.setAttributeNS(null, 'x', (xy.x - (12 * 0.25)));
image.setAttributeNS(null, 'y', (xy.y - (5.4 / 2)));
image.setAttributeNS(null, 'transform', 'rotate(' + (180 - angle) + ',' + xy.x + ',' + xy.y + ') '); 

我制作了一个fiddle,当点击button 时,它会切换汽车。请在 Safari 和 Chrome 中试一试,看看有什么不同。

https://jsfiddle.net/065o4xke/3/

【问题讨论】:

  • 我不太确定您为什么要重置 x 和 y 属性的值。而不是重置 x 和 y 的值,您只能像这样围绕圆心 (21,21) 旋转汽车:image.setAttributeNS(null, 'transform', 'rotate(' + (180 - angle) + ',21,21) '); 如果这不是您需要的,请解释为什么需要重置值x 和 y。
  • @enxaneta 汽车需要沿着整个圆圈移动,它的鼻子始终指向中心。如果xy 未设置,则汽车只会在同一点转弯。

标签: javascript svg svg-animate


【解决方案1】:

如果这是您正在寻找的机芯,请告诉我:

var circle = document.getElementById("circle");
var radius = 100 / (2 * Math.PI);
var xmlns = "http://www.w3.org/2000/svg";
var procent = 100 / (360 / 15);
var offset = 0 - procent / 2;

let angle = 0

function rotateCar(){
  requestAnimationFrame(rotateCar);
  angle +=.5;
  car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`);
}

rotateCar()
.wrapper {
  height: 300px;
  width: 300px;
  border: 1px solid black;
}
<div class="wrapper">
  <svg id="svg" viewBox="0 0 42 42" width="100%" height="100%">
      <circle cx="21" cy="21" r="16" stroke="red" fill="none" />
      
      <image id="car" xlink:href="//cdn.via.nl/img/mainmot/4.svg" x="2.1450689516760377" y="16.912873272286454" width="12" height="5.4" transform="rotate(0,21,21)"></image>
  </svg>
</div>

如果您想让汽车在路径上居中,您可以执行以下操作: 您将图像包装在一个组中。在组内,汽车被平移以使其居中。接下来轮换组。

var circle = document.getElementById("circle");
var radius = 100 / (2 * Math.PI);
var xmlns = "http://www.w3.org/2000/svg";
var procent = 100 / (360 / 15);
var offset = 0 - procent / 2;

let angle = 0

function rotateCar(){
  requestAnimationFrame(rotateCar);
  angle +=.5;
  car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`);
}

rotateCar()
.wrapper {
  height: 300px;
  width: 300px;
  border: 1px solid black;
}
<div class="wrapper">
  <svg id="svg" viewBox="0 0 42 42" width="100%" height="100%">
      <circle cx="21" cy="21" r="16" stroke="red" fill="none" />
      <g id="car" transform="rotate(0,21,21)">
      <image xlink:href="//cdn.via.nl/img/mainmot/4.svg" x="0" y="21" width="12" height="5.4" transform="translate(0,-2.7)" ></image>
    </g>
  </svg>
</div>

【讨论】:

  • 感谢您的回答!正是我需要的
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多