피드로 돌아가기
Dev.toFrontend
원문 읽기
Hidden Mirror Element 기반의 Textarea Soft Wrap 정밀 감지 구현
How to Detect Word Wrap in Textarea JavaScript
AI 요약
Context
Textarea의 Soft Wrap은 Rendering Layer의 영역으로 DOM Value에 반영되지 않는 제약 존재. 기존 scrollHeight 기반 계산 방식은 Padding, Box-sizing, Window Resize 등 CSS 환경 변화에 따라 Line Count 오차가 발생하는 한계점 노출.
Technical Solution
- Textarea와 동일한 Font Metrics 및 Box Model을 가진 Hidden Mirror Div를 생성하여 레이아웃 동기화
- window.getComputedStyle을 통해 Width, Line-height, Padding 등 렌더링 결정 요소를 실시간 복제
- CSS white-space: pre-wrap 속성을 적용하여 브라우저의 기본 Wrapping 알고리즘을 그대로 활용
- Mirror Element의 scrollHeight를 Line-height로 나누어 정밀한 Visual Line Count 산출
- Canvas API의 measureText 방식 대비 Unicode segmentation 및 CJK 규칙 등 복잡한 Wrapping 로직 직접 구현 비용 제거
- getClientRects의 Shadow Tree 접근 불가 제약을 병렬 DOM 구조 설계를 통해 극복
실천 포인트
- Textarea의 텍스트 래핑 감지 시 scrollHeight 단독 사용 지양 - Mirror Element 생성 시 Stacking Context 일치를 위해 부모 요소 내부에 배치 권장 - 메모리 누수 방지를 위해 컴포넌트 Unmount 시 Mirror Element의 명시적 destroy 처리 - Line Count를 Derived State로 관리하여 UI 업데이트 최적화