** 39장의 모든 내용을 정리하지는 않고 간단하게 'DOM이 무엇인가?'에 대한 답변 정리 및 리플로우, 리페인트 개념과 최적화 내용 (책 + 다른 출처)
요소의 크기나 위치에 영향을 미치는 width, position 등 변경 시 발생
크기나 위치에 영향을 미치지 않는 color, border-radius 등 변경 시 발생, Reflow가 일어나면 자동 발생
레이아웃을 변경 시키는 Reflow가 비용이 더 크므로
Reflow를 최적화시키는 방향으로 가야 함
요약: 가장 하위 노드의 클래스 변경 / 깊은 CSS 하위 선택자, 인라인 스타일 지양 / fragment 태그, display: none 활용 / 애니메이션 줄 때 position: fixed나 absolute (분리)
가장 하위 노드의 클래스 변경
CSS 하위 선택자 최소화
/* Bad */
.reflow_box .reflow_list li .btn {
display: block;
}
/* Good */
.reflow_list .btn {
display: block;
}
인라인 스타일 지양
애니메이션 노드는 position: fixed나 absolute 설정
table을 레이아웃 용도로 사용 x
변경할 노드를 display: none
으로 숨긴 후에 변경
**display: none
으로 숨긴 노드는** 변경 시 reflow가 발생하지 않음 ⇒ 노드를 숨겨서 변경 시킨 후에 화면에 나타내기여러 번 변경되는 요소들을 Fragment 노드에 한번에 추가 후 상위 노드에는 Fragment 노드만 추가
const frag = document.**createDocumentFragment**();
const ul = frag.appendChild(document.createElement('ul')); // ul을 만들어 frag에 추가
for (let i = 1; i <= 3; i++) {
li = ul.appendChild(document.createElement('li'));
li.textContent = `item ${i}`;
}
document.body.appendChild(frag); // 최종 만들어진 ul(frag)을 실제 DOM에 추가