【发布时间】:2014-01-06 19:23:51
【问题描述】:
我正在尝试根据鼠标的位置在 SVG 元素上动态绘制内容。不幸的是,我很难将鼠标坐标从 mousemove 事件转换到 SVG 元素的坐标空间。
这是我一直在测试的一个有问题的函数:
CylinderDemo.prototype.handleMouseMove = function(evt)
{
debugEvent = evt;
var bcr = evt.target.getBoundingClientRect();
var x2 = evt.clientX - bcr.left;
var y2 = evt.clientY - bcr.top;
console.log(evt.target);
//console.log(evt.clientY+" - "+evt.target.getBBox());
var d = this.pathForCylinder(this.x0, this.y0, x2, y2, 30);
this.cap.setAttributeNS(null, "d", d);
}
canvas.onmousemove = function(evt) {
self.handleMouseMove(evt);
}
问题是(至少在 Firefox 中)getBoundingClientRect() 没有给我 SVG 对象的边界。它为我提供了 SVG 对象内的可绘制对象的边界。当您将鼠标悬停在 firebug 中的日志行上时,它会变得非常明显,它会突出显示可绘制元素的微不足道的子矩形。这意味着我的坐标变换给出了有缺陷的结果。
我应该使用什么技术从事件坐标系转换到 SVG 容器的坐标系?
我只是拼凑了http://jsfiddle.net/7kvkq/ 来说明问题。
【问题讨论】:
-
重新生成路径命令以偏移路径非常麻烦。相反,我建议对路径应用转换(您可以通过 DOM0
setAttribute('transform',theRightString)或通过使用 SVG DOM 创建/修改专为拖动而设计的转换来实现。
标签: javascript svg