【问题标题】:Why SVG rotation was not centered?为什么 SVG 旋转没有居中?
【发布时间】:2020-10-13 08:43:02
【问题描述】:

我有一个简单的 SVG 图像。里面有一个圆圈,我想旋转90 度。但是正如您在 JSFiddle 示例中看到的那样,旋转的中心不在中间。我做错了什么?

svg {
    background-color: #ddd;
}
.circle1 {
    fill: none;
    stroke-width: 20px;
    stroke: #b5b5b5;
}

.circle2 {
    fill: #aaa;
    transform: rotate(-20deg);
    stroke-width: 15px;
    stroke: #71c7ff;
}
<svg height="600" width="600">
    <circle class="circle1" cx="300" cy="300" r="200"></circle>
    <circle class="circle2" cx="300" cy="300" r="200"></circle>
</svg>

这里是 JSFiddle 示例 https://jsfiddle.net/oxt681gr/1/

【问题讨论】:

  • 变换原点:中心; ?
  • 也许还有 transform-b​​ox: fill-box;
  • 但是 center 它应该是旋转的默认值。
  • SVG specification 不同意。
  • 太复杂了。但出于我的目的,顶部 svg 元素的旋转效果很好。

标签: css svg rotation css-transforms


【解决方案1】:

默认情况下,转换的来源应该是0px 0px,但现在我们在 MDN 上有错误的信息:

默认情况下,变换的原点是中心。

Source-link

这是错误的。但是,如果它在您的圆心,您将无法看到旋转的结果,因为您将在他的中心旋转圆。

您可以使用 CSS 属性 transform-origin 或 SVG transform 属性更改旋转中心。在 SVG transform 属性中,我们在 0px 0px 上也有默认值。要旋转 SVG(不带 CSS),请使用 transform="rotate(deg, cx, cy)",其中 deg 是您要旋转的度数,(cx, cy) 定义旋转中心。

在我的解决方案中,您可以将其更改为与 CSS 和 JS 交互:

var input = document.querySelector('input'),
    circle2 = document.querySelector('.circle2'),
    output = document.querySelector('span');

input.onchange = function(e)
{
    var newTransformOrigin = e.target.value;
    output.innerHTML = newTransformOrigin + 'px' + ' ' + newTransformOrigin + 'px';
    circle2.style.transformOrigin = output.innerHTML;
};
svg {background-color:#ddd}
.circle1 {fill: none; stroke-width: 20px; stroke: #b5b5b5}
.circle2
{
    fill: #aaa;
    transform-origin: 0 0;
    transform: rotate(-20deg);
    stroke-width: 15px;
    stroke: #71c7ff;
}
<p>Change transform-origin <input type="range" min="0" max="600" value="0" step="50">
 <span>0px 0px</span></p>
<svg height="600" width="600">
    <circle class="circle1" cx="300" cy="300" r="200"></circle>
    <circle class="circle2" cx="300" cy="300" r="200"></circle>
</svg>

请切换到整页查看示例。

【讨论】:

  • 你的前两句话不正确。没有错误,这是 SVG 规范要求的。见w3.org/TR/SVG/styling.html#UAStyleSheet
  • @RobertLongson,好吧,我错了。我现在会改变它。这是因为 MDN 上的错误信息:默认情况下,变换的原点是中心。 链接:developer.mozilla.org/en-US/docs/Web/CSS/transform-origin
  • MDN 对 HTML 是正确的,但对 SVG 是不正确的。由于 SVG 占网络的体积不到 1%,覆盖 99% 的情况可能对 MDN 来说已经足够了。
  • 谢谢。很好的解释。
  • 如果有人想要支持 IE,那么他必须将我的 onchange 函数更改为 var tv = e.target.value;circle2.setAttribute('transform', 'translate('+tv+','+tv+')rotate(-20)translate(-'+tv+',-'+tv+')');,因为 IE 有一个错误 - IE 支持 SVG 中的 transform 属性,即使它不识别CSS 样式。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多