正しいsvgマウス座標を取得するのは難しいです。まず第一に、共通の方法は、イベントプロパティのclientXとclientYをそれぞれgetBoundingClientRect()とclientLeftで減算し、それぞれclientTopを使用することです。 SVGはゼロより大きいパディングスタイル情報を有する場合
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;
}
しかし、座標がシフトされます。したがって、この情報は、substractでなければなりません:
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;
}
このソリューションは、click、mousemove、mousedownなどに使用できます。 ここでライブデモにアクセスできます。https://codepen.io/martinwantke/pen/xpGpZB
正しい座標を取得するには、変換行列を操作する必要があります。 jsfiddleが役に立ちます。 – mihai