React/React 실습
[React] ResizeObserver로 이미지 주석 입력창의 위치 오류 해결하기
haheehee
2025. 6. 10. 17:16
728x90
1. 문제 상황 및 원인 분석
이미지 기반 주석 입력창의 위치를 잡기 위해 paperRef의 clientWidth/Height를 참조했으나, 렌더링 시점 차이 및 DOM 변경에 따른 미세한 오차로 인해 입력창이 중앙에서 어긋나는 문제가 발생했다.
2. 시행착오 및 중간 시도들
- style 안에서 직접 clientWidth 계산식 사용
- 초기 useEffect 내에서 수동 측정
- 결과적으로 ResizeObserver 도입
3. 이전 코드
style={{
width: paperRef?.current?.clientWidth
? paperRef.current.clientWidth + 8 + 'px'
: undefined,
height: paperRef?.current?.clientHeight
? paperRef.current.clientHeight + 8 + 'px'
: undefined,
}}
4. 개선 후 코드
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
const el = paperRef.current;
if (!el) return;
const resizeObserver = new ResizeObserver(() => {
setSize({
width: el.clientWidth + 8,
height: el.clientHeight + 8,
});
});
resizeObserver.observe(el);
return () => resizeObserver.disconnect();
}, []);
...
style={{
width: `${size.width}px`,
height: `${size.height}px`,
}}
5. 정리 및 교훈
- DOM 크기는 언제든 변할 수 있으므로 실시간 추적이 필요
- ResizeObserver는 이미지, PDF, canvas 등 변동 요소에 적합
- 복잡한 계산은 style 안에서 하지 말고 변수나 상태로 분리
728x90