SVG getBoundingClientRect() + “transform:rotate()”在 Chrome 中以一种非常具体的方式出现错误

2023-12-19

getBoundingClientRect() 在所有 SVG 元素上都可以正常工作,但在 Chrome 中旋转元素的情况除外。

下面我画了两条线,左边的一条是对角线,右边的线从垂直开始,如黑线所示。绿色框是 getBoundingClientRect() 的直观表示。然后,我同时对两条线应用相同的变换旋转,然后更新边界框视觉效果。

从下面可以看出,左边的边界框并不代表实际的边界,但是右边的边界框却代表了实际的边界。

问题是我需要线路的真实客户端边界,无论其方向如何。这在 Firefox 中运行良好。有谁知道当一条线特别有一个时获取或计算边界的另一种方法transform rotate?

我在这里发布了此内容的副本:getBoundingClientRect() + "transform:rotate()" 在 Chrome 中存在 bug? https://stackoverflow.com/questions/69237400/getboundingclientrect-transform-rotate-is-bugged-in-chrome。为了帮助有类似问题的人,但后来决定实际上询问社区。

铬:v100.0.4896.75

该错误现已报告给 cromium 错误板:https://bugs.chromium.org/p/chromium/issues/detail?id=1314959 https://bugs.chromium.org/p/chromium/issues/detail?id=1314959

UPDATE:我已经添加了相同的 2 条静态线和直接transform属性旋转 40deg,2 个 div 代表“getBoundingClientRect”。左框显然没有显示包含整个元素的最小矩形。

UPDATE 2包括一个BBox视觉为蓝色。getBBox()在任何旋转变换之前,简单地计算子元素相对于 SVG 元素本身的边界。getBoundingClientRect确实正确计算变换,但正在使用BBox,这里有它自己的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=377665 https://bugs.chromium.org/p/chromium/issues/detail?id=377665

let l = [1,2,3,4,5,6].map(d => document.getElementById(`line${d}`)),
  vis = [1,2,3,4,5,6].map(d => document.createElement(`div${d}`)),
  bboxvis = [1,2,3,4,5,6].map(d => document.createElement(`div${d}`)),
  r = 0;

vis.map((element) => {
  document.body.appendChild(element)
  element.style.position = "absolute"
  element.style.border = "1px solid green"
  element.style.background = `#0FF0002e`
})
bboxvis.map((element) => {
  document.body.appendChild(element)
  element.style.position = "absolute"
  element.style.border = "1px solid blue"
  element.style.background = `#0000FF2e`
})

let updateBounds = (element, displayElement, bboxvisEl) => { 
  let rect = element.getBoundingClientRect(),
    svgBounds = element.parentElement.getBoundingClientRect(),
    bbox = element.getBBox(),
    d = document.documentElement;
  displayElement.style.top = rect.y+d.scrollTop+"px"
  displayElement.style.left = rect.x+d.scrollLeft+"px"
  displayElement.style.width = rect.width+"px"
  displayElement.style.height = rect.height+"px"
  bboxvisEl.style.top = bbox.y+svgBounds.y+d.scrollTop + "px"
  bboxvisEl.style.left = bbox.x+svgBounds.x+d.scrollLeft +"px"
  bboxvisEl.style.width = bbox.width+"px"
  bboxvisEl.style.height = bbox.height+"px"
}

[3,4,5].forEach(i => {
    updateBounds(l[i], vis[i], bboxvis[i]);
  bboxvis[i].style.transform = `rotate(40deg)`;
})

setInterval(() => { 
  [0,1,2].forEach(i => {
    l[i].setAttribute("transform", `rotate(${r} 80 80)`);
    bboxvis[i].style.transform = `rotate(${r}deg)`;
    updateBounds(l[i], vis[i], bboxvis[i]);
  })
  r++; 
  if(r===360) r=0;
}, 20)
.container {
  width:140px;
  height:140px;
  display:inline-block;
}
<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="40" y1="40" x2="120" y2="120" stroke="black" stroke-width="2"></line>
  <line x1="40" y1="40" x2="120" y2="120" id="line1" stroke="red" stroke-width="2"></line>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="80" y1="30" x2="80" y2="130" stroke="black" stroke-width="2"></line>
  <line x1="80" y1="30" x2="80" y2="130" id="line2" stroke="red" stroke-width="2"></line>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="60" y1="30" x2="100" y2="130" stroke="black" stroke-width="2"></line>
  <line x1="60" y1="30" x2="100" y2="130" id="line3" stroke="red" stroke-width="2"></line>
</svg>
<br/>

<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="40" y1="40" x2="120" y2="120" id="line4" stroke="red" stroke-width="2" transform="rotate(40 80 80)"></line>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="80" y1="30" x2="80" y2="130" id="line5" stroke="red" stroke-width="2" transform="rotate(40 80 80)"></line>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" class="container">
  <line x1="60" y1="30" x2="100" y2="130" id="line6" stroke="red" stroke-width="2" transform="rotate(40 80 80)"></line>
</svg>

None

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

SVG getBoundingClientRect() + “transform:rotate()”在 Chrome 中以一种非常具体的方式出现错误 的相关文章

随机推荐

  • Visual Studio UML 类图生成器

    我想知道是否有一个软件可以从 Visual Studio 2008 Professional 中的项目文件 C 生成 UML 类图 就像某种插件 我查了以前的帖子 乍一看没有看到任何有用的东西 编辑 我找到了类图项目 但愿意接受更多提示 编
  • 表的每一行的字符串偏移“Data_length”/“Index_length”非法

    学习 PHP mySQL 等 当我使用 xampp 使用 phpmyadmin 创建表时 每一行都会出现此错误 libraries classes Controllers Table TableStructureController php
  • 使用 Powershell 删除重复文件

    我有几千个重复文件 例如 jar 文件 我想使用 powershell 来 递归搜索文件系统 查找重复项 仅通过名称或校验和方法或两者兼而有之 删除除一个之外的所有重复项 我是 powershell 的新手 我将其扔给可能能够提供帮助的 P
  • JQuery 添加点击事件到单选输入文本

    我想要与单选按钮 热门 相关的标签 我开始使用 siblings 方法来实现这一点 我想一定有更好的方法 单选按钮上的单击事件如下所示 RadioButton click function event var questionId this
  • 从 C (Visual Studio) 调用 C++ 类成员函数

    我需要从 C 程序调用 C 成员函数 我在 C 代码中创建了 cpp h 包装器文件 包装了 C 成员函数 即 wrapper cpp include wrapper h extern C void wrap member1 Class m
  • 超出范围

    理想情况下 我想这样做 w 4px media max width 900px r 3px media min width 900px r 5px myclass border radius w r 这不会编译 因为 r没有在我定义的范围内
  • C#中检查线程是否正在运行

    我在 C 代码中创建了一个名为 ZipFolders 的函数 事实上 我是从 Unity 按钮调用它的 当按下它时 尝试将文件夹压缩到目录中 因为同时我想做其他事情 所以我尝试在新线程中调用该函数 我的问题是如何检查该线程是否正在运行或已停
  • 如何处理 JavaScript 中的“未定义”[重复]

    这个问题在这里已经有答案了 可能的重复 检测 JavaScript 中未定义的对象属性 https stackoverflow com questions 27509 detecting an undefined object proper
  • 为什么 Google Analytics 事件不从 onSubmit 发送?

    我想跟踪用户使用 Analytics 事件下载文件的频率 但即使事件似乎已发送 跟踪 gif 似乎并未正确到达 要下载文件 用户需要填写一份简短的表格 输入到此表单中的信息由该功能检查checkSubmit 返回false当输入的信息无效或
  • 如何在加壳器配置期间将文件复制到主机?

    我想在打包程序配置期间生成公共 私有 ssh 密钥对并将文件复制到主机 有没有办法使用打包程序将文件从虚拟机复制到主机 我想到了 文件提供程序有一个 方向 选项 允许下载而不是上传 type file source app tar gz d
  • 构建不以文件为中心的系统

    我们有一个软件基础设施 其工作方式与软件构建系统非常相似 从不同来源收集信息并用于生成一些输出 就像在传统的软件构建中一样 我们有不同类型的输出 依赖树等 主要区别在于我们的来源 中间结果和输出本质上并不是基于文件的 相反 它们是 唯一可寻
  • 不工作

    以下超链接不起作用 但当您单击 在新选项卡中打开 按钮时它会起作用 div class span12 category products style margin 0 auto div class toolbar div class row
  • 我应该使用 mysql_real_escape_string 转义预期的整数值还是可以只使用 (int)$expectedinteger

    使用cast int 代替转义是否安全 class opinion function loadbyopinionid opinionid opinionid int opinionid mysql query select from fe
  • 为什么这个数组没有索引?

    我试图将元素排序到我以这种方式构建的二维数组中 但是当代码到达二维数组时 我收到错误 数组超出索引 var categoryTempArray ProductCatalogue func sortinOut var i 0 var j 0
  • 使用prepareForSegue方法时IBOutlet属性不会更新

    我在将值传递给destinationViewController的IBOutlet属性时遇到问题 但它在普通属性上工作正常 请参阅下面的代码 void prepareForSegue UIStoryboardSegue segue send
  • 固定可滚动表格的标题

    这是一个带有固定行和列的表格 我也试图通过固定标题来改进它 IE 当您滚动表格时 标题不应滚动 它应该永久可见 是否可以 我已经尝试过了caption side top outside but top outside仅适用于 Firefox
  • 从 HTMLElement 获取 google.maps.Map 实例

    我的页面上有一张现有地图 我可以使用类似于 document getElementById 的方法来选择该元素来获取 HTMLElement javascript 对象 是否可以获取初始化地图时创建的 google maps Map 实例
  • 应用程序被终止时如何从 Firebase 向设备发送消息? [复制]

    这个问题在这里已经有答案了 我正在尝试熟悉 Firebase 通知 它工作正常 但当应用程序未打开时 我只能从通知控制台接收消息 我知道文档说 如果您的应用程序位于前台或后台 您可以在 onMessageReceived 方法中接收消息 否
  • Java 程序是否有可能比 C 中的相同程序(优化)更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有关您编写的代码的问题必须描述具体问题 and 包含有效代码重现它 在问题本身中 看SSCCE org http sscce org 以获
  • SVG getBoundingClientRect() + “transform:rotate()”在 Chrome 中以一种非常具体的方式出现错误

    getBoundingClientRect 在所有 SVG 元素上都可以正常工作 但在 Chrome 中旋转元素的情况除外 下面我画了两条线 左边的一条是对角线 右边的线从垂直开始 如黑线所示 绿色框是 getBoundingClientR