SVG 中的单击事件坐标

2023-11-30

该 HTML 包含 SVG:

<div class="container">
  <div class="spacer"></div>
  <svg>
    <g id="polygonGroup" transform="translate(80, 50)">
      <polygon points="-60,-10 -35,-30 -10,-10 -10,30 -60,30"></polygon>
      <polygon points="10,-10 35,-30 60,-10 60,30 10,30"></polygon>
      <polygon class="origin" points="-4,0 0,4 4,0 0,-4"></polygon>
    </g>
    <g id="textGroup" transform="translate(80, 50)">
      <text x="-35" y="10">Text</text>
      <text x="35" y="10">Text</text>
    </g>
  </svg>
</div>

以及这个简单的 jQuery 单击事件处理程序:

function clicked(event) {
    console.log(event.offsetX, event.offsetY);
}

$('svg').click(clicked);

如这里所示:https://jsfiddle.net/1ht0L8y6/6/在不同的浏览器中有不同的行为:

Chrome:无论我在 SVG 内部单击什么位置,坐标都基于 SVG 元素的左上角。这就是我想要的行为。

Firefox:坐标基于我所在的任何元素的左上角,该元素可能是 SVG、多边形或文本。

IE 和 Edge:

  • 当位于 SVG 中但不在其任何子元素中时,坐标 基于 SVG 元素。
  • 当在多边形中时,坐标是 基于的起源<g>集团,以其translate抵消 (即黑钻石)。这样负坐标是可能的, 与 Chrome 或 Firefox 不同。
  • 我观察到不同的行为 这些浏览器中的文本元素:它们会根据以下内容给出坐标 文本元素的底部中间。但我没能做到 在小提琴中重现这一点;在小提琴文本元素中表现 与这些浏览器中的多边形相同。

什么是可靠的跨浏览器方式来获取点击坐标?


我已在您的代码中添加了一个函数来检测 SVG 中的鼠标位置。

let svg = document.querySelector('svg')

function clicked(event) {
  let m = oMousePosSVG(event);
    console.log(m.x,m.y);
}

svg.addEventListener("click", clicked)


function oMousePosSVG(e) {
      var p = svg.createSVGPoint();
      p.x = e.clientX;
      p.y = e.clientY;
      var ctm = svg.getScreenCTM().inverse();
      var p =  p.matrixTransform(ctm);
      return p;
}
svg{border:1px solid}
<div class="container">
  <div class="spacer"></div>
  <svg>
    <g id="polygonGroup" transform="translate(80, 50)">
      <polygon points="-60,-10 -35,-30 -10,-10 -10,30 -60,30"></polygon>
      <polygon points="10,-10 35,-30 60,-10 60,30 10,30"></polygon>
      <polygon class="origin" points="-4,0 0,4 4,0 0,-4"></polygon>
    </g>
    <g id="textGroup" transform="translate(80, 50)" fill="red">
      <text x="-35" y="10">Text</text>
      <text x="35" y="10">Text</text>
    </g>
  </svg>
</div>

要了解有关 SVG 中鼠标检测的更多信息,我推荐这本书:将 SVG 与 CSS3 和 HTML5 结合使用:用于网页设计的矢量图形

我希望它有帮助。

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

SVG 中的单击事件坐标 的相关文章

  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • JQuery UI Selectable 插件:当 div 溢出时使滚动条不可选择

    我有一个 div 设置为overflow auto 该 div 的内容是可选择的 使用 jQuery UI 当 div 溢出并出现滚动条时 滚动条本身变为可选择状态 因此滚动效果不佳 在 FF Chrome 中 我可以滚动 div 但我得到
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 为什么 setTimeout 在 Chrome 中触发两次,而在 IE 或 Firefox 中则不然?

    有人能告诉我为什么 javascript 函数 生成新号码 在 Chrome 中触发两次 但在 IE 或 Firefox 中则不会 使用 Chrome 20 0 1132 57 IE9 和 Firefox 13
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 改变 JavaScript 中的顶部填充

    以下是我在 css 中设置顶部填充的方法 body font size font size px margin 0 padding 100px 0 20px 0 width 100 important 如何使用最简单的 javascript
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 覆盖 jQuery 验证 MVC4 中的默认设置

    要覆盖查询验证插件 请在文件 http docs jquery com Plugins Validation validate toptions 推荐的方式是 selector validate invalidHandler functio
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • JS D3 textPath 不显示

    我有下面的代码 想知道为什么不显示文本路径 有人可以帮忙吗 var areas svg append g selectAll path data chord groups enter append path style fill funct
  • 测试 JavaScript 中的“双重”相等性

    我翻译了实验性的 C float 版本快船库到 JavaScript 在最新的沙盒版本中有一个功能几乎等于这似乎很难翻译 由于数值稳定性问题 无法使用 运算符比较双重相等 因此需要此函数来处理这些问题 9223372036854775808
  • Karate BDD中提取带双引号的json数据

    如何从下面的 json 响应负载中提取身份验证令牌以在后续请求中使用 似乎我遇到了麻烦 因为键值中的键有双引号 特征 test oauth背景 网址https xxx yyy com设想 Get xxx subject给定路径xxx oau
  • Android 在 webview 中播放 youtube 视频 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想在 WebView 中播放 YouTube 视频或 当用户单击 YouTube 视频时 我必须将其转发到真正的 YouTube 应用程序 因为在 WebView 中我无法播放
  • 用于 CGM(计算机图形图元文件)格式的 .NET 或 C# 库?

    有谁知道用于在 WinForms 和 Microsoft Service Reports CrystalReports 中显示 CGM 文件以便也可以打印的 NET C 库 如果它还能够将文件转换为网络友好的图形格式 如 jpeg gif
  • C# 合并运算符

    为什么下面的代码返回 false public static void Main bool someCondition true bool someConditionOverride false bool result someCondit
  • 在 Android 上将 UTC 转换为本地时间

    在我的项目中 我获得了 json 格式的 API 响应 我得到一个 UTC 时间格式的时间字符串值 如下所示Jul 16 2013 12 08 59 AM 我需要将其更改为当地时间 这就是我们使用此应用程序时需要显示当地时间的地方 我该如何
  • 如何确保修改 .h 文件时,包含该文件的 .cc 文件会在使用 Visual Studio 2008 的发布版本中自动编译?

    假设我的 Visual Studio 2008 项目中有 a h a cc 和 b cc a cc 和 b cc 都包含 a h 当我修改 a h 并构建项目时 a cc 和 b cc 在调试版本中进行编译 然而 在发布版本中情况并非如此
  • 虚函数效率和“final”关键字

    考虑一个有类的程序Foo包含一个函数Foo fn声明如下 virtual void fn 和一个子类Foo called Bar 将会声明Bar fn像这样 virtual void fn override final 导致呼叫fn in
  • 找不到导入tuneup.js文件

    使用 Xcode iOS Instruments UI Automationtunup js javascript 库https github com alexvollmer tuneup js 我在理解我启动的仪器的当前工作目录方面遇到了
  • 更新自定义字段结束于无限循环

    我在 AR 发票和备忘录 屏幕 ID AR301000 中有一个对应 AP 参考的自定义字段 Nbr 在类似的管理器中 AP 账单和调整 屏幕 ID AP301000 中的另一个自定义字段对应于相应的 AR 参考 Nbr 我正在尝试更新 A
  • 如何在 C# 中从数据库检索时将 varBinary 转换为图像或视频

    我正在使用 Visual Studio 2010 桌面应用程序 并使用 LINQ to SQL 将图像 视频或音频文件保存到 dataType 中的数据库VarBinary MAX 我可以做到这一点 问题是 我无法获取它们并在 xaml 中
  • 使用VBS下载文件

    我有一个 VBS 脚本 可以生成一个 URL 以从网络上的服务器下载文件 我现在需要将文件下载到 C rWallpaper wallpaper png URL 存储在变量中 url 我希望它能像 Linux 上的 wget 一样工作 只需下
  • JVM的LookupSwitch和TableSwitch有什么区别?

    我很难理解 Java 字节码中的 LookUpSwitch 和 TableSwitch 如果我理解得好的话 LookUpSwitch 和 TableSwitch 都对应于switchJava 源代码声明 为什么一条 JAVA 语句会生成 2
  • 为什么这里没有生成 Coredump 文件?

    我这里遇到一种情况 几天前我能够在目标板上看到核心转储文件 我通过在 etc profile 中添加 ulimit c unlimited 来启用核心转储生成 但后来有人告诉我 这会only对从登录 shell 启动的程序有效 对由以下命令
  • Hibernate 拦截器 - 加载事件之后

    实体加载后是否发生任何事件 我的目标是将这个实体添加到 Solr 或 Lucene 索引中 EmptyInterceptor OnLoad 事件发生在对象初始化之前 我想在设置对象属性后处理事件 是否可以使用 Hibernate 拦截器或其
  • Java - 使用 catch 块内的方法返回语句并引发异常?

    我有以下代码 使用 hibernate 在错误时引发自定义异常 并且我还想在这种情况下关闭会话 因为除非在客户端计算机上接收到 否则不会捕获异常 public
  • 如何将 Google 表格文件转换为 Excel 文件 (XLSX)

    The image shows the code who is updated var xlsFile 未定义 为什么 如何使用 Google Sheets 脚本编辑器将 Google Sheets 文件转换为 Excel 文件 funct
  • 无效签名错误!

    我正在尝试更新我的应用程序 但上传二进制文件后 Itunes connect 向我发送了以下电子邮件 尊敬的开发者 感谢您的 最近提交的 我的应用程序 的二进制文件 到应用商店 不幸的是我们 发现您的二进制文件存在问题 您需要按顺序更正 以
  • SVG 中的单击事件坐标

    该 HTML 包含 SVG div class container div class spacer div div