獲得正確的svg鼠標座標很棘手。首先,常用的方法是使用event屬性的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;
而且不是很好的思考是,在某些瀏覽器border屬性也轉向座標,和其他沒有。我發現,如果事件屬性的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;
}
該解決方案可用於點擊,鼠標移動,鼠標按下,...等等。 您可以在此處進行實時演示:https://codepen.io/martinwantke/pen/xpGpZB
您必須使用變換矩陣來獲取正確的座標。一個jsfiddle會有幫助。 – mihai 2012-04-24 13:25:46