크기 관찰자

W3C 최초 공개 워킹 드래프트,

이 버전:
https://www.w3.org/TR/2020/WD-resize-observer-1-20200211/
최신 게시 버전:
https://www.w3.org/TR/resize-observer-1/
편집자 초안:
https://drafts.csswg.org/resize-observer/
편집자:
(Google)
(Microsoft)
이 규격에 제안하기:
GitHub 편집자
이슈 추적:
GitHub 이슈

요약

이 명세서는 Element의 크기 변화를 관찰하는 API에 대해 설명합니다.

CSS는 구조화된 문서(HTML, XML 등)의 렌더링을 화면, 종이 등에서 기술하는 언어입니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. 다른 문서가 이 문서를 대체할 수 있습니다. W3C의 현행 출판물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 최초 공개 워킹 드래프트입니다.

최초 공개 워킹 드래프트로 게시된 것이 W3C 회원의 승인임을 의미하지 않습니다. 이 문서는 초안이며 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 부적절합니다.

GitHub 이슈를 통해 이 명세에 대한 논의를 권장합니다. 이슈를 작성할 때는 제목에 “resize-observer”라는 텍스트를 포함해 주세요, 예시: “[resize-observer] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브로 저장되며, 히스토리 아카이브도 있습니다.

이 문서는 CSS 작업 그룹에서 작성되었습니다.

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

이 문서는 2019년 3월 1일 W3C 프로세스 문서에 의해 관리됩니다.

1. 소개

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

반응형 웹 컴포넌트는 Element의 크기 변화에 대응해야 합니다. 예를 들어, 지도를 표시하는 Element가 있습니다:

반응형 웹 애플리케이션은 이미 viewport 크기 변화에 대응할 수 있습니다. 이는 CSS 미디어 쿼리나 window.resize 이벤트로 구현됩니다.

ResizeObserver API는 Element의 크기 변화를 관찰하는 인터페이스입니다. 이것은 window.resize 이벤트에 대응하는 Element의 기능입니다.

ResizeObserver의 알림은 Element 크기 변화에 대응하는 데 사용할 수 있습니다. 이 관찰에 관한 몇 가지 흥미로운 사실:

<canvas id="elipse" style="display:block"></canvas>
<div id="menu" style="display:block;width:100px">
    <img src="hamburger.jpg" style="width:24px;height:24px">
    <p class="title">menu title</p>
</div>
// 크기 변경에 따라, elipse는 캔버스 안에 타원을 그림
document.querySelector('#elipse').handleResize = entry => {
    entry.target.width = entry.borderBoxSize[0].inlineSize;
    entry.target.height = entry.borderBoxSize[0].blockSize;
    let rx = Math.floor(entry.target.width / 2);
    let ry = Math.floor(entry.target.height / 2);
    let ctx = entry.target.getContext('2d');
    ctx.beginPath();
    ctx.ellipse(rx, ry, rx, ry, 0, 0, 2 * Math.PI);
    ctx.stroke();
}
// 크기 변경에 따라, width에 따라 title의 표시 여부 변경
document.querySelector('#menu').handleResize = entry => {
    let title = entry.target.querySelector(".title")
    if (entry.borderBoxSize[0].inlineSize < 40)
        title.style.display = "none";
    else
        title.style.display = "inline-block";
}

var ro = new ResizeObserver( entries => {
  for (let entry of entries) {
    let cs = window.getComputedStyle(entry.target);
    console.log('watching element:', entry.target);
    console.log(entry.contentRect.top,' is ', cs.paddingTop);
    console.log(entry.contentRect.left,' is ', cs.paddingLeft);
    console.log(entry.borderBoxSize[0].inlineSize,' is ', cs.width);
    console.log(entry.borderBoxSize[0].blockSize,' is ', cs.height);
    if (entry.target.handleResize)
        entry.target.handleResize(entry);
  }
});
ro.observe(document.querySelector('#elipse'));
ro.observe(document.querySelector('#menu'));

2. 크기 관찰자 API

2.1. ResizeObserver 인터페이스

ResizeObserver 인터페이스는 Element의 크기 변화를 관찰하는 데 사용됩니다.

이는 MutationObserverIntersectionObserver를 기반으로 모델링되었습니다.

enum ResizeObserverBoxOptions {
    "border-box", "content-box", "device-pixel-content-box"
};

ResizeObserver는 다양한 종류의 CSS 크기를 관찰할 수 있습니다:

device-pixel-content-boxdevicePixelRatiocontent-box 크기를 곱하여 근사할 수 있습니다. 하지만 브라우저별 서브픽셀 스냅 동작 때문에, 저자(개발자)는 이 스케일된 content-box 크기의 올바른 반올림 방법을 결정할 수 없습니다. UA가 요소의 디바이스 픽셀 박스를 계산하는 방법은 구현에 따라 다릅니다. 한 가지 가능한 구현은 박스 크기와 위치에 device pixel ratio를 곱한 후, 얻어진 부동소수점 크기와 위치를 모두 정수로 반올림하는 것이며, 이 때 렌더링 결과의 품질을 최대화하는 방식으로 처리할 수 있습니다.

이 크기는 대상의 위치 변화에 의해 영향을 받을 수 있으므로, 다른 크기보다 관찰 비용이 더 높을 수 있습니다.

dictionary ResizeObserverOptions {
    ResizeObserverBoxOptions box = "content-box";
};

이 섹션은 규범적이지 않습니다. 저자가 여러 CSS 박스를 관찰하고 싶을 경우, 여러 개의 ResizeObserver를 사용해야 합니다.

// content-box를 관찰
ro.observe(document.querySelector('#menu'), { box: 'content-box' });

// border box만 관찰. 이전 관찰을 대체함.
ro1.observe(document.querySelector('#menu'), { box: 'border-box' });

이 설정은 이벤트가 발생할 때 정의된 콜백에 어떤 박스 크기가 반환되는지에는 영향을 미치지 않으며, 저자가 레이아웃 변화 관찰을 원하는 박스를 지정하는 데만 사용됩니다.

[Exposed=(Window),
 Constructor(ResizeObserverCallback callback)]
interface ResizeObserver {
    void observe(Element target, optional ResizeObserverOptions options);
    void unobserve(Element target);
    void disconnect();
};
new ResizeObserver(callback)
  1. this를 새로운 ResizeObserver 객체로 생성합니다.

  2. this.callback 내부 슬롯을 callback으로 설정합니다.

  3. this.observationTargets 내부 슬롯을 빈 리스트로 설정합니다.

  4. thisDocument.resizeObservers 슬롯에 추가합니다.

observe(target, options)

target을 관찰 대상 요소 리스트에 추가합니다.

  1. targetobservationTargets 슬롯에 이미 있다면, unobserve(target)을 호출합니다.

  2. resizeObservation을 새로운 ResizeObservation(target, options)으로 생성합니다.

  3. resizeObservationobservationTargets 슬롯에 추가합니다.

unobserve(target)

target을 관찰 대상 요소 리스트에서 제거합니다.

  1. observationResizeObservationobservationTargets 의 target 슬롯이 target인 것으로 찾습니다.

  2. observation이 없다면, 반환합니다.

  3. observationobservationTargets 에서 제거합니다.

disconnect()
  1. observationTargets 리스트를 비웁니다.

  2. activeTargets 리스트를 비웁니다.

2.2. ResizeObserverCallback

callback ResizeObserverCallback = void (sequence<ResizeObserverEntry> entries, ResizeObserver observer);

이 콜백은 ResizeObserver의 알림을 전달합니다. 활성 관찰 브로드캐스트 알고리즘에 의해 호출됩니다.

2.3. ResizeObserverEntry

[Exposed=Window]
interface ResizeObserverEntry {
    readonly attribute Element target;
    readonly attribute DOMRectReadOnly contentRect;
    readonly attribute sequence<ResizeObserverSize> borderBoxSize;
    readonly attribute sequence<ResizeObserverSize> contentBoxSize;
    readonly attribute sequence<ResizeObserverSize> devicePixelContentBoxSize;
};

contentRect는 ResizeObserver의 인큐베이팅 단계에서 도입되었으며, 현재 웹 호환성 유지를 위해 포함되어 있습니다. 향후 레벨에서 폐지될 수 있습니다.

target, 타입 Element, 읽기 전용

크기가 변경된 Element입니다.

contentRect, 타입 DOMRectReadOnly, 읽기 전용

Elementcontent rect로, ResizeObserverCallback 이 호출될 때의 값입니다.

borderBoxSize, 타입 sequence<ResizeObserverSize>, 읽기 전용

시퀀스에 Elementborder box 크기가 담겨 있으며, ResizeObserverCallback 이 호출될 때의 값입니다.

contentBoxSize, 타입 sequence<ResizeObserverSize>, 읽기 전용

시퀀스에 Elementcontent rect 크기가 담겨 있으며, ResizeObserverCallback 이 호출될 때의 값입니다.

devicePixelContentBoxSize, 타입 sequence<ResizeObserverSize>, 읽기 전용

시퀀스에 Elementcontent rect가 정수형 디바이스 픽셀 단위로 담겨 있으며, ResizeObserverCallback 이 호출될 때의 값입니다.

박스 크기 속성들은 여러 fragment를 가질 수 있는 요소를 지원하기 위해 시퀀스로 노출됩니다. 이는 멀티 컬럼 시나리오에서 발생합니다. 하지만 content rectborder box의 현행 정의에서는 멀티 컬럼 레이아웃에 의해 박스가 어떻게 영향을 받는지 언급되지 않습니다. 이 명세에서는 시퀀스에 단일 ResizeObserverSize만 반환되며, 이는 첫 번째 컬럼의 크기에 해당합니다. 이후 버전의 명세에서는 시퀀스에 fragment별 크기 정보를 포함하도록 확장될 예정입니다.

interface ResizeObserverSize {
    readonly attribute unrestricted double inlineSize;
    readonly attribute unrestricted double blockSize;
};

3. 처리 모델

3.1. ResizeObservation 예시 구조체

이 섹션은 규범적이지 않습니다. ResizeObservation은 Resize Observer 구현 시 사용할 수 있는 예시 구조체입니다. 처리 모델 설명을 명확히 하기 위해 포함된 것으로, 단일 Element의 관찰 정보를 효과적으로 담고 있습니다. 이 인터페이스는 Javascript에서 볼 수 없습니다.

[Constructor(Element target)
]
interface ResizeObservation {
    readonly attribute Element target;
    readonly attribute ResizeObserverBoxOptions observedBox;
    readonly attribute sequence<ResizeObserverSize> lastReportedSizes;
};
target, 타입 Element, 읽기 전용

관찰 중인 Element입니다.

observedBox, 타입 ResizeObserverBoxOptions, 읽기 전용

관찰 중인 박스 종류입니다.

lastReportedSizes, 타입 sequence<ResizeObserverSize>, 읽기 전용

마지막으로 보고된 크기들의 순서 있는 시퀀스입니다.

new ResizeObservation(target, observedBox)
  1. this를 새로운 ResizeObservation 객체로 생성합니다.

  2. this 내부 target 슬롯을 target으로 설정합니다.

  3. this 내부 observedBox 슬롯을 observedBox로 설정합니다.

  4. this 내부 lastReportedSizes 슬롯을 [(0,0)]으로 설정합니다.

isActive()
  1. currentSize박스 크기 계산 알고리즘을 통해 targetobservedBox로부터 구합니다.

  2. currentSize가 this.lastReportedSizes의 첫 번째 항목과 다르면 true를 반환합니다.

  3. false를 반환합니다.

3.2. 내부 슬롯 정의

3.2.1. Document

DocumentresizeObservers 슬롯을 가지며, 이 슬롯은 이 문서에서의 ResizeObserver 목록입니다. 초기값은 빈 리스트입니다.

3.2.2. ResizeObserver

ResizeObservercallback 슬롯을 가지며, 생성자에서 초기화됩니다.

ResizeObserverobservationTargets 슬롯을 가지며, 이 슬롯은 ResizeObservation 목록입니다. 관찰 중인 모든 Element를 나타냅니다.

ResizeObserveractiveTargets 슬롯을 가지며, 이 슬롯은 ResizeObservation 목록입니다. 마지막 관찰 브로드캐스트 이후 크기가 변경되어 브로드캐스트 대상이 되는 모든 Element를 나타냅니다.

ResizeObserverskippedTargets 슬롯을 가지며, 이 슬롯은 ResizeObservation 목록입니다. 마지막 관찰 브로드캐스트 이후 크기가 변경되었으나 브로드캐스트 대상이 **아닌** 모든 Element를 나타냅니다.

3.3. CSS 정의

3.3.1. content rect

DOM content rect는 다음과 같은 rect입니다:

content width 명세는 멀티 컬럼 레이아웃이 content box에 미치는 영향을 언급하지 않습니다. 본 명세에서는, multi-column 내부 Element의 content width는 getComputedStyle(element).width의 결과입니다. 현재는 첫 번째 컬럼의 너비로 평가됩니다.

content rect 위치가 padding-top/left인 것은 대상 자식의 절대 위치 지정에 유용합니다. 절대 위치 좌표 공간의 원점은 padding rect의 좌상단입니다.

content rect를 관찰하면 다음과 같은 동작이 발생합니다:

웹 콘텐츠에는 SVG 요소도 포함될 수 있습니다. SVG Element는 content box 대신 bounding box를 정의합니다. SVGGraphicsElement의 content rect는 다음과 같은 rect입니다:

3.4. 알고리즘

3.4.1. 깊이에서 활성 관찰 모으기

이 알고리즘은 document의 모든 활성 관찰을 계산합니다. 깊이에서 활성 관찰 모으기를 위해 다음 단계를 실행합니다:

  1. 전달받은 depth를 설정합니다.

  2. resizeObservers의 각 observer에 대해 다음 단계를 실행합니다:

    1. observeractiveTargetsskippedTargets를 모두 비웁니다.

    2. observer.observationTargets의 각 observation에 대해 다음 단계를 실행합니다:

      1. observation.isActive()가 true이면

        1. targetDepthobservation.target에 대해 노드의 깊이 계산 결과로 설정합니다.

        2. targetDepthdepth보다 크면 observationactiveTargets에 추가합니다.

        3. 그 외의 경우 observationskippedTargets에 추가합니다.

3.4.2. 활성 관찰 있음

Document활성 관찰 있음을 판단하려면 다음 단계를 실행합니다:

  1. resizeObservers의 각 observer에 대해 다음 단계를 실행합니다:

    1. observer.activeTargets가 비어있지 않으면 true를 반환합니다.

  2. false를 반환합니다.

3.4.3. 건너뛴 관찰 있음

Document건너뛴 관찰 있음을 판단하려면 다음 단계를 실행합니다:

  1. resizeObservers의 각 observer에 대해 다음 단계를 실행합니다:

    1. observer.skippedTargets가 비어있지 않으면 true를 반환합니다.

  2. false를 반환합니다.

3.4.4. ResizeObserverEntry 생성 및 채우기

ResizeObserverEntry 생성 및 채우기target에 대해 실행하려면, 다음 단계를 따르세요:
  1. this를 새로운 ResizeObserverEntry로 설정합니다.

  2. this.target 슬롯을 target으로 설정합니다.

  3. this.borderBoxSize 슬롯을 target과 "border-box" observedBox로 크기 계산 결과로 설정합니다.

  4. this.contentBoxSize 슬롯을 target과 "content-box" observedBox로 크기 계산 결과로 설정합니다.

  5. this.devicePixelContentBoxSize 슬롯을 target과 "device-pixel-content-box" observedBox로 크기 계산 결과로 설정합니다.

  6. this.contentRect 를 논리적 this.contentBoxSize로, target과 "content-box" observedBox로 설정합니다.

  7. target이 SVG 요소가 아니라면 다음 단계를 실행하세요:

    1. this.contentRect.top을 target.padding top으로 설정합니다.

    2. this.contentRect.left를 target.padding left로 설정합니다.

  8. target이 SVG 요소라면 다음 단계를 실행하세요:

    1. this.contentRect.top과 this.contentRect.left를 0으로 설정합니다.

3.4.5. 활성 관찰 알림 브로드캐스트

활성 관찰 브로드캐스트는 문서의 모든 활성 관찰을 전달하며, 브로드캐스트된 대상 중 가장 얕은 깊이를 반환합니다.

document에 대해 활성 관찰을 브로드캐스트하려면, 다음 단계를 따르세요:

  1. shallowestTargetDepth를 ∞로 설정합니다.

  2. document.resizeObservers의 각 observer에 대해 다음 단계를 실행하세요:

    1. observer.activeTargets 슬롯이 비어 있으면 계속 진행합니다.

    2. entriesResizeObserverEntry의 빈 리스트로 설정합니다.

    3. activeTargets의 각 observation에 대해 다음 단계를 실행하세요:

      1. entryResizeObserverEntry 생성 및 채우기observation.target에 대해 실행한 결과로 설정합니다.

      2. entryentries에 추가합니다.

      3. observation.lastReportedSizes 를 일치하는 entry 크기로 설정합니다.

        1. 일치하는 크기가 observation.observedBox가 "border-box"일 때 entry.borderBoxSize입니다.

        2. 일치하는 크기가 observation.observedBox가 "content-box"일 때 entry.contentBoxSize입니다.

        3. 일치하는 크기가 observation.observedBox가 "device-pixel-content-box"일 때 entry.devicePixelContentBoxSize입니다.

      4. targetDepth노드의 깊이 계산observation.target에 대해 실행한 결과로 설정합니다.

      5. targetDepthshallowestTargetDepth보다 작으면 shallowestTargetDepthtargetDepth로 설정합니다.

    4. observer.callbackentries로 호출합니다.

    5. observer.activeTargets를 비웁니다.

  3. shallowestTargetDepth를 반환합니다.

3.4.6. Resize Loop 오류 전달

Resize Loop 오류 알림 전달을 실행하려면 다음 단계를 따르세요:

  1. ErrorEvent를 생성합니다.

  2. event의 message 슬롯을 "ResizeObserver loop completed with undelivered notifications."로 초기화합니다.

  3. 예외 event를 보고합니다.

3.4.7. 노드의 깊이 계산

노드의 깊이 계산node에 대해 실행하려면, 다음 단계를 따르세요:

  1. pnode에서 이 요소의 평탄화된 DOM 트리의 루트 Element까지의 부모-트래버설 경로로 설정합니다.

  2. p의 노드 개수를 반환합니다.

3.4.8. 대상 및 관찰 박스 기준 박스 크기 계산

이 알고리즘은 target Element의 관찰 박스 크기를 계산합니다. 박스 타입은 ResizeObserverBoxOptions로 설명됩니다. SVG 요소는 예외입니다. SVG 크기는 항상 bounding box 크기이며, SVG 요소는 표준 CSS 박스 모델을 사용하지 않습니다.

박스 크기 계산targetobservedBox에 대해 실행하려면, 다음 단계를 따르세요:

  1. targetSVGGraphicsElement라면

    1. computedSize.inlineSize를 targetbounding box 인라인 길이로 설정합니다.

    2. computedSize.blockSize를 targetbounding box 블록 길이로 설정합니다.

  2. targetSVGGraphicsElement가 아니라면

    1. observedBox가 "border-box"라면

      1. computedSize.inlineSize를 target의 border area 인라인 길이로 설정합니다.

      2. computedSize.blockSize를 target의 border area 블록 길이로 설정합니다.

    2. observedBox가 "content-box"라면

      1. computedSize.inlineSize를 target의 content area 인라인 길이로 설정합니다.

      2. computedSize.blockSize를 target의 content area 블록 길이로 설정합니다.

    3. observedBox가 "device-pixel-content-box"라면

      1. computedSize.inlineSize를 target의 content area 인라인 길이(정수형 디바이스 픽셀)로 설정합니다.

      2. computedSize.blockSize를 target의 content area 블록 길이(정수형 디바이스 픽셀)로 설정합니다.

    4. computedSize를 반환합니다.

3.5. ResizeObserver 생명주기

ResizeObserver 는 다음 두 조건이 모두 충족될 때까지 살아 있습니다:

3.6. 외부 명세 통합

3.6.1. HTML 처리 모델: 이벤트 루프

ResizeObserver 처리는 HTML 처리 모델 이벤트 루프의 7.12단계에서 수행됩니다.

12단계는 현재 다음과 같이 명확히 정의되어 있지 않습니다:

docs의 모든 완전히 활성화된 Document에 대해, 해당 Document와 그 브라우징 컨텍스트의 렌더링 또는 사용자 인터페이스를 현재 상태에 맞게 갱신한다..

기존 12단계는 다음과 같이 완전히 명세될 수 있습니다:

docs의 모든 완전히 활성화된 Document에 대해, 해당 Document와 그 브라우징 컨텐츠에 대해 다음 단계를 실행:

  1. 스타일 재계산

  2. 레이아웃 업데이트

  3. 페인트

ResizeObserver 는 12단계에 리사이즈 알림 처리를 확장합니다. 모든 보류 중인 알림을 처리하기 위해, 더 이상 보류 중인 알림이 없을 때까지 루프를 반복합니다. 이 과정에서 무한 루프가 발생할 수 있습니다.

무한 루프는 각 반복마다 알림 가능한 노드 집합을 축소함으로써 방지됩니다. 각 반복에서는 이전 반복에서 가장 얕았던 노드보다 더 깊은 노드만 알림이 가능합니다.

알림 루프가 완료되고 아직 전달되지 않은 알림이 있을 경우 오류가 발생합니다. 전달되지 않은 알림이 있는 요소는 다음 루프에서 다시 전달 대상으로 고려됩니다.

ResizeObserver 알림이 포함된 12단계는 다음과 같습니다:

docs의 모든 완전히 활성화된 Document에 대해, 해당 Document와 그 브라우징 컨텍스트에 대해 다음 단계를 실행:

  1. 스타일 재계산

  2. 레이아웃 업데이트

  3. depth를 0으로 설정

  4. 깊이에서 활성 관찰 모으기 depthDocument에 대해 실행

  5. document에 활성 관찰 있음 동안 반복

    1. depth활성 관찰 브로드캐스트 결과로 설정

    2. 스타일 재계산

    3. 레이아웃 업데이트

    4. 깊이에서 활성 관찰 모으기 depthDocument에 대해 실행

  6. Document건너뛴 관찰 있음이면 Resize Loop 오류 알림 전달

  7. Document와 그 브라우징 컨텍스트의 렌더링 또는 UI를 현재 상태에 맞게 갱신

적합성

문서 관례

적합성 요구사항은 설명적 단언과 RFC 2119 용어의 조합으로 표현됩니다. 규범적 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”의 주요 단어는 RFC 2119에서 정의된 대로 해석해야 합니다. 그러나 가독성을 위해 이 명세에서는 모든 대문자를 사용하지 않습니다.

이 명세의 모든 텍스트는 명백히 비규범적임을 표시한 섹션, 예시, 참고를 제외하고는 규범적입니다. [RFC2119]

이 명세서의 예시는 “for example”이라는 단어로 시작하거나, 다음과 같이 규범적 텍스트와 구분되어 있습니다: class="example", 예시:

이것은 안내용 예시입니다.

안내용 참고는 “Note”로 시작하며, 다음과 같이 규범적 텍스트와 구분되어 있습니다: class="note", 예시:

참고, 이것은 안내용 참고입니다.

권고 사항은 규범적 섹션으로 특별한 주의를 환기하도록 스타일링되며, 다음과 같이 다른 규범적 텍스트와 구분되어 있습니다: <strong class="advisement">, 예시: UA는 반드시 접근 가능한 대체 수단을 제공해야 합니다.

적합성 클래스

이 명세에 대한 적합성은 다음 세 가지 적합성 클래스로 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA는 스타일 시트의 의미를 해석하고, 이를 사용하는 문서를 렌더링합니다.
저작 도구
UA는 스타일 시트를 작성합니다.

스타일 시트가 이 명세에 적합하려면, 이 모듈에서 정의된 문법을 사용하는 모든 선언이 CSS의 일반 문법 및 각 기능의 개별 문법에 따라 유효해야 합니다.

렌더러가 이 명세에 적합하려면, 해당 스타일 시트를 적합한 명세서대로 해석하는 것 외에도, 이 명세에서 정의된 모든 기능을 올바르게 파싱하고 문서를 이에 맞게 렌더링해야 합니다. 하지만, 디바이스의 한계로 인해 UA가 문서를 올바르게 렌더링하지 못하는 것은 비적합성을 의미하지 않습니다. (예: UA가 흑백 모니터에서 색상을 렌더링할 필요는 없습니다.)

저작 도구가 이 명세에 적합하려면, 이 모듈에서 정의된 각 기능의 CSS 문법 및 기타 모든 적합성 요구사항을 모두 충족하는 올바른 스타일 시트를 작성해야 합니다.

CSS의 책임 있는 구현 요구사항

다음 섹션에서는 현재와 미래의 상호운용성을 촉진하는 방식으로 CSS를 책임 있게 구현하기 위한 여러 적합성 요구사항을 정의합니다.

부분 구현

저자가 미래 호환 구문 규칙을 활용하여 대체 값을 지정할 수 있도록, CSS 렌더러는 지원 가능한 수준이 없는 모든 at-rule, 속성, 속성 값, 키워드 및 기타 구문 구조를 무효로 간주하고 적절하게 무시해야 합니다. 특히, 사용자 에이전트는 지원하지 않는 속성 값을 선택적으로 무시하고, 하나의 multi-value 속성 선언에서 지원되는 값만 적용해서는 안 됩니다: 어떤 값이라도 무효로 간주되면(지원하지 않는 값은 반드시 무효로 간주해야 함), CSS는 전체 선언을 무시해야 함을 요구합니다.

불안정/독점 기능의 구현

향후 안정적인 CSS 기능과 충돌을 피하기 위해, CSSWG는 모범 사례를 따를 것을 권장합니다. 불안정 기능독점 확장 구현 시 참고하세요.

CR 단계 기능의 구현

명세가 후보 권고(Candidate Recommendation) 단계에 도달하면, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 CR 단계 기능에 대해 접두사 없는 구현을 공개해야 하며, 해당 기능의 접두사 버전을 노출하는 것은 피해야 합니다.

CSS의 상호운용성을 확립하고 유지하기 위해, CSS 작업 그룹은 실험적이지 않은 CSS 렌더러에게 어떤 CSS 기능의 접두사 없는 구현을 공개하기 전에 구현 보고서와(필요하다면) 해당 구현 보고서에 사용된 테스트 케이스를 W3C에 제출해줄 것을 요청합니다. W3C에 제출된 테스트 케이스는 CSS 작업 그룹에 의해 검토 및 수정될 수 있습니다.

테스트 케이스 및 구현 보고서 제출에 대한 추가 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내세요.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[CSS-BOX-3]
Elika Etemad. CSS 박스 모델 모듈 Level 3. 2018년 12월 18일. WD. URL: https://www.w3.org/TR/css-box-3/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 뷰 모듈. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 현행 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry 인터페이스 모듈 Level 1. 2018년 12월 4일. CR. URL: https://www.w3.org/TR/geometry-1/
[HTML]
Anne van Kesteren; et al. HTML 현행 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내는 키워드. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[SVG2]
Amelia Bellamy-Royds; et al. SVG 2 (Scalable Vector Graphics). 2018년 10월 4일. CR. URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Boris Zbarsky. Web IDL. 2016년 12월 15일. ED. URL: https://heycam.github.io/webidl/

IDL 색인

enum ResizeObserverBoxOptions {
    "border-box", "content-box", "device-pixel-content-box"
};

dictionary ResizeObserverOptions {
    ResizeObserverBoxOptions box = "content-box";
};

[Exposed=(Window),
 Constructor(ResizeObserverCallback callback)]
interface ResizeObserver {
    void observe(Element target, optional ResizeObserverOptions options);
    void unobserve(Element target);
    void disconnect();
};

callback ResizeObserverCallback = void (sequence<ResizeObserverEntry> entries, ResizeObserver observer);

[Exposed=Window]
interface ResizeObserverEntry {
    readonly attribute Element target;
    readonly attribute DOMRectReadOnly contentRect;
    readonly attribute sequence<ResizeObserverSize> borderBoxSize;
    readonly attribute sequence<ResizeObserverSize> contentBoxSize;
    readonly attribute sequence<ResizeObserverSize> devicePixelContentBoxSize;
};

interface ResizeObserverSize {
    readonly attribute unrestricted double inlineSize;
    readonly attribute unrestricted double blockSize;
};

[Constructor(Element target)
]
interface ResizeObservation {
    readonly attribute Element target;
    readonly attribute ResizeObserverBoxOptions observedBox;
    readonly attribute sequence<ResizeObserverSize> lastReportedSizes;
};