gpt4 book ai didi

javascript - 使用多个变换获取 svg 中 svg 元素的位置

转载 作者:行者123 更新时间:2023-11-30 11:39:19 25 4
gpt4 key购买 nike

我有一个包含圆圈的 SVG 文档。我想在这个圆圈的顶部放置一个绝对定位的 html 元素。圆圈包含一个 cx 和 cy,父元素上有几个变换。如何将 SVG 内的位置转换为父 html 元素(普通像素)的坐标空间?

SVG 是由程序生成的,所以我几乎无法控制它,这意味着我需要一个通用的解决方案来处理父元素上的任意数量的转换。

我没有使用 d3 或任何类似的库,所以我正在寻找一种使用纯 JavaScript 解决此问题的方法。这是我的问题的一个简化示例:

<head>
<style>
#box {
background-color: greenyellow;
position: absolute;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="root">
<svg width="1274.2554" height="692.35712" id="svg">
<g id="viewport" transform="matrix(0.655937472561484,0,0,0.655937472561484,162.2578890186666,57.23719435833714)">
<g id="layer1" transform="translate(-5.49584,-171.51931)">
<g id="elem" transform="translate(34.862286,232.62127)">
<circle id="center" cx="19.952429" cy="19.90885" style="fill:#ffcc33" r="20"></circle>
</g>
</g>
</g>
</svg>
<div id="box" ></div>
</div>

<script>
function positionBoxAtCenter() {
var box = document.getElementById('box');
var center = document.getElementById(('center'));
// TODO: get x, y from 'center' so that 'box' can be placed on top of center
var x = 0, y = 0;
box.setAttribute('style', 'top: ' + y + 'px; left: ' + x + 'px');
}
</script>
</body>

JSFiddle:https://jsfiddle.net/p9pf56sz/

最佳答案

使用 getBoundingClientRect() :

var pos = center.getBoundingClientRect();

可以得到圆心:

var x = pos.left + pos.width/2, y = pos.top + pos.height/2;

这是演示:

function positionBoxAtCenter() {
var box = document.getElementById('box');
var center = document.getElementById(('center'));
var pos = center.getBoundingClientRect();
var x = pos.left + pos.width/2, y = pos.top + pos.height/2;
box.setAttribute('style', 'top: ' + y + 'px; left: ' + x + 'px');
}

positionBoxAtCenter();
#box {
background-color: greenyellow;
position: absolute;
width: 100px;
height: 100px;
}
<body>
<div id="root">
<svg width="1274.2554" height="692.35712" id="svg">
<g id="viewport" transform="matrix(0.655937472561484,0,0,0.655937472561484,162.2578890186666,57.23719435833714)">
<g id="layer1" transform="translate(-5.49584,-171.51931)">
<g id="elem" transform="translate(34.862286,232.62127)">
<circle id="center" cx="19.952429" cy="19.90885" style="fill:#ffcc33" r="20"></circle>
</g>
</g>
</g>
</svg>
<div id="box" ></div>
</div>
</body>

但是,正如您在演示中看到的那样,您正在将矩形的上 Angular/左 Angular (其原点)移动到圆心。因此,您还必须计算矩形的中心(并将其与原点的差值减去)。

关于javascript - 使用多个变换获取 svg 中 svg 元素的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com