如何将“element.offsetParent”与 HTML SVG 元素一起使用?

2024-04-11

我正在对一些 javascript 进行维护,它使用.offsetParent http://www.quirksmode.org/js/findpos.html财产。最近的更改现在使应用程序使用 SVG 元素,并且它们破坏了 JavaScript,因为mySvgElement.offsetParent总是undefined.

Is .offsetParent标准,并且它不适用于 SVG 元素吗?如果是这样,有什么替代方案.offsetParent当使用 HTML5 SVG 元素时?


SVG 中不存在 offsetParent。

要获取 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 https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js,并且是 Apache 许可的。 getBoundingBoxInArbitrarySpace 已经过测试,但 getBBoxInScreenSpace 还没有(但我认为它应该有效)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将“element.offsetParent”与 HTML SVG 元素一起使用? 的相关文章

随机推荐

  • selenium.common.exceptions.NoSuchDriverException:消息:使用 Selenium 和 ChromeDriver 时无法使用 Selenium Manager 获取 chromedriver 错误

    我不明白为什么我的代码总是出错 这是我的代码 from selenium import webdriver url https google com path C Users thefo OneDrive Desktop summer 20
  • 通过post请求传输字典

    我正在使用 Python 并尝试通过 HTTP Post 请求向服务器发送字典 包含动态数据 最有效的实施方法是什么 Use urllib urlencode将字典编码为 POST import urllib import urllib2
  • 使用“flask run”或“python run”哪个?

    Reading http flask pocoo org docs 1 0 quickstart http flask pocoo org docs 1 0 quickstart 描述使用 flask run 来启动基于 Flask 的应用
  • 为应用程序创建自定义 odbc 驱动程序

    好的 我有一个简单的数据库引擎 它是用 vb6 编写的专有产品 用于我的一个应用程序 我想为它创建一个 ODBC 驱动程序 这样我就可以将我的一些其他应用程序 需要数据库 与我的数据库引擎而不是 microsoft sql 他们当前正在使用
  • 我怎样才能返回一个数组?

    有没有办法从函数返回数组 更具体地说 我创建了这个函数 char bin 8 for int i 7 i gt 0 i int ascii a if 2 i ascii gt 0 bin i 1 ascii 2 i ascii else b
  • 使用 Mahout 朴素贝叶斯分类器算法需要哪些步骤?

    我正在尝试使用本机贝叶斯分类器来检测欺诈交易 我在 Excel 工作表中有大约 5000 个样本数据 这是我将用于训练分类器的数据 并且我有大约 1000 个测试数据 我将在其上应用测试分类器 我的问题是 我不知道如何训练分类器 在将训练数
  • Rust 中的线程局部变量将使用多少字节?

    我想使用类型的线程局部变量Option
  • ES6 WeakMap 类封装

    我试图理解为什么我需要使用 Wea kMaps 来创建私有类成员 而不是仅仅使用普通变量 它们都使用闭包和模块导入来创建封装 function encapsulation const my var My secret info const
  • 使用 MySQL 时,在 NHibernate 中使用 Guid 作为 Id 列会导致格式异常

    当我定义 NHibernate 实体 映射以使用 Guid 作为标识列时 我收到一个异常 Guid 列生成为 varchar 40 但内容似乎是二进制的 有针对这个的解决方法吗 目前我只使用普通的 ol int 但如果知道对于未来的项目会很
  • Django请求GET参数值列表

    我想做一些排序 我想要的是使用名为 ordering 的参数执行 GET 请求 如下所示 该值将是我将用于排序的模型属性 如下所示 order age height 问题是当我尝试接收订单参数时 该值是一个列表 我尝试像这样使用 as if
  • 查看寻呼机 + ImageView + 捏合缩放 + 旋转

    我想在 Imageview 上实现捏缩放 在 View Pager 中类似于默认 Android Gallery 我在 GitHub 上找到了多个源 但缩放和滑动仅适用于第一个图像 我尝试过的 1 触摸图像视图 https github c
  • 如何从缓冲图像中获取子图像

    我们可以使用 BufferedImage 获取子图像getSubimage int int int int 但我的问题是我想通过传递双值来获得精确的子图像 矩形图像 width and height 有什么替代方案吗 将 double 值转
  • FragmentTransation setCustomAnimations 不起作用

    我尝试使用新的 android 兼容性包将片段包含到我的项目中 我试图在添加新片段时包含过渡动画 这只是我的动画作品之一 In 动画有效 但 Out 动画无效 我在某处读到这是兼容性包中的一个错误 但我还了解到该错误已在兼容性包的第三版中修
  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • iOS Swift 3 参数前面有下划线

    今天我在Xcode中打开我的项目 需要将当前的Swift转换为Swift 3 转换后 我发现函数的所有参数前面都有一个下划线 例如 func didGetWeather weather Weather 我尝试去掉下划线 效果很好 我想知道这
  • IE9 ReactJs 中未定义“Set”或“Map”

    我使用 React 16 2 0 创建了一个简单的应用程序 当我在 IE9 上执行 运行它时 它显示控制台错误 Set 或 Map 未定义 我发现在 IE9 上运行我的 React 应用程序需要一些填充 我按照以下步骤操作 它对我有用 由于
  • MPL pos 是一个未记录的元函数吗?

    里面有下面的示例代码BOOST MPL 文档find算法 http www boost org doc libs 1 46 1 libs mpl doc refmanual find html typedef vector
  • 什么是部分视图?

    我一直在使用 Codeigniter 来习惯模型 视图 控制器架构 并尝试加快制作和实现网站的过程 我不断看到对 部分视图 的引用 但找不到该术语的定义 谁能告诉我什么是部分视图以及它在哪里使用 部分视图只是可以包含在父视图中的子视图 我们
  • Sonata 管理捆绑包 - 表单类型:sonata_type_collection - 自定义模板?

    是否可以覆盖表单类型的模板 sonata type collection 我已经尝试过以下方法 formMapper gt add slides sonata type collection array array edit gt inli
  • 如何将“element.offsetParent”与 HTML SVG 元素一起使用?

    我正在对一些 javascript 进行维护 它使用 offsetParent http www quirksmode org js findpos html财产 最近的更改现在使应用程序使用 SVG 元素 并且它们破坏了 JavaScri