You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在D3.js版本4中获取相对于元素原点的(x,y)坐标?

获取D3 v4+中相对于元素的鼠标坐标

嘿,这个问题我之前也踩过坑!D3 v4确实对鼠标坐标相关的API做了不小的重构,原来v3里顺手的d3.mouse(this)直接用不了,核心原因就是API的参数要求变了。

错误原因解析

你碰到的't.getBoundingClientRect is not a function'报错,本质是D3 v4+的d3.mouse()要求传入的必须是真实的DOM元素。如果你的代码里this指向的不是DOM元素(比如用了箭头函数导致上下文改变,或者误传了d3选择集对象),就会触发这个错误。

简便解决方案:用d3.pointer()

D3 v4专门新增了d3.pointer()方法,完美解决这类相对坐标需求,完全不用手动计算偏移量,用法超直接:

// 给目标元素绑定鼠标移动事件
d3.select(".your-target-element").on("mousemove", function(event) {
  // 获取相对于当前元素左上角的(x, y)坐标
  const [x, y] = d3.pointer(event, this);
  // 这里直接用x和y就可以啦
  console.log("元素相对坐标:", x, y);
});

如果你的代码习惯用箭头函数(这时候this不再指向DOM元素),可以先获取元素的DOM节点再传入:

const targetElement = d3.select(".your-target-element").node();
d3.select(".your-target-element").on("mousemove", (event) => {
  const [x, y] = d3.pointer(event, targetElement);
  console.log("元素相对坐标:", x, y);
});

为什么不推荐继续用d3.mouse()?

虽然v4里d3.mouse()还存在,但它的用法限制更多,必须严格传入DOM元素;而d3.pointer()是官方更推荐的新方法,不仅支持鼠标事件,还兼容触摸事件,适用性更广。

内容的提问来源于stack exchange,提问作者Jelmer Dijkstra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:12:21