면 어떻게 되는지를 조작 DOM 에머 확인 감?

0

질문

나의 이해가 있을 때마다 일부 DOM 조작과 같은 삽입 DOM 요소가 트리거 리플로우 대부분에 의해 다음 다시 그리기. 저를 수정하시기 바랍니다면 내가 잘못입니다. 인용 반 웹 문서,

창입니다.머 확인 감() 메서드를 알려줍 브라우저를 수행하는 애니메이션을 요청하는 브라우저를 통화를 지정된 기능을 업데이트하려면 애니메이션하기 전에 다음 다시 그릴

the 머 확인 감(니다.k.니다. aAF)콜백을 호출하기 전에 브라우저에 대하여 칠. 그래서 이 말은 우리가 어떻게든 관리 할 DOM 조작이 rAF(편집하고 또한 다른 큐 rAF 끝에)어떤 트리거 리플로우마다 그래서 다시 그릴,우리는 우리 것에 갇혀있는 무한 루프로 렌더링 화면에 아무것도.

또는 그것의 경우는 한번 브라우저가를 수행하기로 결정했 repaint,그것은 그것으로 스틱 및 모든 업데이트를 적용에서 일어난 RAF 콜백에서는 다음을 칠?

dom javascript reflow repaint
2021-11-21 07:17:28
1

최고의 응답

1

가 있을 때마다 일부 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);
}

이 때 실행되는,우리는 다음과 같은 시퀀스:

  1. update 로 등록되어 콜백
  2. 배경을 변경할 스케줄의 필요를 위해 다시 그리기
  3. 호출 스택가 비
  4. 브라우저를 시작 그 다시 작업,그 계정으로 등록되어 있 콜백입니다. 그래서 그것을 제거 등록(기 때문에 그것은 단지 한 번 실행하고)실행 update 앞에 아무것도 하다.
  5. 폭 일정을 변경하는 필요를 위해 다시 그리기. 목록의 변경 내용이 포함되어 있 배경의 변화와 이 폭 변경하고 모든 캐스케이드는 효과를 계산하고있다. (어떻게 표현되는 브라우저에 따라 다름)
  6. update 등록된 기능으로 콜백을 다시합니다.
  7. 브라우저 이를 확인 그것이 무엇을 할 필요가의 일환으로 이 다시 작업을 수행한 모든 필요한 시각화의 효과를 배경과 폭 변경합니다.
  8. 페인트 작업 종료됩니다. 모든 등록 update 콜백입니다.
  9. 브라우저를 수행합니 그 다음 페인트 주기는,우리가 다시 시작 단계부터 4,하지만 지금은 대기된 배경을 변경-니다. 나머지 부분에 대한 것이 동일한 과정이다.
2021-11-21 12:57:10

"4. 브라우저를 시작하는 레이아웃/다시 작업을"그건 아주 복잡한 배합고 생각 말하는"브라우저를 시작 업데이트 렌더링"할 수 있는 더 적은 혼란스럽습니다. 레이아웃과 다시는 분리할 수 있습을 강제로 아주 잘 레이아웃을 동시에 사용자영역 코드,너는 다는 것입니다 항상 마지막 단계의 렌더링은 단계가 있습니다. 또한,나는 느낌을 답변하는 첫 번째 포인트가 될 것이 훨씬 더 간단에 의해 상기에서는 raf(()=>raf(fn2)) 이 일정 fn2 화재에서 다음 프레임입니다. 그렇지 않으면 이 대답은 정확합니다.
Kaiido

@Kaiido,귀하의 의견에 감사드립니다. "당신은 매우 잘력 레이아웃을 동시에 사용자영역 코드":do you mean 사용자 지각 변화에 레이아웃? 당신이 줄 수 있는 코드를 예의는?
trincot

어떤 방법으로,제거한 참조를 레이아웃이 있습니다.
trincot

gist.github.com/paulirish/5d52fb081b3570c81e3a 여기에는 것의 목록 트리거 레이아웃,네,그것의"사용자 지각": stackoverflow.com/questions/55134528/...
Kaiido

확실히,Kaiido!
trincot

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................