获取正确的 svg 鼠标坐标很棘手。首先,一种常见的方法是使用事件属性的clientX 和clientY 分别用getBoundingClientRect() 和clientLeft 减去clientTop。
svg.addEventListener('click', event =>
{
let bound = svg.getBoundingClientRect();
let x = event.clientX - bound.left - svg.clientLeft - paddingLeft;
let y = event.clientY - bound.top - svg.clientTop - paddingTop;
}
但是,如果 svg 的填充样式信息大于零,则坐标正在移动。所以这个信息也必须减去:
let paddingLeft = parseFloat(style['padding-left'].replace('px', ''));
let paddingTop = parseFloat(style['padding-top'].replace('px', ''));
let x = event.clientX - bound.left - svg.clientLeft - paddingLeft;
let y = event.clientY - bound.top - svg.clientTop - paddingTop;
不太好的想法是,在某些浏览器中,边框属性也会移动坐标,而在其他浏览器中则不会。我发现,如果 event 属性的 x 和 y不可用,就会发生转变。
if(event.x === undefined)
{
x -= parseFloat(style['border-left-width'].replace('px', ''));
y -= parseFloat(style['border-top-width'].replace('px', ''));
}
在这种转换之后,x 和 y 坐标可能会超出范围,这应该是固定的。但那不是想法。
let width = svg.width.baseVal.value;
let height = svg.height.baseVal.value;
if(x < 0 || y < 0 || x >= width || y >= height)
{
return;
}
此解决方案可用于 click、mousemove、mousedown 等。您可以在这里进行现场演示:https ://codepen.io/martinwantke/pen/xpGpZB