gpt4 book ai didi

javascript - 如何将 `element.offsetParent` 与 HTML SVG 元素一起使用?

转载 作者:太空狗 更新时间:2023-10-29 14:52:15 28 4
gpt4 key购买 nike

我正在维护一些使用 .offsetParent 的 javascript属性(property)。最近的更改现在使应用程序使用 SVG 元素,并且它们破坏了 JavaScript,因为 mySvgElement.offsetParent 始终是 undefined

.offsetParent 是标准的吗?它不适用于 SVG 元素吗?如果是这样,在使用 HTML5 SVG 元素时,.offsetParent 的替代方法是什么?

最佳答案

offsetParent 在 SVG 中不存在。

要获取 SVG 节点的边界框坐标,您通常会在 SVG 元素上使用 getBBox 方法。这将在该元素的局部坐标系中返回一个 bbox。然后,要确定 SVG 元素在屏幕坐标中的位置,您可以在元素上使用 getScreenCTM 来获取转换矩阵,该矩阵会将元素的本地坐标转换为屏幕坐标。然后,您通过返回的转换矩阵转换返回的 bbox。这是执行此操作的一些代码:

function getBoundingBoxInArbitrarySpace(element,mat){
var svgRoot = element.ownerSVGElement;
var bbox = element.getBBox();

var cPt1 = svgRoot.createSVGPoint();
cPt1.x = bbox.x;
cPt1.y = bbox.y;
cPt1 = cPt1.matrixTransform(mat);

// repeat for other corner points and the new bbox is
// simply the minX/minY to maxX/maxY of the four points.
var cPt2 = svgRoot.createSVGPoint();
cPt2.x = bbox.x + bbox.width;
cPt2.y = bbox.y;
cPt2 = cPt2.matrixTransform(mat);

var cPt3 = svgRoot.createSVGPoint();
cPt3.x = bbox.x;
cPt3.y = bbox.y + bbox.height;
cPt3 = cPt3.matrixTransform(mat);

var cPt4 = svgRoot.createSVGPoint();
cPt4.x = bbox.x + bbox.width;
cPt4.y = bbox.y + bbox.height;
cPt4 = cPt4.matrixTransform(mat);

var points = [cPt1,cPt2,cPt3,cPt4]

//find minX,minY,maxX,maxY
var minX=Number.MAX_VALUE;
var minY=Number.MAX_VALUE;
var maxX=0
var maxY=0
for(i=0;i<points.length;i++)
{
if (points[i].x < minX)
{
minX = points[i].x
}
if (points[i].y < minY)
{
minY = points[i].y
}
if (points[i].x > maxX)
{
maxX = points[i].x
}
if (points[i].y > maxY)
{
maxY = points[i].y
}
}

//instantiate new object that is like an SVGRect
var newBBox = {"x":minX,"y":minY,"width":maxX-minX,"height":maxY-minY}
return newBBox;
}

function getBBoxInScreenSpace(element){
return getBoundingBoxInArbitrarySpace(element,element.getScreenCTM());
}

此代码取自 here , 并且是 Apache 许可的。 getBoundingBoxInArbitrarySpace 已经过测试,但 getBBoxInScreenSpace 还没有(但我认为它应该有效)。

关于javascript - 如何将 `element.offsetParent` 与 HTML SVG 元素一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996005/

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