웹 페이지를 볼 때 움직이는 요소가 버벅거리고, 브라우저의 동작이 느려지는 경우가 있다. 이러한 현상을 해결하기 위한 방법들을 정리해보자.
Reflow
Reflow란 렌더링 엔진에서 요소를 배치하는 과정을 말한다. 렌더링 엔진에 의해 브라우저가 렌더링 될 때 DOM트리와 스타일 규칙을 합쳐 렌터 트리를 만들고 Reflow를 통해 각각의 요소들의 레이아웃을 위치시킨다.
Repaint
Repaint 는 렌터 트리가 탐색되고 paint메서드가 호출되어 UI 기반의 구성요소를 사용해 그리는 과정이다.
위의 두 과정을 줄인다면 CSS성능을 조금 더 최적화할 수 있다고 한다. Reflow와 Repaint가 어떤 상황에 일어나는지 스타일 적용 과정을 보고 확인해보자.
1. Style : 브라우저가 객체에 적용할 스타일의 값을 계산 및 재계산
2. Layout : 브라우저가 객체의 모양과 위치 생성
width
, height
, padding
, margin
등 3. Paint : 브라우저가 객체 영역의 픽셀을 채움
color
, background
, background-image
, box-shadow
등4. Composite : 브라우저 레이어순으로 객체를 화면에 그림
opacity
, transform
, rotate
, scale
위의 순서에 따라 Layout 속성을 변경하면 paint composite 순서를 거치기 때문에 성능이 저하되고 이를 Reflow라고 한다. paint 속성만을 변경한다면 composite 순서를 거치고 성능 저하가 일어나며 이를 Repaint 라고 한다.
composite 속성만 변경한다면 최대한 적은 순서를 거칠 수 있으므로 최대 성능을 위한다면 composite 속성만 변경하는걸 권장한다.
리플로우와 리페인트는 완전히 피할수는 없어 보인다. 하지만 최적화가 가능하다면 최대한 방법을 알고 줄이는게 현명하다.
무엇이 Reflow를 유발시키는가?
Reflow를 피하거나 영향을 최소화 하는 방법
애니메이션을 만들 때 Reflow를 유발하는 top,left 를 조절하는 대신 Composite 단계만 거치는 transform 속성을 이용해 translate로 애니메이션을 구현할 수 있다.
이때 translate3d
,translateZ
, rotate3d
, scale3d
옵션 등을 활용하면 GPU를 사용해 하드웨어 가속을 하게 된다. translate()보다 더 좋은 성능을 원한다면 3d 옵션을 활용해 보는것을 추천한다.
안녕하세요, 제로베이스 프론트엔드스쿨 멘토입니다. 작성해주신 글 잘 읽었고, 앞으로의 더 나은 블로깅을 응원하는 마음에서 작은 의견을 남기고 갑니다 :)
감사합니다!