브라우저의 렌더링 과정을 보면 DOM트리와 CSSOM트리를 구축 후에 둘을 조합하여 렌더트리를 구축하고 이후에 뷰포트를 기반으로 렌더트리의 각 노드가 가지는 정확한 위치와 크기를 계산하는 (Layout/Reflow) 단계를 거치고 그를 기반으로 Paint단계를 통해 화면에 페이지를 그리게 된다. 이때 display: none
은 화면상에 나타나지 않아 불필요하다 판단하여 렌더트리에서 제외시킨다. 하지만 visibility: hidden
을 사용하면 repaint만 일어나게 되는데 그 이유는 layout이나 위치 변경이 없기 때문이다.
대화형 사이트에서 갱신하고 난 이후의 경우와 같이 브라우저가 웹 페이지의 위치와 기하학적 구조를 다시 계산할 때 리플로우가 발생한다. 그 다음에는, 브라우저가 웹 페이지를 다시 그려 결과적인 시각적 갱신을 표시하는 리페인트가 따라온다. 즉, 레이아웃에 영향을 미치는 요소를 변경할 때 발생하며 DOM에서 모든 부모 및 자식 요소의 후속 Reflow를 발생시킨다.
=> DOM 노드에 무언가를 추가, 삭제, 업데이트할때 발생함
리페인트(Repaint) 는 대화형 사이트의 업데이트와 같이 UI 변경으로 인한 시각적 업데이트를 표시하기 위해 브라우저가 웹 페이지를 다시 그릴 때 발생한다. 리페인트는 일반적으로 브라우저가 웹 페이지의 특정 부분의 위치와 기하학적 구조를 다시 계산하는 리플로우 후에 발생한다.
display: none
으로 숨기면 reflow와 repaint 모두 발생한다.visibility: hidden
으로 숨기면 repaint만 발생한다.cssText
속성을 편집해야한다.출처: https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg