HTML Canvas Element에 커서 위치와 실제 그림이 그려지는 위치가 다름
원래 코드
const getCoordinates = (
event: React.MouseEvent<HTMLCanvasElement>
): Coordinate | undefined => {
if (!canvasRef.current) {
return;
}
const canvas: HTMLCanvasElement = canvasRef.current;
return {
x: event.pageX - canvas.offsetLeft,
y: event.pageY - canvas.offsetTop,
};
};
**pageX
**와 **pageY
**는 문서 전체에서의 마우스 좌표를 나타내는 반면, **clientX
**와 **clientY
**는 뷰포트(viewport) 내에서의 마우스 좌표를 나타냄. 따라서 **clientX
**와 **clientY
**를 사용하여 뷰포트 내에서의 마우스 좌표를 구해야 하는 것이었음.
변경된 코드
const getCoordinates = (
event: React.MouseEvent<HTMLCanvasElement>
): Coordinate | undefined => {
if (!canvasRef.current) {
return;
}
const canvas: HTMLCanvasElement = canvasRef.current;
const rect = canvas.getBoundingClientRect(); // 캔버스의 뷰포트 상의 위치 정보를 가져옴
return {
x: event.clientX - rect.left,
y: event.clientY - rect.top,
};
};
캔버스의 뷰포트 상의 위치 정보를 가져오고, 이벤트의 기준을 pageX, pageY가 아닌 clientX, clientY로 변경해줌.
⇒ 커서와 위치가 잘 맞는다.