【发布时间】:2018-10-18 23:39:22
【问题描述】:
使用 D3 v4、SVG 和缩放行为,在 mousemove 上,我想在 SVG 的坐标系中显示鼠标坐标。
mousemove 事件似乎只提供客户端/屏幕坐标。
如何将这些坐标转换为反映当前缩放/平移/等变换的 SVG 坐标?
我可以看到使用轴/刻度/等的示例,但我没有创建图表,也没有使用轴/等 - 我使用 D3.js 制作交互式图表。
我已经尝试过 crateSVGPoint/getScreenCTM 方法,但是 (a) 并不真正理解它,因此不确定如何将它应用到我的代码中,并且 (b) 当我缩放/平移时它似乎不起作用- 我只是得到客户端/屏幕坐标。 EG:这是我的 mousemove 事件中转换为 SVG 坐标的代码:
var theSvg = document.getElementById('svgItem');
var pt = theSvg.createSVGPoint();
var cursorPoint = function(evt){
pt.x = evt.clientX; pt.y = evt.clientY;
return pt.matrixTransform(theSvg.getScreenCTM().inverse());
}
var loc = cursorPoint(d3.event);
//the pair of co-ordinates should be different on zoom, but aren't
d3.select(".statusBarText").text("move (" + d3.event.x + "," + d3.event.y + ") (" + loc.x + "," + loc.y + ")");
对于它的价值,缩放行为应用于 SVG 元素的 SVG 组元素。缩放效果很好;我可以看到正在应用于组的翻译/缩放。
我尝试修改上述内容以在已转换的组元素上调用 createSVGPoint(),但出现有关 createSVGPoint() 不是函数的错误;我猜这仅适用于 DOM 中的 SVG 元素...
我正在使用的 SVG 元素上还设置了一个 viewBox,如果这有所不同的话。
肯定有一种简单的方法来进行转换吗?
【问题讨论】:
标签: javascript d3.js svg zooming