🔍 translate? position? 요소를 배치하기 위해 어떤 속성을 사용해야 할까? reflow, repaint 과정을 통해 알아보자.
transform: translate
과 position
은 모두 요소의 위치를 설정하기 위해 사용되는 속성이다. 둘 중 어느 것을 사용하더라도 화면에 나타나는 결과는 같다. 그렇다면 두 속성의 차이는 무엇일까? 그 답은 브라우저 렌더링 과정에 있다.
브라우저 렌더링은 과정을 간략하게 정리하면 HTML 파싱으로 인한 DOM 트리 생성 → CSS 파싱으로 인한 CSSOM 트리 생성 → 두 트리를 토대로한 렌더트리 생성 → 렌더트리 배치(레이아웃)와 렌더트리 그리기(페인트) → 컴포지팅으로 설명할 수 있다.
브라우저는 HTML 구조나 스타일의 변화가 있을 때 레이아웃을 먼저 잡은 후 요소를 꾸미게 된다. 변화가 생기면 렌더 트리를 재생성하고 이를 다시 그리는 작업이 reflow와 repaint이다.
reflow에선 요소의 위치와 크기가 계산 된다. position
, width
, height
, margin
, padding
, border
, display
... 등은 물론 font-family
, text-align
등 텍스트 관련 요소가 포함된다.
그 후 순차적으로 repaint가 실행된다. 요소를 꾸미는 시각적인 작업이 진행되는데 background
, box-shadow
등이 여기 포함된다. 요소 배치, 크기 등에 계산이 필요 없는 경우 reflow 과정이 생략되고 repaint 과정만 실행되기도 한다.
모든 CSS 속성이 reflow, repaint 과정을 거치는 것은 아니다. transform의 경우 두 과정이 생략되고 사용자 컴퓨터의 GPU를 사용한다. 브라우저의 부담을 덜기 위함인데 애니메이션을 구현 시 계속된 reflow-repaint 작업이 수행될 수 있기 때문이다.
다시 translate
와 position
으로 돌아가보자. 둘 중 어떤 속성을 활용할 지는 때에 따라 다르다. 정적인 사이트에서 단순히 요소의 위치를 배치하는 작업은 position
을 사용해도 reflow-repaint 과정이 반복되지 않는다. 그러나 애니메이션 등 동적으로 요소의 위치를 이동시킬 경우 position
을 사용하면 reflow-repaint 과정을 반복하게 되어 성능 이슈가 발생할 수 있다. 따라서 이 과정에는 transform: translate()
등의 속성을 사용해 reflow-repaint 반복에서 벗어나는 방법을 택하는 것이 성능 유지에 좋다.
transform: translate()
과 position
이 보기에는 같은 역할을 하니 별 생각없이 사용하곤 했다. 브라우저 렌더링 과정에서 둘이 큰 차이를 가지고 있음을 알 수 있었다..! 이번 글에서는 둘 중 어떤 것을 사용해야할까? 에 초점을 맞추었지만 브라우저 렌더링에 대해 좀 더 깊게 공부하고 이해한 내용을 앞서 정리한 URL/IP/PORT 등과 함께 다시 정리하도록 해야겠다!
브라우저 렌더링 과정에 대해서 다시 봐야겠다는 생각을 하고 있었는데 덕분에 한번 더 짚고 갑니다ㅎㅎ 다음에도 좋은 글 기대할게요✨