레이아웃이 완성되기 이전, 요소의 크기나 위치 등 계산된 값을 속성으로 읽으려고 시도하면 강제 동기 레이아웃이 발생한다.
레이아웃 스레싱
강제 동기 레이아웃 1
강제 동기 레이아웃 2
해당 코드는, 100개의 div box의 가로+세로 길이를 1px씩 100번 증가시키는 코드이다. (100px 100px → 200px 200px div로)
코드
결과를 비교해보자! 860ms ↔ 20ms
강제동기 레이아웃이 발생하는 현상에서, 다음과 경고메세지가 같이 나타남.
DOM 읽기와 쓰기 작업을 분리하자.
// 최적화된 코드
const width = box.offsetWidth;
const height = box.offsetHeight;
box.style.width = width + 10 + 'px';
box.style.height = height + 10 + 'px';
requestAnimationFrame 활용
requestAnimationFrame(() => {
// 레이아웃 변경 작업
});
requestAnimationFrame
에 맞춰야해?requestAnimationFrame
에 등록해서, frame이 바뀌는 16ms마다 render 해주면 되겠지 라고 생각했다.