페인트 타이밍

W3C 작업 초안,

이 문서에 대한 추가 정보
현재 버전:
https://www.w3.org/TR/2025/WD-paint-timing-20250517/
최신 공개 버전:
https://www.w3.org/TR/paint-timing/
에디터스 드래프트:
https://w3c.github.io/paint-timing/
이전 버전:
히스토리:
https://www.w3.org/standards/history/paint-timing/
피드백:
GitHub
명세 내 인라인
에디터:
(Google)
(초청 전문가)
이전 에디터:
(Google)
(Google)

요약

이 문서는 개발자가 중요하게 생각하는 일련의 주요 순간(첫 페인트, 첫 콘텐츠 페인트)을 페이지 로드 중에 캡처할 수 있는 API를 정의합니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. W3C의 현재 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인(https://www.w3.org/TR/)에서 확인할 수 있습니다.

이 문서는 웹 성능 작업 그룹에서 작업 초안으로 권고안 경로를 사용하여 발행되었습니다. 작업 초안으로 발행되었다고 해서 W3C와 회원들의 승인이나 지지를 의미하지는 않습니다.

이 문서는 초안이며 언제든지 다른 문서로 업데이트, 교체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 외의 목적으로 인용하는 것은 적절하지 않습니다.

GitHub 이슈는 이 명세에 대한 논의를 위해 선호됩니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 해당 그룹 산출물과 관련하여 공개적으로 공개된 특허 목록을 관리합니다; 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 개인이 필수 청구 사항이 포함되어 있다고 믿는 특허를 실제로 알고 있을 경우 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다.

웹 브라우저의 목적 대부분은 HTML, CSS 및 이미지 리소스를 사용자에게 화면의 픽셀로 변환하는 것입니다. 웹 페이지의 성능을 측정하는 것은 이러한 작업을 수행하는 데 걸리는 시간, 즉 텍스트 또는 이미지 등의 콘텐츠를 화면에 렌더링하는 데 걸리는 시간을 측정하는 경우가 많습니다. 이러한 타이밍을 활용해 페이지의 성능이나 로딩의 사용자 경험에 대해 여러 가지로 말할 수 있지만, 기본적으로 이러한 모든 방법은 시간을 측정하는 공통적인 방법에서 시작합니다.

이 문서는 페인트 타이밍을 일반적인 메커니즘으로 측정하는 방법을 지정하는 기초 문서입니다. 이 기반은 First Paint와 First Contentful Paint 메트릭을 정의하는 데 사용됩니다. 페인트 측정의 다른 구체적 사례는 다른 문서에서 지정될 수 있습니다.

구체적으로, 본 명세는 아래의 내용을 다룹니다:

1.1. 첫 페인트 및 첫 콘텐츠 페인트

로드는 한 순간의 이벤트가 아니라 — 하나의 메트릭으로 온전히 포착할 수 없는 경험입니다. 로드 경험 중 여러 순간이 사용자가 "빠르다" 또는 "느리다"로 인식하는 데 영향을 줄 수 있습니다.

첫 페인트(FP)는 이러한 주요 순간 중 첫 번째이며, 그 다음이 첫 콘텐츠 페인트(FCP)입니다. 이 메트릭들은 브라우저가 주어진 문서를 렌더링하는 시점을 표시합니다. 이는 사용자에게 "지금 화면에 뭔가 나타나고 있는가?"라는 질문에 답이 되므로 중요합니다.

두 메트릭의 주요 차이점은 FP는 브라우저가 주어진 문서에 대해 처음으로 무언가를 렌더링하는 시점을 표시하는 반면, FCP는 브라우저가 DOM에서 이미지 또는 텍스트 콘텐츠의 첫 부분을 렌더링하는 시점을 표시한다는 점입니다.

1.2. 사용 예시

const observer = new PerformanceObserver(function(list) {
    const perfEntries = list.getEntries();
    for (const perfEntry of perfEntries) {
        // 엔트리 처리
        // 분석 및 모니터링을 위한 보고
        // ...
    }
});

// 페인트 타이밍 알림을 위한 옵저버 등록
observer.observe({entryTypes: ["paint"]});

2. 용어

페인트: 사용자 에이전트가 렌더 트리를 화면의 픽셀로 변환하면 "페인트"(또는 "렌더")를 수행한 것으로 간주한다. 공식적으로, 사용자 에이전트가 렌더링 업데이트 이벤트 루프 단계를 수행했을 때 "렌더링"했다고 본다.

참고: 렌더링 파이프라인은 매우 복잡하며, 타임스탬프는 사용자 에이전트가 이 파이프라인에서 기록할 수 있는 가장 마지막 타임스탬프(최대한의 노력)를 사용해야 한다. 일반적으로 프레임이 OS에 표시를 위해 제출되는 시점이 이 API에 권장된다.

생성된 콘텐츠 가상 요소는 아래 조건이 모두 충족될 때 페인트 가능한 가상 요소이다:

CSS 이미지 img는 아래 조건이 모두 충족될 때 콘텐츠가 있는 이미지이다:

DOMString비어 있지 않음 상태는 문서 공백 문자를 제외한 문자가 하나 이상 포함된 경우다.

요소 target은 아래 중 하나라도 충족되면 콘텐츠 있음이다:

요소타이밍 대상이 될 수 있는 경우는 아래와 같다:

페인트 가능한 경계 사각형요소 target에 대해 계산하려면 다음 단계를 수행한다:

  1. boundingRectgetBoundingClientRect()target에 실행한 결과로 설정한다.

  2. boundingRect문서스크롤 영역으로 클리핑한다.

  3. boundingRect를 반환한다.

참고: overflow: scroll 또는 overflow: hidden 박스에 포함된 요소는 페인트 가능한 경계 사각형이 클리핑되지 않는다. 두 경우 모두 요소가 스크롤을 통해 표시될 수 있기 때문이다.

요소 el은 아래 조건이 모두 충족될 때 페인트 가능하다:

첫 페인트 엔트리는 DOMHighResTimeStamp 를 포함하고, 이는 사용자 에이전트가 내비게이션 후 처음으로 렌더링한 시점을 보고한다. 기본 배경 페인트는 제외하지만, 비기본 배경 페인트와 iframe의 외곽 박스는 포함한다. 이는 페이지 로드에서 개발자가 가장 중요하게 여기는 첫 순간으로, 사용자 에이전트가 페이지 렌더링을 시작한 시점이다.

브라우징 컨텍스트 ctx는 아래 조건 중 하나라도 충족되면 페인트 타이밍 대상이다:

3. PaintTimingMixin 인터페이스

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

PaintTimingMixin 인터페이스 믹스를 포함하는 오브젝트는 페인트 타이밍 정보(null 또는 페인트 타이밍 정보)를 갖는다.

페인트 타이밍 정보구조체이며, 아래 항목을 가진다:

렌더링 업데이트 종료 시점

DOMHighResTimeStamp

구현 정의 표시 시점

Null 또는 DOMHighResTimeStamp

paintTime 속성의 getter 단계는 this페인트 타이밍 정보렌더링 업데이트 종료 시점을 반환한다.

presentationTime 속성의 getter 단계가 존재할 경우 this페인트 타이밍 정보구현 정의 표시 시점을 반환한다.

페인트 타이밍 정보 paintTimingInfo기본 페인트 타임스탬프를 얻으려면, paintTimingInfo구현 정의 표시 시점이 null이 아니면 그 값을, 아니면 paintTimingInfo렌더링 업데이트 종료 시점을 반환한다.

4. PerformancePaintTiming 인터페이스

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

PerformancePaintTimingPerformanceEntry 인터페이스의 다음 속성을 확장한다:

참고: PerformancePaintTiming 을 구현하는 사용자 에이전트는 "paint"supportedEntryTypes에 포함해야 하며, 글로벌 오브젝트브라우징 컨텍스트페인트 타이밍 대상일 때 해당한다. 이를 통해 개발자는 특정 브라우징 컨텍스트의 페인트 타이밍 지원 여부를 감지할 수 있다.

5. 처리 모델

5.1. 연관 이미지 요청

Element연관 이미지 요청을 가지며, 이는 이미지 요청 또는 null이다. 기본값은 null.

Element elementHTMLImageElement, SVGImageElement, 또는 HTMLVideoElement 타입일 때, 새로운 이미지 리소스가 생성되면(예: 이미지 또는 포스터 이미지 표시) element연관 이미지 요청을 생성된 이미지 리소스의 이미지 요청으로 설정한다.

참고: URL의 scheme이 "data"인 경우, 모든 이미지 리소스는 가져오지 않아도 이미지 요청을 갖는다. 이 요청도 Element연관 이미지 요청이 될 수 있다.

참고: 현재 언어는 구체적인 알고리즘을 지칭하지 않으므로 모호하다. 해당 처리 모델이 더 통합될 때 보다 엄밀하게 만들 수 있다.

Element연관 배경 이미지 요청 리스트를 가지며, 초기값은 빈 배열이다. Element element의 스타일이 새로운 이미지 리소스를 필요로 할 때(배경 이미지 표시), 새 리소스에서 생성된 이미지 요청element연관 배경 이미지 요청에 추가한다.

참고: Element 는 여러 이미지 요청을 가질 수 있다. 예를 들어 background-image 속성에 여러 값이 있는 경우다. 아래 예시에서 하나의 background-image 속성이 4개의 이미지 요청을 생성하며, 각각의 요청은 아래 알고리즘에 의해 기록 및 보고된다.

<!DOCTYPE html>
<style>
div {
  background-image: url(https://images.example/background1.png),
                    url(https://images.example/background2.png);
}
</style>
<div></div>
<div></div>

5.2. 페인트 타이밍 기록

대기 중인 이미지 기록은 다음 구조체항목을 가진다:

Element소유 텍스트 노드 집합을 가지며, 이는 순서 집합Text 노드들로, 초기값은 빈 집합이다.

Document이전에 보고된 페인트 집합을 가지며, 이는 순서 집합문자열로, 초기값은 빈 집합이다.

Document렌더링 대기 이미지들을 가지며, 이는 리스트대기 중인 이미지 기록으로, 초기값은 빈 리스트이다.

Document렌더링된 텍스트를 가진 요소 집합을 가지며, 이는 순서 집합Element들로, 초기값은 빈 집합이다.

5.2.1. CSS 명세의 수정 사항

이미지 요청Element element연관 배경 이미지 요청에 있고 완전히 사용 가능해지면, element이미지 요청을 입력값으로 로딩이 완료된 이미지를 처리 알고리즘을 실행한다.

5.2.2. HTML 명세의 수정 사항

Element element연결된 이미지 요청완전히 사용 가능하게 되면, element와 그 연결된 이미지 요청을 입력값으로 하여 로딩이 완료된 이미지를 처리하는 알고리즘을 실행한다.

사용자 에이전트가 Text 노드 text를 처음으로 페인트할 때, 다음 단계를 수행해야 한다:

5.2.3. 로딩이 완료된 이미지 처리

로딩이 완료된 이미지를 처리Element elementimage request imageRequest를 입력값으로 가진다:
  1. rootelement루트로 한다.

  2. rootDocument가 아니면 return.

  3. now현재 고해상도 시간으로, element관련 글로벌 오브젝트를 기준으로 한다.

  4. record대기 중인 이미지 기록으로, element element, request imageRequest, loadTime now를 가진다.

  5. recordroot렌더링 대기 이미지들에 추가한다.

5.3. 페인트 타이밍 보고

5.3.1. 첫 콘텐츠 페인트

Document document첫 콘텐츠 페인트를 보고해야 하는지 확인하려면, 다음 단계를 수행한다:
  1. document이전에 보고된 페인트 집합"first-contentful-paint"가 포함되어 있으면 false를 반환한다.

  2. document요소가 하나 이상 존재하고, 그 요소가 페인트 가능이면서 콘텐츠 있음이라면 true를 반환한다.

  3. 그 외에는 false를 반환한다.

5.3.2. 페인트 타이밍 표시

페인트 타이밍 표시를 요청받고 Document document를 입력으로 받으면, 다음 단계를 수행한다:
  1. document브라우징 컨텍스트페인트 타이밍 대상이 아니면 return.

  2. paintTimingInfo를 새 페인트 타이밍 정보로 설정하고, 그 렌더링 업데이트 종료 시점document현재 고해상도 시간으로 한다.

  3. paintedImages를 새 순서 집합으로 한다.

  4. paintedTextNodes를 새 순서 집합으로 한다.

  5. doc렌더링 대기 이미지들 리스트의 각 record에 대해:

    1. recordrequest사용 가능하며 페인트 준비가 되었다면, 아래 단계를 실행한다:

      1. recordpaintedImages에 추가한다.

      2. recorddoc렌더링 대기 이미지들 리스트에서 제거한다.

  6. Element elementdoc모든 자손에 대해 반복한다:

    1. elementdoc렌더링된 텍스트가 있는 요소 집합에 포함되어 있다면, 계속 진행한다.

    2. element소유 텍스트 노드 집합이 비어 있다면, 계속 진행한다.

    3. Append elementdoc렌더링된 텍스트가 있는 요소 집합에 추가한다.

    4. Append elementpaintedTextNodes에 추가한다.

  7. reportedPaintsdocument이전에 보고된 페인트 집합으로 한다.

  8. frameTimingInfodocument현재 프레임 타이밍 정보로 한다.

  9. document현재 프레임 타이밍 정보를 null로 설정한다.

  10. flushPaintTimings를 아래 단계로 정의한다:

    1. reportedPaints"first-paint"가 없고, 사용자 에이전트가 첫 페인트를 표시하도록 설정되어 있으면, 페인트 타이밍 보고document, "first-paint", paintTimingInfo로 실행한다.

      참고: 첫 페인트는 기본 배경 페인트를 제외하지만, 비기본 배경 페인트는 포함한다.

      이 내용은 규범적 참고(note)로 바뀌어야 함.

    2. document첫 콘텐츠 페인트를 보고해야 하는지라면:

      1. 페인트 타이밍 보고document, "first-contentful-paint", paintTimingInfo로 실행한다.

      참고: 부모 프레임은 자식 iframe의 페인트 이벤트를, 자식 프레임은 부모의 페인트 이벤트를 인지하면 안 된다. 즉, iframe만 포함된 프레임은 첫 페인트(iframe의 외곽 박스 때문에)는 있지만 첫 콘텐츠 페인트는 없다.

      참고: document"first-paint""first-contentful-paint"가 반드시 표시되는 것은 아니다. 완전히 빈 document첫 페인트를 표시하지 않을 수 있고, document가 콘텐츠가 없는 요소만 포함할 경우 첫 콘텐츠 페인트를 표시하지 않을 수 있다.

      참고: 첫 페인트 표시는 선택적이다. 페인트 타이밍을 구현하는 사용자 에이전트는 최소한 첫 콘텐츠 페인트는 표시해야 한다.

    3. 최대 콘텐츠 페인트 보고document, paintTimingInfo, paintedImages, paintedTextNodes로 실행한다.

    4. 요소 타이밍 보고document, paintTimingInfo, paintedImages, paintedTextNodes로 실행한다.

    5. frameTimingInfo가 null이 아니면, 긴 애니메이션 프레임 엔트리 큐document, frameTimingInfo, paintTimingInfo로 실행한다.

  11. 사용자 에이전트가 구현 정의 표시 시점을 지원하지 않으면 flushPaintTimings를 호출하고 return.

  12. 다음 단계를 병렬로 실행한다:

    1. 현재 프레임이 사용자에게 표시될 때까지 구현 정의된 시간만큼 기다린다.

    2. paintTimingInfo구현 정의 표시 시점document현재 고해상도 시간으로 설정한다.

    3. document크로스 오리진 격리 능력이 false이면:

      1. paintTimingInfo구현 정의 표시 시점을 4ms 또는 그보다 더 큰 배수로 올림한다.

      2. 현재 고해상도 시간paintTimingInfo구현 정의 표시 시점이 될 때까지 기다린다.

    4. 글로벌 태스크 큐성능 타임라인 태스크 소스document관련 글로벌 오브젝트flushPaintTimings를 실행하도록 추가한다.

5.3.3. 페인트 타이밍 보고

document, paintType, 그리고 페인트 타이밍 정보 paintTimingInfo가 주어졌을 때 페인트 타이밍을 보고하기 위한 단계:
  1. document관련 Realm에서 새로운 PerformancePaintTiming 객체 newEntry를 생성하고, 그 속성을 다음과 같이 설정한다:

    1. newEntryname 속성을 paintType으로 설정한다.

    2. newEntryentryType 속성을 "paint"로 설정한다.

    3. newEntrystartTime 속성을 paintTimingInfo가 주어졌을 때의 기본 페인트 타임스탬프로 설정한다.

    4. newEntryduration 속성을 0으로 설정한다.

  2. newEntry페인트 타이밍 정보paintTimingInfo로 설정한다.

  3. 큐에 추가 newEntrydocument관련 Realm에 추가한다.

  4. Append paintTypedocument이전에 보고된 페인트 집합에 추가한다.

5.4. 공통 알고리즘

5.4.1. 페인트 타이밍에 노출됨

Element element페인트 타이밍에 노출됨인지 판단하려면, Document 또는 null document를 받아서 다음 단계를 수행한다:

  1. elementconnected가 아니면 false를 반환한다.

  2. document가 null이면, documentelementrelevant settings objectrelevant global objectassociated document로 한다.

  3. document완전히 활성화됨이 아니면 false를 반환한다.

  4. element루트document와 다르면 false를 반환한다.

  5. true를 반환한다.

6. 감사의 글

이 명세 개선을 위해 기술적 의견과 제안을 해준 모든 기여자에게 특별히 감사드립니다.

적합성

문서 규칙

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현된다. 본 명세의 규범적 부분에 나오는 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"이라는 주요 단어들은 RFC 2119에 따라 해석되어야 한다. 하지만 가독성을 위해 본 명세에서는 이러한 단어를 모두 대문자로 표시하지 않는다.

본 명세의 모든 텍스트는 명시적으로 비규범(비정형)으로 표시된 섹션, 예시, 참고를 제외하고 규범적이다. [RFC2119]

이 명세의 예시는 "예를 들어"라는 말로 시작하거나, class="example"와 같이 규범 텍스트와 구분되어 있다. 아래와 같음:

이것은 정보 제공용 예시입니다.

정보성 참고는 "참고"로 시작하며, class="note"와 같이 규범 텍스트와 구분되어 있다. 아래와 같음:

참고, 이것은 정보성 참고입니다.

적합 알고리즘

알고리즘의 일부로서 명령문으로 표현된 요구사항(예: "선행 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계들을 중단한다")은 해당 알고리즘의 도입부에 사용된 주요 키워드("must", "should", "may" 등)의 의미로 해석해야 한다.

알고리즘 또는 구체적 단계로 표현된 적합성 요구사항은 결과가 동등하기만 하면 어떤 방식으로든 구현될 수 있다. 특히 이 명세에 정의된 알고리즘은 이해하기 쉽게 작성된 것이며, 성능을 위한 것이 아니다. 구현자는 최적화를 권장한다.

색인

이 명세에서 정의한 용어

참고 문헌에서 정의한 용어

참고 문헌

규범적 참고 문헌

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024년 3월 11일. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2022년 1월 18일. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024년 12월 19일. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024년 2월 1일. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 2024년 5월 29일. WD. URL: https://www.w3.org/TR/css-text-4/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 현행 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[ELEMENT-TIMING]
Element Timing API. Editor's Draft. URL: https://w3c.github.io/element-timing/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2024년 11월 7일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 현행 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 현행 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. 2025년 2월 13일. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022년 11월 11일. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018년 10월 4일. CR. URL: https://www.w3.org/TR/SVG2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 현행 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

정보 참고 문헌

[URL]
Anne van Kesteren. URL 현행 표준. 현행 표준. URL: https://url.spec.whatwg.org/

IDL 색인

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

이슈 색인

이것은 규범적 참고(note)로 변경되어야 합니다.
MDN

PerformancePaintTiming

In all current engines.

Firefox84+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?