css - 为什么 SVG 旋转没有居中?
问题描述
我有一个简单的 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/
解决方案
默认情况下,转换的来源应该是0px 0px
,但现在我们在 MDN 上有错误的信息:
默认情况下,变换的原点是中心。
这是错误的。但是,如果它位于您的圆心,您将无法看到旋转的结果,因为您将在他的中心旋转圆。
transform-origin
您可以使用 CSS 属性或 SVG属性更改旋转中心transform
。在 SVGtransform
属性中,我们也有默认的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>
请更改为整页以查看示例。
推荐阅读
- azure - 无法在 Azure 中发布 Composer 机器人
- azure - Azure Synapse 数据流中分区列的前导零丢失
- python - SyntaxError:从 scipy 切换到 imageio 后无法分配给函数调用?
- reactjs - 我的 sass 使用在 React 中不起作用,有人知道为什么吗?
- svelte - 如何在 Svelte Material UI (@SMUI) 滑块标签中更改背景?
- r - R:有没有办法可以从谷歌云存储读取光栅 tif 文件而不保存到文件?
- c++ - 由于 MSVS2017 中的递归,编译器失败
- azure - Azure Active Directory 限制使用 Graph API 返回的组
- java - Java打印二叉搜索树的顶视图
- javascript - 是否可以将图标和按钮附加到下拉/表单选择?