컨테이너 타이밍 API

커뮤니티 그룹 보고서 초안,

이 버전:
https://WICG.github.io/container-timing/
테스트 스위트:
https://github.com/web-platform-tests/wpt/tree/master/container-timing
이슈 추적:
GitHub
편집자:
Jason Williams (Bloomberg)
(Igalia)

초록

이 명세는 DOM의 주석 지정된 섹션이 화면에 표시되고 최초 페인트를 완료했을 때 이를 모니터링할 수 있게 하는 API를 정의한다.

이 문서의 상태

이 명세는 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행했다. 이는 W3C 표준이 아니며 W3C 표준화 단계에 있지도 않다. 다음 사항에 유의하라. W3C 커뮤니티 기여자 라이선스 계약 (CLA)에 따라 제한적인 옵트아웃 및 기타 조건이 적용된다. W3C 커뮤니티 및 비즈니스 그룹에 대해 자세히 알아보라.

1. 소개

Container Timing API는 주석이 지정된 DOM 섹션이 화면에 표시되고 초기 페인트가 완료되는 시점을 모니터링할 수 있도록 합니다. 개발자는 containerTiming 속성(Element Timing API의 elementtiming과 유사함)을 사용하여 DOM의 하위 섹션을 표시하고, 해당 섹션이 처음으로 페인트되었을 때 성능 엔트리를 받을 수 있습니다.

이 API를 통해 개발자는 페이지 안의 여러 컴포넌트 타이밍을 측정할 수 있다. 개발자가 애플리케이션을 점점 더 컴포넌트 단위로 구성함에 따라, 애플리케이션이나 웹 페이지의 하위 섹션에 대한 성능을 측정하려는 수요가 커지고 있다.

Element Timing과 달리, DOM의 한 섹션이 언제 페인트를 완료했는지 렌더러가 알 수는 없다(향후 변경, 새 이미지에 대한 비동기 요청, 느리게 로드되는 버튼 등이 있을 수 있음). 따라서 이 API는 업데이트가 있었을 때 PerformanceEntry 객체 형식의 후보를 내보낸다.

2. 동기

개발자는 테이블, 위젯 또는 기타 컴포넌트와 같은 DOM의 하위 섹션이 언제 페인트되었는지 측정하여 페인트 시간을 추적하고 분석 시스템에 제출하려 한다. 현재 웹 API는 이를 충분히 지원하지 않는다.

웹 작성자는 자신의 도메인을 누구보다 잘 알고 있으며, 사용자나 조직이 이해할 수 있는 방식으로 자신들의 콘텐츠 블록 성능을 전달하려 한다(예: "첫 트윗까지의 시간").

2.1. 수명 주기

이 예시 수명 주기에서 컴포넌트는 여러 콘텐츠 조각을 서로 다른 시점에 페인트하며, 이러한 각 시점은 업데이트된 정보가 포함된 새 PerformanceContainerTiming 항목을 생성한다.

그러나 한 번 영역이 페인트되면, 이후 동일한 영역을 페인트해도 새 항목이 생성되지 않습니다.

사용자가 페이지를 스크롤하거나 상호작용한 후에는 더 이상 페인트가 기록되지 않으며 새 항목도 생성되지 않습니다. Container Timing Life Cycle Diagram

3. 사용 예

다음 예시는 컨테이너 루트를 등록하고 그 페인트 타이밍을 관찰하는 방법을 보여준다.

등록은 containerTiming 속성을 사용하여 요소별로 이루어집니다:
<div containertiming="foobar">
  <main>...</main>
  <aside>...</aside>
</div>

<script>
  const observer = new PerformanceObserver((list) => {
    let perfEntries = list.getEntries();
    for (const entry of perfEntries) {
      console.log('컨테이너가 페인트됨:', entry.identifier,
                  '시각', entry.startTime,
                  '크기:', entry.size);
    }
  });
  observer.observe({ entryTypes: ["container"] });
</script>

이 속성은 요소가 문서에 추가되기 전에 설정해야 한다(HTML에서 설정하거나, JavaScript에서 설정하는 경우 문서에 추가하기 전에 설정한다). 나중에 속성을 설정하면 이후에 발생하는 이벤트와 향후 페인트만 캡처한다.

3.1. 하위 트리 무시

containerTimingIgnore 속성을 사용하여 DOM 트리의 일부를 무시할 수 있습니다:
<div containertiming="foobar">
  <main>...</main>
  <!-- Aside 업데이트는 컨테이너 타이밍 이벤트를 트리거하지 않는다 -->
  <aside containertimingignore>...</aside>
</div>

4. 용어

컨테이너 루트는 HTMLElement 중 containerTiming 속성을 가진 요소입니다.

무시되는 하위 트리는 HTMLElement를 루트로 하며 containerTimingIgnore 속성을 가진 하위 트리입니다.

페인트된 영역은 처음 관찰된 이후 누적된 컨테이너 루트의 모든 페인트된 부분을 나타내는 영역(사각형의 모음)이며, CSS 픽셀로 표현됩니다. 페인트된 영역은 뷰포트 좌표 공간에서 유지됩니다. 컨테이너 루트 요소가 이동하는 경우(예: 레이아웃 변경 또는 moveBefore()로 인해), 이전에 누적된 사각형은 조정되지 않으며 — 영역은 뷰포트 좌표에서 계속 확장됩니다.

컨테이너 타이밍 API는 컨테이너 루트가 화면에 페인트되는 시점에 대한 타이밍 정보를 제공합니다.

5. PerformanceContainerTiming 인터페이스

[Exposed=Window]
interface PerformanceContainerTiming : PerformanceEntry {
    readonly attribute DOMString identifier;
    readonly attribute DOMRectReadOnly intersectionRect;
    readonly attribute unsigned long long size;
    readonly attribute DOMHighResTimeStamp firstRenderTime;
    readonly attribute HTMLElement? lastPaintedElement;
    readonly attribute HTMLElement? rootElement;

    [Default] object toJSON();
};

PerformanceContainerTiming includes PaintTimingMixin;

참고: intersectionRect의 좌표와 size는 CSS 픽셀 단위로 표현되며(size의 경우 제곱 CSS 픽셀), 페인트된 영역의 좌표 공간 및 교차 사각형 알고리즘이 생성하는 단위와 일치한다.

각 PerformanceContainerTiming 객체에는 다음과 같은 관련 개념이 있다:

entryType 속성의 getter는 DOMString "container"를 반환해야 한다.

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

duration 속성은 0을 반환해야 한다.

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

identifier 속성은 this의 identifier 값을 반환해야 한다.

intersectionRect 속성은 this의 intersectionRect 값을 반환해야 한다.

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

firstRenderTime 속성은 this의 firstRenderTime 값을 반환해야 한다.

lastPaintedElement 속성은 this의 lastPaintedElement 값을 반환해야 한다.

rootElement 속성은 this의 rootElement 값을 반환해야 한다.

toJSON()이 호출되면, 기본 toJSON 단계를 실행합니다.

참고: 사용자 에이전트는 제거된 콘텐츠로 인해 메모리 누수가 발생하지 않도록 컨테이너 루트 레코드 맵을 유지해야 한다. 특히 항목의 수명을 HTMLElement에 대한 약한 포인터와 연결하여, HTMLElement가 제거된 후 언젠가 정리될 수 있도록 할 수 있다. 이 맵은 웹 개발자에게 노출되지 않으므로 가비지 컬렉션 시점이 노출되지 않는다.

6. 처리 모델

참고: 컨테이너 타이밍 API를 구현하는 사용자 에이전트는 supportedEntryTypes에 "container"를 포함해야 한다. 이는 Window 컨텍스트에 적용된다. 이를 통해 개발자는 컨테이너 타이밍 지원 여부를 감지할 수 있다.

6.1. 문서별 상태

각 Document에 대해, 사용자 에이전트는 컨테이너 루트 레코드 맵을 유지해야 하며, 이 맵은 컨테이너 루트 HTMLElement를 컨테이너 타이밍 레코드 객체에 매핑합니다.

각 Window에는 스크롤 이벤트를 디스패치했음이 있으며, 이는 처음에는 false로 설정되는 불리언입니다.

각 Window에는 입력 이벤트를 디스패치했음이 있으며, 이는 처음에는 false로 설정되는 불리언입니다.

6.2. DOM 명세 수정

이 절은 [DOM] 명세가 수정되면 제거됩니다.

다음과 같이 이벤트 디스패치 알고리즘을 수정합니다.

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

  1. target의 관련 전역 객체가 Window 객체이고 event의 isTrusted 가 true이면:

    1. event의 type 이 scroll이면, target의 관련 전역 객체의 스크롤 이벤트를 디스패치했음을 true로 설정합니다.

    2. event의 type 이 keydown, mousedown, pointerdown 또는 click 중 하나이면, target의 관련 전역 객체의 입력 이벤트를 디스패치했음을 true로 설정합니다.

6.3. 다음에 대한 확장: HTMLElement 인터페이스

이 절은 [DOM] 명세가 수정되면 제거됩니다.

다음과 같이 HTMLElement 인터페이스를 확장합니다:

partial interface HTMLElement {
    [CEReactions, Reflect] attribute DOMString containerTiming;
    [CEReactions, Reflect] attribute boolean containerTimingIgnore;
};
containerTiming 속성은 DOMString 이며, 요소를 컨테이너 루트로 식별합니다. 이 값은 identifier가 해당 PerformanceContainerTiming 항목의 값이 됩니다.

containerTimingIgnore 속성은 존재하는 경우, 요소와 그 자손을 무시되는 서브트리로 표시하여 컨테이너 타이밍 측정 시 조상 컨테이너 루트에 기여하지 않도록 합니다.

6.4. 컨테이너 타이밍 레코드

이 명세는 처리 모델에서 사용하는 내부 데이터 구조를 정의합니다:

컨테이너 타이밍 레코드에는 다음과 같은 관련 개념이 있습니다:
컨테이너 타이밍 레코드를 생성하려면, 페인트 타이밍 정보 paintTimingInfo와 DOMString identifier가 주어졌을 때, 다음 단계를 수행합니다:
  1. record를 새로운 컨테이너 타이밍 레코드로 둡니다.

  2. record의 paintTimingInfo를 paintTimingInfo로 설정합니다.

  3. record의 identifier를 identifier로 설정합니다.

  4. record를 반환합니다.

6.5. 컨테이너 루트 등록

다음 HTMLElement 요소에 containerTiming 콘텐츠 속성이 있고 문서에 연결되면:

  1. 사용자 에이전트는 요소를 컨테이너 루트로 등록해야 합니다.

  2. 사용자 에이전트는 컨테이너 루트에 대해 빈 페인트된 영역을 초기화해야 합니다.

  3. 사용자 에이전트는 컨테이너 루트의 서브트리 내 모든 페인트 작업을 추적해야 하며, 모든 무시되는 서브트리는 제외합니다.

6.6. containertiming 속성 제거

containerTiming 콘텐츠 속성이 HTMLElement element에서 제거되면, 다음 단계를 수행합니다:
  1. document를 element의 노드 문서로 둡니다.

  2. document의 컨테이너 루트 레코드 맵에 element에 대한 항목이 있으면, 해당 항목을 제거합니다.

참고: containerTiming 속성이 나중에 동일한 요소에 다시 추가되면, 새로운 컨테이너 타이밍 레코드가 다음 페인트 시 생성됩니다. 페인트된 영역은 새로 시작하며 — 이전 페인트 데이터는 보존되지 않습니다.

6.7. 컨테이너 루트 연결 해제

컨테이너 루트 HTMLElement element가 문서에서 연결 해제되면, 다음 단계를 수행합니다:
  1. document를 element의 노드 문서로 둡니다.

  2. document의 컨테이너 루트 레코드 맵에 element에 대한 항목이 있으면, 해당 항목을 제거합니다.

참고: 요소가 문서에 다시 연결되고 여전히 containerTiming 속성을 가지고 있으면, 새로운 컨테이너 루트 등록으로 취급됩니다. 새로운 컨테이너 타이밍 레코드가 새로운 페인트된 영역과 함께 다음 페인트 시 생성됩니다.

6.8. 컨테이너 타이밍을 위해 페인트된 요소 처리

요소가 페인트되고 사용자 에이전트가 컨테이너 타이밍 업데이트를 처리해야 할 때, Document document, 페인트 타이밍 정보 paintTimingInfo, HTMLElement element, 그리고 DOMRectReadOnly intersectionRect가 주어지면, 다음 단계를 수행합니다:
  1. window를 document의 관련 전역 객체로 둡니다.

  2. window의 스크롤 이벤트를 디스패치했음 또는 입력 이벤트를 디스패치했음 중 하나가 true이면, 반환합니다.

  3. element가 컨테이너 타이밍에 기여하지 않으면, 반환합니다.

  4. containerRoot를 element가 주어졌을 때 컨테이너 루트 요소를 가져오기의 결과로 둡니다.

  5. containerRoot가 null이면, 반환합니다.

  6. record를 document의 컨테이너 루트 레코드 맵에서 containerRoot에 대한 항목으로 둡니다. 해당 항목이 없으면, record를 컨테이너 타이밍 레코드를 생성한 결과로 설정하며, paintTimingInfo와 containerRoot의 containerTiming 콘텐츠 속성 값을 사용합니다. 그런 다음 (containerRoot → record)를 document의 컨테이너 루트 레코드 맵에 추가합니다.

  7. enclosingRect를 intersectionRect의 최소 경계 사각형으로 둡니다.

  8. document, containerRoot, element, enclosingRect, paintTimingInfo가 주어졌을 때 record에 대해 마지막 새 페인트 영역을 필요에 따라 업데이트합니다.

  9. Document에 보류 중인 컨테이너 타이밍 변경 사항이 있음을 표시합니다.

참고: 이 알고리즘은 페인트되는 각 이미지 또는 텍스트 노드에 대해 호출됩니다. 교차 사각형은 요소를 대상으로 하고 뷰포트를 루트로 하여 교차 사각형 알고리즘을 사용해 계산한 뒤 시각적 뷰포트와 교차시켜야 합니다. 텍스트 노드의 경우, 교차 사각형은 소유된 텍스트 노드 집합에 있는 모든 텍스트 노드의 테두리 상자를 포함하는 최소 사각형이며, 시각적 뷰포트와 교차됩니다.

참고: 컨테이너 타이밍은 콘텐츠의 초기 렌더링을 측정하기 위한 것입니다. 사용자가 문서를 스크롤하거나 상호작용한 후에는 페인트가 더 이상 기록되지 않습니다. 해당 페인트는 페이지 로딩이 아니라 그 스크롤 또는 상호작용의 결과(예를 들어, 콘텐츠가 스크롤되어 보이게 되거나 클릭으로 표시됨)일 가능성이 높기 때문입니다. 이미 보류 중인 항목은 현재 프레임에 대해서는 계속 내보냅니다.

6.9. 컨테이너 타이밍 항목 내보내기

Document document에 대한 컨테이너 타이밍 항목을 내보내도록 요청받으면, 다음 단계를 수행합니다. 모든 페인트 작업이 처리된 후 프레임당 한 번 호출되어야 합니다:
  1. document에 보류 중인 컨테이너 타이밍 변경 사항이 없으면, 반환합니다.

  2. document의 컨테이너 루트 레코드 맵의 각 containerRoot → record에 대해:

    1. record의 hasPendingChanges가 false이면, 계속합니다.

    2. record와 containerRoot가 주어졌을 때 컨테이너 타이밍 항목을 생성합니다.

    3. record의 hasPendingChanges를 false로 설정합니다.

    4. record의 lastNewPaintedAreaElement를 null로 설정합니다.

    5. record의 lastNewPaintedAreaSize를 0으로 설정합니다.

  3. Document에 더 이상 보류 중인 컨테이너 타이밍 변경 사항이 없음을 표시합니다.

참고: 페인트된 요소당 여러 항목을 내보낼 수 있는 일부 다른 페인트 타이밍 API와 달리, 컨테이너 타이밍은 각 컨테이너 루트의 페인트된 영역을 누적하고 프레임당 컨테이너 루트마다 최대 하나의 PerformanceContainerTiming 항목을 내보냅니다. 이 일괄 처리 방식은 더 효율적이며 컨테이너의 페인트 상태에 대한 전체적인 관점을 제공합니다.

6.10. 부모 컨테이너 루트 Element 가져오기

부모 컨테이너 루트 요소를 가져오기 위해 HTMLElement element가 주어졌을 때, 다음 단계를 수행합니다:
  1. parent를 element의 parentElement로 둡니다.

  2. parent가 null이면, null을 반환합니다.

  3. parent가 주어졌을 때 컨테이너 루트 요소를 가져오기의 결과를 반환합니다.

6.11. 컨테이너 타이밍에 기여

HTMLElement가 다음 조건을 모두 충족하면 컨테이너 루트의 컨테이너 타이밍에 기여합니다:

HTMLElement element가 컨테이너 루트 containerRoot의 컨테이너 타이밍에 기여하는지 결정하려면:
  1. element가 null이면, false를 반환합니다.

  2. element가 섀도 트리에 있으면, false를 반환합니다.

  3. element가 containerRoot의 자손이 아니면, false를 반환합니다.

  4. element가 무시되는 서브트리 내에 있으면, false를 반환합니다.

  5. true를 반환합니다.

6.12. 컨테이너 루트 Element 가져오기

컨테이너 루트 요소를 가져오기 위해 HTMLElement element가 주어졌을 때, 다음 단계를 수행합니다:
  1. element가 null이면, null을 반환합니다.

  2. element의 containerTiming 콘텐츠 속성이 존재하면, element를 반환합니다.

  3. element의 parentElement가 null이 아니면, element의 parentElement가 주어졌을 때 컨테이너 루트 요소를 가져오기의 결과를 반환합니다.

  4. null을 반환합니다.

6.13. 마지막 새 페인트 영역을 필요에 따라 업데이트

컨테이너 타이밍 레코드 record에 대해 마지막 새 페인트 영역을 필요에 따라 업데이트하려면, Document document, 컨테이너 루트 HTMLElement containerRoot, HTMLElement element, DOMRectReadOnly enclosingRect, 그리고 페인트 타이밍 정보 paintTimingInfo가 주어졌을 때 다음 단계를 수행합니다:
  1. paintedRegion을 record의 paintedRegion으로 둡니다.

  2. paintedRegion이 enclosingRect를 완전히 포함하면, 반환합니다.

  3. newPaintedArea를 enclosingRect에서 아직 paintedRegion에 포함되지 않은 영역으로 둡니다.

  4. record의 paintedRegion을 paintedRegion과 enclosingRect의 합집합으로 설정합니다.

  5. record의 lastNewPaintedAreaPaintTimingInfo를 paintTimingInfo로 설정합니다.

  6. newPaintedArea가 record의 lastNewPaintedAreaSize보다 크면:

    1. record의 lastNewPaintedAreaElement를 element로 설정합니다.

    2. record의 lastNewPaintedAreaSize를 newPaintedArea로 설정합니다.

  7. record의 hasPendingChanges를 true로 설정합니다.

  8. containerRoot의 containerTimingIgnore 콘텐츠 속성이 존재하면, 반환합니다.

  9. parentContainerRoot를 containerRoot가 주어졌을 때 부모 컨테이너 루트 요소를 가져오기의 결과로 둡니다.

  10. parentContainerRoot가 null이면, 반환합니다.

  11. parentRecord를 document의 컨테이너 루트 레코드 맵에서 parentContainerRoot에 대한 항목으로 둡니다. 해당 항목이 없으면, parentRecord를 컨테이너 타이밍 레코드를 생성한 결과로 설정하며, paintTimingInfo와 parentContainerRoot의 containerTiming 콘텐츠 속성 값을 사용합니다. 그런 다음 (parentContainerRoot → parentRecord)를 document의 컨테이너 루트 레코드 맵에 추가합니다.

  12. document, parentContainerRoot, element, enclosingRect, 그리고 paintTimingInfo가 주어졌을 때 parentRecord에 대해 마지막 새 페인트 영역을 필요에 따라 업데이트합니다.

참고: lastPaintedElement 는 단일 렌더링 프레임 내에서 가장 큰 새 페인트 영역에 기여한 요소입니다. 이를 통해 구현별 페인트 순서에 대한 의존성을 피할 수 있습니다. lastPaintedElement 는 크거나 복잡한 컨테이너 루트(예: 테이블)의 업데이트를 무엇이 유발하는지 조사하는 개발자를 위한 디버깅 보조 수단이며, 그 자체로 독립적인 성능 지표는 아닙니다. lastNewPaintedAreaSize는 항목을 내보낸 후 재설정되므로 각 프레임의 비교가 새로 시작됩니다.

참고: 이 알고리즘은 페인트된 영역의 크기와 관계없이 모든 변경을 보고합니다. 페인트된 영역이 1픽셀만 변경되어도 새로운 PerformanceContainerTiming 항목이 큐에 추가됩니다. 작은 변경을 필터링하려는 개발자는 size 값을 항목 간에 비교하여 필터링할 수 있습니다.

6.14. 컨테이너 타이밍 항목 생성

컨테이너 타이밍 레코드 record와 컨테이너 루트 HTMLElement containerRoot가 주어졌을 때 컨테이너 타이밍 항목을 생성하기 위해 사용자 에이전트는 다음 단계를 수행해야 합니다:
  1. entry를 다음 값을 갖는 새로운 PerformanceContainerTiming 항목으로 둡니다:

  2. PerformanceEntry를 큐에 추가합니다: entry.

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

7.1. 교차 출처 제한

이 API는 교차 출처 경계를 존중한다.

7.2. 정보 노출

이 API가 제공하는 대부분의 정보는 기존 API를 통해 이미 추정할 수 있다.

이 API는 다음을 노출하지 않는다.

7.3. 타이밍 공격

이 API는 DOMHighResTimeStamp를 사용하며, 이는 다른 Performance API와 일관되게 보안 목적의 해상도 제한을 받을 수 있다.

7.4. 개인정보 보호 고려사항

이 API는 다음을 하지 않는다.

8. 감사의 말

소중한 피드백과 조언을 주신 다음 분들께 깊이 감사한다.

적합성

문서 규약

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

이 명세의 모든 텍스트는 규범적이다. 단, 명시적으로 비규범으로 표시된 섹션, 예제 및 참고는 제외한다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 말로 도입되거나, 규범적 텍스트와 구분되도록 class="example"으로 따로 표시된다. 다음과 같다.

이것은 정보성 예제의 예이다.

정보성 참고는 “참고”라는 말로 시작하며, 규범적 텍스트와 구분되도록 class="note"로 따로 표시된다. 다음과 같다.

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

색인

이 명세에서 정의하는 용어

참조로 정의된 용어

참고문헌

규범 참고문헌

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. Geometry Interfaces Module Level 1. URL: https://drafts.csswg.org/geometry/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PAINT-TIMING]
Ian Clelland; Noam Rosenthal. Paint Timing. URL: https://w3c.github.io/paint-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. URL: https://w3c.github.io/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
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보성 참고문헌

[INTERSECTION-OBSERVER]
Stefan Zager; Emilio Cobos Álvarez; Traian Captan. Intersection Observer. URL: https://w3c.github.io/IntersectionObserver/

IDL 색인

[Exposed=Window]
interface PerformanceContainerTiming : PerformanceEntry {
    readonly attribute DOMString identifier;
    readonly attribute DOMRectReadOnly intersectionRect;
    readonly attribute unsigned long long size;
    readonly attribute DOMHighResTimeStamp firstRenderTime;
    readonly attribute HTMLElement? lastPaintedElement;
    readonly attribute HTMLElement? rootElement;

    [Default] object toJSON();
};

PerformanceContainerTiming includes PaintTimingMixin;

partial interface HTMLElement {
    [CEReactions, Reflect] attribute DOMString containerTiming;
    [CEReactions, Reflect] attribute boolean containerTimingIgnore;
};