페인트까지 끝난 레이어들을 순서대로 겹쳐 최종 화면을 만드는 렌더링 파이프라인의 마지막 단계. transform과 opacity는 (요소가 자기 레이어에 있으면) 이 단계만으로 처리할 수 있어서 리플로우와 리페인트를 모두 건너뛴다.
translate가 리플로우를 일으키지 않는 이유
left: 100px은 요소의 실제 위치를 바꾼다. 다른 요소의 배치에 영향을 줄 수 있으니 레이아웃을 다시 계산해야 한다transform: translateX(100px)은 레이아웃에서 정해진 박스는 그대로 두고, 그려진 결과만 옮겨서 보여 준다. 레이아웃을 미루는 것이 아니라 아예 레이아웃 대상이 아니다- 그래서 애니메이션은
top·left·width대신transform과opacity로 만드는 것이 기본이다
/* 나쁨: 프레임마다 레이아웃 */
.box { transition: left .3s; }
/* 좋음: 합성만 */
.box { transition: transform .3s; }공짜는 아니다
- 요소가 자기 레이어로 올라가면 GPU(Graphics Processing Unit) 메모리를 쓴다.
will-change를 남발하거나 레이어가 많아지면 오히려 느려진다 - 레이어 안의 내용이 바뀌면 그 레이어는 다시 칠해야 한다
- 같은 원리로 레이아웃 스래싱을 피할 때도, 무한 스크롤처럼 움직임이 많은 UI에서도 transform을 먼저 떠올린다