【问题标题】:Click event coordinates in SVGSVG中的单击事件坐标
【发布时间】:2019-02-21 04:32: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 元素。
  • 在多边形中时,坐标为 基于&lt;g&gt; 组的原点及其translate 偏移量 (即黑色钻石)。负坐标是可能的, 与 Chrome 或 Firefox 不同。
  • 我观察到了不同的行为 这些浏览器中的文本元素:它们会根据 文本元素的底部中间。但我无法做到 在小提琴中重现这个;在小提琴文本元素的行为 与这些浏览器中的多边形相同。

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

【问题讨论】:

标签: javascript jquery svg click dom-events


【解决方案1】:

我在您的代码中添加了一个函数来检测 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 中鼠标检测的更多信息,我推荐这本书:Using SVG with CSS3 and HTML5: Vector Graphics for Web Design

希望对你有帮助。

【讨论】:

  • 您有 2,279 票,而且您从未投过反对票!哇!惊人的!你是我认识的第一个知道这个结果的人! ?
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2015-02-10
相关资源
最近更新 更多