가장 큰 콘텐츠 페인트

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
현재 버전:
https://www.w3.org/TR/2026/WD-largest-contentful-paint-20260408/
최신 공개 버전:
https://www.w3.org/TR/largest-contentful-paint/
편집자 초안:
https://w3c.github.io/largest-contentful-paint/
이전 버전:
변경 기록:
https://www.w3.org/standards/history/largest-contentful-paint/
테스트 모음:
https://github.com/web-platform-tests/wpt/tree/master/largest-contentful-paint
피드백:
GitHub
편집자:
(Shopify)
이전 편집자:
(Google)

개요

이 문서는 화면에 표시된 요소에서 발생한 가장 큰 페인트를 모니터링할 수 있는 API를 정의합니다.

이 문서의 상태

이 섹션은 이 문서가 공개될 당시의 상태를 설명합니다. 최신 W3C 발행물 목록과 본 기술 초안의 최신 버전은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 웹 성능 워킹 그룹에서 작업 초안으로서 권고안 트랙을 사용하여 발행되었습니다. 작업 초안으로서의 발행은 W3C 및 회원사의 승인을 의미하지 않습니다.

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

GitHub 이슈에서 본 명세에 대한 토론을 하는 것이 권장됩니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

이 문서는 W3C 특허 정책 하에서 운영되는 그룹에 의해 제작되었습니다. W3C는 공개 특허 공개 목록을 그룹의 결과물과 관련하여 관리하고 있습니다. 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 어떤 개인이 필수 청구항이 포함된다고 믿는 특허를 실제로 알고 있다면, W3C 특허 정책 6장에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다. LargestContentfulPaint API는 개발자가 웹 페이지의 로딩 및 렌더링 과정을 파악하여 최적화할 수 있도록 합니다.

개발자는 사용자의 시각적 렌더링 경험과 상관관계가 높은 신뢰할 수 있는 지표가 필요합니다. Paint 로딩 지표인 First Paint와 First Contentful Paint는 초기 렌더링에 중점을 두지만, 페인팅된 콘텐츠의 중요성을 고려하지 않아 사용자가 페이지를 유용하다고 여기지 않는 시점까지의 시간도 표시할 수 있습니다.

Largest Contentful Paint(LCP)는 다음과 같은 페이지 로드 지표가 되는 것을 목표로 합니다:

페이지 로딩 과정 중의 가장 큰 페인트는 사용자 관점에서 의미 있는 이벤트를 나타낼 가능성이 높으므로 기본적으로 개발자에게 노출하여, 성능 팀, 분석 제공자, 실험실 기반 측정 도구가 콘텐츠 생성자의 별도 주석 작업 없이 해당 지표를 수집할 수 있도록 하는 것이 목표입니다.

이 API는 [PAINT-TIMING]에서 정의된 개념에 크게 의존합니다. 이 개념들은 고수준 기능의 기반이 되는 저수준 프리미티브로 볼 수 있습니다. 콘텐츠 제작자가 페이지의 중요한 시점에 주석을 달고 싶을 때 사용할 수 있는 API는 [ELEMENT-TIMING]으로, 보고되는 요소에 대해 더 많은 제어를 제공합니다.

참고: Largest Contentful Paint API는 타이밍 적격 요소만을 노출합니다. Element Timing과 달리 LCP 측정을 위해 요소에 주석을 달 필요가 없습니다.

1.1. 가장 큰 콘텐츠

이 API에 사용되는 알고리즘은 지금까지 확인된 콘텐츠를 추적합니다. 새로운 더 큰 콘텐츠가 발견되면 새로운 엔트리가 생성됩니다. 제거된 콘텐츠도 알고리즘에서 고려되며, 특히 제거된 콘텐츠가 가장 컸던 경우 더 큰 콘텐츠가 추가될 때만 새 엔트리가 생성됩니다. 사용자의 스크롤이나 입력 이벤트가 발생하면 새로운 콘텐츠가 추가될 가능성이 높으므로, 이때 알고리즘은 종료됩니다.

1.2. 사용 예시

다음 예시는 이미지와 큰 본문 텍스트를 보여줍니다. 개발자는 페이지가 로딩 중일 때 가장 큰 페인트 후보 엔트리를 받을 수 있도록 옵저버를 등록합니다.

<img src="large_image.jpg">
<p id='large-paragraph'>This is large body of text.</p>
...
<script>
const observer = new PerformanceObserver((list) => {
  let perfEntries = list.getEntries();
  let lastEntry = perfEntries[perfEntries.length - 1];
  // Process the latest candidate for largest contentful paint
});
observer.observe({entryTypes: ['largest-contentful-paint']});
</script>

1.3. 제한 사항

이 섹션은 비규범적입니다.

LargestContentfulPaint API는 휴리스틱에 기반합니다. 따라서 오류가 발생하기 쉽습니다. 다음과 같은 문제가 있습니다:

LargestContentfulPaint API는 문서 로드를 기반으로 합니다. 따라서 다음 상황에서 재설정되지 않습니다:

LargestContentfulPaint API를 사용할 때, 사용자들이 이를 페이지 로드로 간주할 수 있으므로, 이 API 외부에서 이러한 상황을 어떻게 처리할지 고려해야 할 수 있습니다.

또한, 초기에는 화면에 표시되지 않는 페이지(예: 백그라운드 탭 또는 프리렌더링 기술을 통해 로드된 경우)는 로드 시점부터 페인트까지의 시간을 측정하므로 예상보다 더 큰 값을 보고할 수 있으며, 이에 대한 처리 또한 고려해야 합니다.

2. 용어

최대 콘텐츠 렌더 후보는 다음 구성원을 포함하는 구조체입니다:

3. 가장 큰 콘텐츠 페인트

Largest Contentful Paint는 다음의 새로운 인터페이스를 포함합니다:

3.1. LargestContentfulPaint 인터페이스

[Exposed=Window]
interface LargestContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute unsigned long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    [Default] object toJSON();
};

LargestContentfulPaint includes PaintTimingMixin;

LargestContentfulPaint 객체는 다음의 연관 개념을 가진다:

entryType 속성의 getter는 DOMString "largest-contentful-paint"을 반환해야 한다.

name 속성의 getter는 빈 문자열을 반환해야 한다.

startTime 속성의 getter는 thisrenderTime 값을 반환해야 한다.

duration 속성의 getter는 0을 반환해야 한다.

renderTime 속성은 기본 paint 타임스탬프 값으로, thispaint timing info를 사용하여 반환해야 한다.

loadTime 속성은 thisloadTime 값을 반환해야 한다.

size 속성은 thissize 값을 반환해야 한다.

id 속성은 thisid 값을 반환해야 한다.

url 속성은 thisurl 값을 반환해야 한다.

element 속성의 getter는 다음 절차를 수행해야 한다:

  1. thiselementpaint 타이밍에 노출됨이 null로 주어졌을 때 아니면 null을 반환한다.

  2. thiselement를 반환한다.

참고: 위 알고리즘은, Document하위 노드(descendant)가 아닌 요소는, element 속성 getter에서 반환되지 않음을 정의한다(섀도우 DOM 안의 요소 포함).

이 명세는 Document 에 다음을 추가하여 확장한다:

4. 처리 모델

Window스크롤 이벤트 발생 여부라는 불리언 값을 가지며, 처음에는 false로 설정됩니다.

4.1. DOM 명세 수정

[DOM] 명세가 갱신되면 이 섹션은 삭제됩니다.

event dispatch algorithm을 다음과 같이 수정합니다.

1단계 바로 다음에 다음 단계를 추가합니다:

4.2. 가장 큰 콘텐츠 페인트 보고

최대 콘텐츠 페인트를 보고한다고 요청받으면, Document document, paint timing info paintTimingInfo, 정렬된 집합보류 중인 이미지 레코드 paintedImages, 그리고 정렬된 집합요소 paintedTextNodes가 주어졌을 때, 다음 절차를 수행한다:

Note: paintedImages의 모든 보류 중인 이미지 레코드와 paintedTextNodes의 텍스트 요소는 마크 페인트 타이밍에서 처음 페인트될 때(즉, opacity와 visibility를 가지는 경우) 그리고 콘텐츠를 포함하는 경우(즉, 이미지 리소스 또는 차단 서체가 충분히 로드된 상태)를 만족할 때 **정확히 한 번만** 보고된다.

  1. windowdocument관련 전역 객체로 한다.

  2. window스크롤 이벤트 디스패치 여부 또는 입력 이벤트 디스패치 여부 중 어느 하나라도 참이면, 반환한다.

  3. currentSizedocument최대 콘텐츠 페인트 크기로 한다.

  4. currentWidthdocument최대 콘텐츠 페인트 너비로 한다.

  5. currentHeightdocument최대 콘텐츠 페인트 높이로 한다.

  6. largestSizecurrentSize로 한다.

  7. newCandidate를 null로 한다.

  8. paintedImagesrecord에 대하여:

    1. imageElementrecord요소로 한다.

    2. imageElementdocument에 대해 페인트 타이밍에 노출되지 않으면 계속한다.

    3. intersectionRect를 타겟으로 imageElement, 루트로 viewport를 사용하여 intersection rect 알고리즘의 결과로 한다.

    4. resultintersectionRectrecordrequest를 인자로 한 유효 시각 크기로 한다.

    5. result가 null이면 계속한다.

    6. resultsizelargestSize 이하이면 계속한다.

    7. largestSizeresultsize로 한다.

  9. newCandidate를 다음 값을 가지는 새로운 최대 콘텐츠 페인트 후보로 설정한다:

    1. elementimageElement로 한다.

    2. sizeresultsize로 한다.

    3. widthresultwidth로 한다.

    4. heightresultheight로 한다.

    5. requestrecordrequest로 한다.

    6. loadTimerecordloadTime으로 한다.

  10. paintedTextNodestextNode에 대하여,

    1. textNodedocument에 대해 페인트 타이밍에 노출되지 않으면 계속한다.

    2. textNode알파 채널 값이 0 이하이거나 불투명도 값이 0 이하이면:

      1. textNodetext-shadow 값이 none이고, stroke-color 값이 transparent이며, stroke-image 값이 none이면, 계속한다.

    3. intersectionRect를 모든 Text 노드의 border box 합집합을 textNode소유 텍스트 노드 집합에서 구하여, 시각적 뷰포트와 교집합한 값으로 한다.

    4. result유효 시각 크기에서 textNode, intersectionRect, null을 인자로 구한다.

    5. result가 null이면 계속한다.

    6. resultsizelargestSize 이하이면 계속한다.

    7. largestSizeresultsize로 한다.

    8. newCandidate를 다음 값들을 가진 새로운 최대 콘텐츠 페인트 후보로 설정한다:

      1. elementtextNode로 한다.

      2. sizeresultsize로 한다.

      3. widthresultwidth로 한다.

      4. heightresultheight로 한다.

      5. request는 null로 한다.

      6. loadTime은 0으로 한다.

  11. newCandidate가 null이 아니라면:

    1. currentSize가 0보다 크면:

      1. newCandidatewidth - currentWidth가 3 이하고 newCandidateheight - currentHeight가 3 이하면, 반환한다.

    2. LargestContentfulPaint 엔트리 생성newCandidate, paintTimingInfo, document로 수행한다.

4.3. 요소의 실효 시각 크기 결정

Element실효 시각 크기를 결정하기 위해 다음 단계를 수행한다:

입력

intersectionRect, DOMRectReadOnly

imageRequest, Request 또는 null

element, 요소

document, 문서

출력

유효 시각 크기 결과, 구조체이고 항목은 size(숫자), width(숫자), height(숫자)로, 최대 콘텐츠 페인트로 보고될 유효 시각 크기, 너비, 높이를 픽셀 단위로 나타낸다. 요소가 LCP 후보가 아니면 null을 반환한다.

  1. widthintersectionRectwidth 를 가장 가까운 정수로 반올림한 값으로 한다.

  2. heightintersectionRectheight 를 가장 가까운 정수로 반올림한 값으로 한다.

  3. sizewidth * height로 한다.

  4. rootdocument브라우징 컨텍스트최상위 브라우징 컨텍스트활성 문서로 한다.

  5. rootWidthroot시각적 뷰포트의 스크롤바 제외 너비로 한다.

  6. rootHeightroot시각적 뷰포트의 스크롤바 제외 높이로 한다.

  7. sizerootWidth 곱하기 rootHeight와 같으면 null을 반환한다.

  8. imageRequest가 null이 아니면, 이미지 위치 및 업스케일링을 보정하기 위해 다음을 수행한다:

    1. imageRequestresponse의 바이트 단위 content length가 size * 0.004 보다 작다면 null을 반환한다.

      Note: 이 휴리스틱은 이미지 리소스가 사용자에게 콘텐츠로 인식될 만한 충분한 데이터를 포함하는지 판단한다. 전송되는 파일 크기와 실제로 생산되는 픽셀 수(디코딩 및 스케일 조정 후)를 비교한다. 매우 적은 바이트로 많은 픽셀을 표현하면 보통 저콘텐츠 배경/그래디언트 등이며, LCP 후보로 간주하지 않는다.

    2. concreteDimensionselement 내에서 imageRequest구체 오브젝트 크기로 한다.

    3. visibleDimensionsconcreteDimensions에서 위치 결정을 object-position 또는 background-position로, elementcontent box와 함께 보정한 값으로 한다.

      Note: 일부 알고리즘은 CSS에서 엄밀히 정의돼 있지 않다. 기대 결과는 element 내 해당 이미지의 실제 위치와 크기를 DOMRectReadOnly로 얻는 것이다.

    4. clientContentRectvisibleDimensions를 모두 포함하고, element트랜스폼이 적용된 최소 DOMRectReadOnly로 한다.

    5. intersectingClientContentRectclientContentRectintersectionRect의 교집합으로 한다.

    6. widthintersectingClientContentRectwidth 를 가장 가까운 정수로 반올림한다.

    7. heightintersectingClientContentRectheight 를 가장 가까운 정수로 반올림한다.

    8. sizewidth * height로 한다.

      Note: 이렇게 해서 요소의 장식이 아니라 이미지 자체와만 교집합이 되도록 한다.

    9. naturalAreaimageRequestnatural width * imageRequestnatural height로 한다.

    10. naturalArea가 0이면 null을 반환한다.

    11. boundingClientAreaclientContentRectwidth * clientContentRectheight로 한다.

    12. scaleFactorboundingClientArea / naturalArea로 한다.

    13. scaleFactor가 1보다 크면, sizescaleFactor로 나눈다.

  9. 유효 시각 크기 결과를 반환하는데 항목은 size에는 size, width에는 width, height에는 height를 넣는다.

4.4. LargestContentfulPaint 엔트리 생성

LargestContentfulPaint 엔트리를 생성하기 위해, 사용자 에이전트는 다음 절차를 실행해야 한다:

입력

candidate, 최대 콘텐츠 페인트 후보

paintTimingInfo, paint timing info

document, Document

출력

없음

  1. document최대 콘텐츠 페인트 크기candidatesize로 설정한다.

  2. document최대 콘텐츠 페인트 너비candidatewidth로 설정한다.

  3. document최대 콘텐츠 페인트 높이candidateheight로 설정한다.

  4. url을 빈 문자열로 한다.

  5. candidaterequest가 null이 아니면, urlcandidaterequestrequest URL로 설정한다.

  6. entryLargestContentfulPaint 엔트리로 생성하는데, document관련 렐름을 사용하고, paint timing infopaintTimingInfo로 한다. 엔트리의 각 속성은,

  7. PerformanceEntry entry를 큐에 추가한다.

5. 보안 및 개인정보 보호 고려 사항

이 API는 기본 프리미티브로 Paint Timing을 사용합니다. 유사한 API인 Element Timing과 달리, LCP는 어느 시점까지 가장 큰 요소라면 크기가 작더라도 일부 요소의 타이밍 세부정보를 노출할 수 있습니다. 하지만 이는 Element Timing이 이미 제공하는 정보 이상으로 민감한 정보를 노출하지 않는 것으로 보입니다.

적합성

문서 규약

적합성 요구사항은 설명적 진술과 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 배경 및 테두리 모듈 3단계. 2024년 3월 11일. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS 박스 모델 모듈 4단계. 2024년 8월 4일. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS 색상 모듈 3단계. 2022년 1월 18일. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS 색상 모듈 4단계. 2026년 3월 31일. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 이미지 모듈 3단계. 2023년 12월 18일. CRD. URL: https://www.w3.org/TR/css-images-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS 텍스트 장식 모듈 4단계. 2022년 5월 4일. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 4단계. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View 모듈. 2025년 9월 16일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 표준. Living Standard. URL: https://dom.spec.whatwg.org/
[EVENT-TIMING]
Michal Mocny. 이벤트 타이밍 API. 2026년 3월 19일. WD. URL: https://www.w3.org/TR/event-timing/
[FETCH]
Anne van Kesteren. Fetch 표준. Living Standard. URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS 채우기 및 스트로크 모듈 3단계. 2017년 4월 13일. FPWD. URL: https://www.w3.org/TR/fill-stroke-3/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. 기하 인터페이스 모듈 1단계. 2025년 12월 4일. CRD. URL: https://www.w3.org/TR/geometry-1/
[HR-TIME-3]
Yoav Weiss. 고해상도 시간. 2026년 3월 24일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. Living Standard. URL: https://infra.spec.whatwg.org/
[PAINT-TIMING]
Ian Clelland; Noam Rosenthal. 페인트 타이밍. 2026년 3월 24일. WD. URL: https://www.w3.org/TR/paint-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. 성능 타임라인. 2025년 5월 21일. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. RFC에서 요구 사항 수준을 표시하기 위한 키워드. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice; et al. Streams 표준. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

정보성 참고 문헌

[ELEMENT-TIMING]
Element Timing API. Editor's Draft. URL: https://w3c.github.io/element-timing/

IDL 색인

[Exposed=Window]
interface LargestContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute unsigned long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    [Default] object toJSON();
};

LargestContentfulPaint includes PaintTimingMixin;