가 있을 때마다 일부 DOM 조작과 같은 삽입 DOM 요소를 트리거 리플로우 그리고 대부분 다음에 다시
그림 작업이 발생하는 비동기적으로,그래서"trigger"이해되어야에서는 방법입니다. 첫 번째 JavaScript 코드가 완료하기 전에 실제로 발생합니다.
면 우리에게 할 DOM 조작이 rAF(편집하고 또한 다른 큐 rAF 끝에)어떤 트리거 리플로우마다 그래서 다시 그릴,우리는 우리 것에 갇혀있는 무한 루프로 렌더링 화면에 아무것도.
에 대한 요구를 다시 쌓지 않는 동기적으로 이행됩니다. 첫 번째 코드를 완료할 때까지 호출 스택은 비어 있습니다. 이 없다 그래서 무한 루프로 여기에.
또는 그것의 경우는 한번 브라우저가를 수행하기로 결정했 repaint,그것은 그것으로 스틱 및 모든 업데이트를 적용에서 일어난 RAF 콜백에서는 다음을 칠?
그렇습니다. 때 RAF 콜백을 호출하는 코드가 마지막 기회를 업데이트 DOM 수 있는 축적한 요구에 대한 그림입니다. 는 경우에는 콜백 당신은 또한 등록 다른 콜백에 RAF,그것을 실행하지 않는 시간에,그러나 나중에 는 다음 시간에는 브라우저 준비하는 그것의 다시 작업은--그렇지 않은 전자민원으로 처리가 가능합니다.
간단한 예제
이 있다고 가정해 봅시 이 코드:
requestAnimationFrame(update);
myElement.style.backgroundColor = "silver"; // This queues a need for repaint
function update() {
// This queues a need for repaint
myElement.style.width = Math.floor(Math.random() * 100) + "px";
requestAnimationFrame(update);
}
이 때 실행되는,우리는 다음과 같은 시퀀스:
update
로 등록되어 콜백
- 배경을 변경할 스케줄의 필요를 위해 다시 그리기
- 호출 스택가 비
- 브라우저를 시작 그 다시 작업,그 계정으로 등록되어 있 콜백입니다. 그래서 그것을 제거 등록(기 때문에 그것은 단지 한 번 실행하고)실행
update
앞에 아무것도 하다.
- 폭 일정을 변경하는 필요를 위해 다시 그리기. 목록의 변경 내용이 포함되어 있 배경의 변화와 이 폭 변경하고 모든 캐스케이드는 효과를 계산하고있다. (어떻게 표현되는 브라우저에 따라 다름)
- 이
update
등록된 기능으로 콜백을 다시합니다.
- 브라우저 이를 확인 그것이 무엇을 할 필요가의 일환으로 이 다시 작업을 수행한 모든 필요한 시각화의 효과를 배경과 폭 변경합니다.
- 페인트 작업 종료됩니다. 모든 등록
update
콜백입니다.
- 브라우저를 수행합니 그 다음 페인트 주기는,우리가 다시 시작 단계부터 4,하지만 지금은 대기된 배경을 변경-니다. 나머지 부분에 대한 것이 동일한 과정이다.
raf(()=>raf(fn2))
이 일정fn2
화재에서 다음 프레임입니다. 그렇지 않으면 이 대답은 정확합니다.