onAnimationStart
요소가 DOM에 붙고 보이기 시작하는 첫 프레임 직전/직후에 호출됩니다. 위치 계산, 초기 스타일 세팅, 포털(appendTo) 이동 같은 초기화 작업에 적합합니다.
onShow
진입 애니메이션이 완전히 끝난 뒤(레이아웃/크기 확정) 호출되는 콜백.
React에선 보통 animationend/transitionend 이벤트나 컴포넌트 라이브러리의 after-open 콜백으로 대응합니다.
스크롤 정렬, 포커스 이동, 키보드 접근성 등 사이즈 의존 작업에 적합합니다.
공통점
- 둘 다 컴포넌트의 표시(show) 과정에서 실행되는 이벤트입니다.
- 주로 Popover, Dialog, OverlayPanel, Dropdown 같은 컴포넌트에서 쓰입니다.
- UI 요소가 열릴 때 특정 동작을 수행하고 싶을 때 사용합니다
차이점
(onAnimationStart)
- 애니메이션이 시작될 때 호출됩니다.
- DOM이 생성되고, 화면에 표시되기 시작하지만 애니메이션이 끝나기 전입니다.
- 따라서 레이아웃 측정이나 초기 위치 설정 같은 작업에 유리합니다.
<p-overlayPanel
#menu
(onAnimationStart)="setMenuOverlayPosition(menuButtonRef, bottomBarRef)"
>
</p-overlayPanel>
setMenuOverlayPosition(menuButton: ElementRef, bottomBar: ElementRef) {
// Overlay 위치 조정 (DOM이 이미 생성되었지만 애니메이션은 아직 진행 중)
}
(onShow)
- 애니메이션이 끝나고, 최종적으로 컴포넌트가 화면에 완전히 표시된 후 호출됩니다.
- 이 시점에는 컴포넌트의 크기와 위치가 모두 확정된 상태.
- 따라서 스크롤 이동, 포커스 처리, 특정 엘리먼트 중앙 정렬에 적합합니다.
<p-overlayPanel
#episodeList
(onShow)="scrollToCurrentEpisodeCenter()"
>
</p-overlayPanel>
scrollToCurrentEpisodeCenter() {
// 현재 선택된 Episode를 중앙으로 스크롤
}
계산/배치 = onAnimationStart, 인터랙션/스크롤 = onShow
실행 순서
- onAnimationStart → 컴포넌트가 뜨기 시작 (레이아웃 계산 가능)
- 애니메이션 진행 중…
- onShow → 컴포넌트가 다 뜬 상태 (스크롤/포커스 가능)
예제
<p-overlayPanel
#menu
(onAnimationStart)="setMenuOverlayPosition(menuButtonRef, bottomBarRef)"
(onShow)="scrollToCurrentEpisodeCenter()"
(onHide)="onEpisodeListHide()"
>
</p-overlayPanel>
- onAnimationStart → Overlay 위치 계산
- onShow → 현재 아이템 스크롤 중앙 정렬
- onHide → 상태 초기화
왜 둘을 나눠 써야 하나?
오버레이(예: Popover, Dialog, Drawer)는 보이지 않는 상태에서 DOM 추가 → 애니메이션 시작 → 애니메이션 종료의 과정을 거칩니다.
- DOM 부착(attach): 실제 노드가 문서에 추가됨.
- 애니메이션 시작(onAnimationStart): 보이기 시작. 이때 초기 위치/스타일을 세팅.
- 레이아웃 안정화: 브라우저가 레이아웃과 페인트를 진행.
- 애니메이션 종료(onShow에 해당): 최종 크기/위치가 확정. 이때 스크롤/포커스/ARIA 등 상호작용 준비.
차이는 요소 크기/레이아웃의 안정성입니다.
시작 시점은 내부 컨텐츠의 실제 높이/폭이 아직 변할 수 있지만, 종료 시점은 측정 결과가 신뢰 가능합니다.
'개발 공부' 카테고리의 다른 글
| DFS, BFS (0) | 2025.10.08 |
|---|---|
| Getter, Setter (0) | 2025.09.30 |
| Navigation State (0) | 2025.09.27 |
| bind (0) | 2025.09.24 |
| Hoisting(호이스팅) (0) | 2025.09.21 |