오늘은 브라우저 리플로우에 대해서 공부해보려고 한다!
우선 리플로우에 대해 공부하려면 렌더링이라는 게 무엇인지 확실히 알 필요가 있다.
렌더링이란 무엇일까?
렌더링 과정은 다음과 같다.
리플로우란 어떤 액션이나 이벤트에 따라 html 요소의 크기나 위치 등 레이아웃 수치를 수정하면 그에 영향을 받는 모든 노드들이 Layout 과정을 다시 수행하게 되고, Render Tree와 각 요소들의 크기과 위치를 다시 계산하는 과정을 말한다.
말만 들어도 리플로우가 자주 일어나면 굉장히 많이 렌더링을 다시 하겠구나..하고 알 수 있다. 그래서 우리는 리플로우를 최소화 해야한다.
Reflow가 일어나는 대표적인 경우는 다음과 같다.
리플로우만 수행이 된다면 실제 화면에 보이지 않는다.
그래서 화면에 그려주는 작업이 필요한데 바로 그 작업이 Paint 작업이다.
Reflow가 되면 1+1처럼 RePaint 작업도 수행되는데 무조건 Reflow가 일어나야 RePaint가 일어나는 것은 아니다.
예를 들어 background-color 등과 같이 레이아웃에는 영향을 주지 않는 스타일 속성이 변경되었을 때는 Reflow를 수행하지 않는다.
리플로우와 리페인트를 어떻게 줄일 수 있을까?
여러 가지 방법들을 알아보자 !
사용하지 않는 노드에는 visibilty: invisible 보다 display: none을 사용하기
Reflow, Repaint 가 발생하는 속성 사용 피하기
리플로우가 일어나면 필연적으로 리페인트가 일어나기 때문에 가능하다면 리플로우가 일어나는 속성을 줄이고, 리페인트만 발생하는 속성을 사용하자! (근디..리플로우 속성들이 너무...피료해~..😓)
fixed positioning이 적용된 엘리먼트는 부모 엘리먼트로 부터 완전히 독립되어 다른 엘리먼트의 구애받지 않고 화면에 어디든지 원하는 위치에 자유롭게 배치될 수 있습니다.
추가적으로 아래는 구글에서 제공하는 리플로우를 최소화 하는 방법이다.⤵️
요새는 웹 브라우저의 성능이 뛰어나기 때문에 성능 개선을 잘 고려하지 않는다. 하지만 이런 기초적인 지식을 학습해놓으면 언젠간 꼭 필요한 날들이 올 거라고 믿는다! 부족한 내용이지만 읽어주셔서 감사하고 , 피드백은 언제나 환영합니당 ☺️
출처 및 참고 :
https://developers.google.com/speed/docs/insights/browser-reflow?hl=ko
https://boxfoxs.tistory.com/408