CSS 뷰 전환 모듈 레벨 1

W3C 후보 권고 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/CRD-css-view-transitions-1-20240328/
최신 공개 버전:
https://www.w3.org/TR/css-view-transitions-1/
편집자 초안:
https://drafts.csswg.org/css-view-transitions-1/
기록:
https://www.w3.org/standards/history/css-view-transitions-1/
구현 보고서:
https://wpt.fyi/results/css/css-view-transitions
피드백:
CSSWG 이슈 저장소
편집자:
Tab Atkins-Bittner (Google)
Jake Archibald (Google)
Khushal Sagar (Google)
이 명세에 대한 수정 제안:
GitHub 편집자

요약

이 모듈은 View Transition API와 관련 속성 및 의사 요소를 정의하며, 개발자가 문서 상태 변화에 따른 애니메이션 시각적 전환을 만들 수 있도록 합니다.

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

이 문서의 상태

이 섹션은 문서가 출판될 당시의 상태를 설명합니다. 최신 W3C 출판물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 색인 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에 의해 후보 권고 초안으로 권고 트랙을 사용하여 출판되었습니다. 후보 권고로 출판된다고 해서 W3C 및 회원들의 승인이나 지지를 의미하지 않습니다. 후보 권고 초안은 작업 그룹이 이후 후보 권고 스냅샷에 포함하려는 이전 후보 권고의 변경 사항을 통합합니다.

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

피드백은 GitHub 이슈 등록(권장)에 의해 보내주시고, 제목에 명세 코드 "css-view-transitions"을 포함해 주십시오. 예: “[css-view-transitions] …의견 요약…”. 모든 이슈와 의견은 아카이브됩니다. 또는, 피드백은 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로도 보낼 수 있습니다.

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

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

1. 소개

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

이 명세는 개발자가 문서의 다양한 상태 간에 뷰 전환이라 불리는 애니메이션 시각적 전환을 생성할 수 있도록 하는 DOM API와 관련 CSS 기능을 도입합니다.

1.1. 시각적 전환과 DOM 업데이트의 분리

전통적으로, 두 문서 상태 간의 시각적 전환을 만들기 위해서는 두 상태가 동시에 DOM에 존재하는 기간이 필요했습니다. 실제로는 두 상태를 모두 표현할 수 있는 특정 DOM 구조를 만드는 과정을 포함하는 경우가 많았습니다. 예를 들어, 한 요소가 컨테이너 사이를 “이동”하는 경우, 전환 기간 동안 해당 요소가 어느 컨테이너에도 속하지 않게 위치시켜야 하는 경우가 많았으며, 이는 각 컨테이너나 상위 요소에 의한 잘림(clipping)을 방지하기 위함입니다.

이러한 중간 상태는 순수 시각적 효과를 위해 DOM 구조를 손상시키므로 UX 및 접근성 문제를 유발하는 경우가 많았습니다.

뷰 전환은 DOM이 상태 간 즉시 전환될 수 있도록 하여 이러한 문제의 중간 상태를 피하고, 또 다른 레이어에서 이전 상태의 정적 시각 캡처와 새 상태의 실시간 캡처를 사용하여 두 상태 간의 커스터마이즈 가능한 시각적 전환을 수행합니다. 이러한 캡처는 의사 요소의 트리로 표현되며(자세한 내용은 § 3.2 뷰 전환 의사 요소 참고), 이전 시각적 상태와 새로운 상태가 동시에 존재할 수 있어, 크로스 페이드와 같이 이전 상태에서 새로운 크기와 위치로 애니메이션하는 효과를 구현할 수 있습니다.

1.2. 뷰 전환 커스터마이징

기본적으로, document.startViewTransition() 은 두 DOM 상태 사이의 페이지 전체 크로스 페이드로 구성된 뷰 전환을 생성합니다. 개발자는 view-transition-name CSS 속성을 사용하여 개별적으로 캡처될 요소를 선택할 수 있으며, 이렇게 선택된 요소들은 페이지의 나머지 부분과 독립적으로 애니메이션할 수 있습니다. 전환 상태(이전 시각 캡처와 새로운 시각 캡처가 동시에 존재하는 상태)는 의사 요소로 표현되므로, 개발자는 CSS 애니메이션웹 애니메이션과 같은 익숙한 기능을 활용해 각 전환을 커스터마이즈할 수 있습니다.

1.3. 뷰 전환 라이프사이클

성공적인 뷰 전환은 다음과 같은 단계로 진행됩니다:

  1. 개발자가 document.startViewTransition(updateCallback) 을 호출하면, ViewTransition 객체 viewTransition이 반환됩니다.

  2. 현재 상태가 “이전” 상태로 캡처됩니다.

  3. 렌더링이 일시 중지됩니다.

  4. 개발자의 updateCallback 함수(제공된 경우)가 호출되어, 문서 상태를 업데이트합니다.

  5. viewTransition.updateCallbackDone 이 완료됩니다.

  6. 현재 상태가 “새로운” 상태로 캡처됩니다.

  7. 전환 의사 요소가 생성됩니다. 해당 구조에 대한 개요는 § 3.2 뷰 전환 의사 요소를 참고하세요.

  8. 렌더링이 재개되어 전환 의사 요소가 표시됩니다.

  9. viewTransition.ready 가 완료됩니다.

  10. 의사 요소가 애니메이션되어 완료될 때까지 진행됩니다.

  11. 전환 의사 요소가 제거됩니다.

  12. viewTransition.finished 가 완료됩니다.

1.4. 향상 기능으로서의 전환

View Transition API 설계의 핵심은 애니메이션 전환이 문서 상태 변화에 대한 시각적 향상이라는 점입니다. 즉, 잘못된 설정이나 디바이스 제약 등으로 인해 시각적 전환 생성에 실패하더라도, UpdateCallback 은 여전히 호출되며, 전환 애니메이션이 미리 불가능하다는 것이 알려진 경우에도 마찬가지입니다.

예를 들어, 개발자가 skipTransition()뷰 전환 라이프사이클 초기에 호출하면, 뷰 전환 트리 생성 등 애니메이션 전환과 관련된 단계들은 수행되지 않습니다. 하지만 UpdateCallback 은 여전히 호출됩니다. 건너뛰는 것은 시각적 전환뿐이며, 기본적인 상태 변화는 그대로 진행됩니다.

Note: 만약 DOM 변경까지 건너뛰어야 한다면, 다른 기능을 통해 처리해야 합니다. navigateEvent.signal 은 이를 처리하는 데 사용할 수 있는 기능의 예시입니다.

View Transition API는 UpdateCallback을 통해 DOM 변경을 비동기적으로 허용하지만, API는 전환 자체에 필요한 스케줄링을 제외하고 DOM 변경을 큐잉하거나 별도로 스케줄링하는 역할을 하지 않습니다. 일부 비동기적 DOM 변경은(예: 독립적인 컴포넌트 내에서 발생하는 경우) 동시에 처리될 수 있지만, 다른 경우에는 큐잉되거나 이전 변경을 중단해야 할 수도 있습니다. 이는 애플리케이션 전체를 더 포괄적으로 관리하는 기능이나 프레임워크가 담당하는 것이 가장 적합합니다.

1.5. 렌더링 모델

뷰 전환은 UA에서 생성한 의사 요소를 사용해 요소의 렌더링 상태를 복제하는 방식으로 작동합니다. 요소 자체나 자손에 적용되는 렌더링의 측면들, 예를 들어 filteropacity 같은 시각 효과, overflowclip-path에 의한 클리핑 등은 이미지 캡처 단계에서 이미지 생성 시 적용됩니다.

하지만 mix-blend-mode 같이 요소가 포함될 때 그리기 방식을 정의하는 속성은 이미지에 적용할 수 없습니다. 이러한 속성은 요소에 해당하는 ::view-transition-group() 의사 요소에 적용되며, 이 의사 요소는 요소와 동일한 박스를 생성하기 위한 것입니다.

만약 ::view-transition-group()이 "새로운" 상태에 해당하는 요소가 있다면, 브라우저는 ::view-transition-group()에 복사된 속성을 DOM 요소의 "새로운" 상태와 동기화합니다. 만약 ::view-transition-group()이 "이전"과 "새로운" 상태 모두에 해당한다면, 그리고 복사되는 속성이 보간(interpolatable) 가능하다면, 브라우저는 해당 속성을 부드럽게 애니메이션하는 기본 애니메이션도 설정합니다.

1.6. 예시

이미 다음과 같은 패턴으로 콘텐츠를 업데이트하는 페이지가 있다고 가정합시다:
function spaNavigate(data) {
  updateTheDOMSomehow(data);
}

뷰 전환을 다음과 같이 추가할 수 있습니다:

function spaNavigate(data) {
  // 이 API를 지원하지 않는 브라우저에 대한 폴백:
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // 전환을 사용한 경우:
  document.startViewTransition(() => updateTheDOMSomehow(data));
}

이렇게 하면 빠른 크로스 페이드가 기본 전환으로 적용됩니다:

크로스 페이드는 의사 요소 트리에 CSS 애니메이션을 적용해 구현되므로, CSS를 활용해 커스터마이즈할 수 있습니다. 예시:

::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 5s;
}

이렇게 하면 더 느린 전환이 됩니다:

이전 예시를 기반으로, 모션을 추가할 수도 있습니다:
@keyframes fade-in {
  from { opacity: 0; }
}

@keyframes fade-out {
  to { opacity: 0; }
}

@keyframes slide-from-right {
  from { transform: translateX(30px); }
}

@keyframes slide-to-left {
  to { transform: translateX(-30px); }
}

::view-transition-old(root) {
  animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
}

::view-transition-new(root) {
  animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
}

결과는 다음과 같습니다:

이전 예시를 기반으로, 헤더와 헤더 내부의 텍스트에 각각 ::view-transition-group()을 부여해 전환 처리할 수 있습니다:
.main-header {
  view-transition-name: main-header;
}

.main-header-text {
  view-transition-name: main-header-text;
  /* 동일한 텍스트를 가정해 요소 크기를 일관되게 설정: */
  width: fit-content;
}

이 그룹들은 기본적으로 “이전”에서 “새로운” 상태로 크기와 위치를 전환하며, 시각적 상태는 크로스 페이드됩니다:

이전 예시를 기반으로, 일부 페이지에 사이드바가 있다고 가정합시다:

이 경우, 사이드바가 "이전"과 "새로운" 상태 모두에 있다면 정적으로 유지하는 것이 더 보기 좋습니다. 그렇지 않으면 애니메이션으로 등장하거나 사라지도록 처리해야 합니다.

:only-child 의사 클래스는 이러한 상태에 맞는 애니메이션을 만들 때 사용할 수 있습니다:

.sidebar {
  view-transition-name: sidebar;
}

@keyframes slide-to-right {
  to { transform: translateX(30px); }
}

/* 등장 전환 */
::view-transition-new(sidebar):only-child {
  animation: 300ms cubic-bezier(0, 0, 0.2, 1) both fade-in,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
}

/* 퇴장 전환 */
::view-transition-old(sidebar):only-child {
  animation: 150ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-right;
}

사이드바가 "이전"과 "새로운" 상태 모두에 있을 때는 기본 애니메이션이 적합합니다.

이번에는 이전 예시를 기반으로 하지 않고, 사용자의 커서로부터 원형으로 드러나는 전환을 만들고 싶다고 가정해봅시다. 이는 CSS만으로는 구현할 수 없습니다.

먼저 CSS에서 “이전”과 “새로운” 상태가 기본 블렌딩 없이 서로 겹칠 수 있도록 하고, 기본 크로스 페이드 애니메이션을 방지합니다:

::view-transition-image-pair(root) {
  isolation: auto;
}

::view-transition-old(root),
::view-transition-new(root) {
  animation: none;
  mix-blend-mode: normal;
}

그리고 JavaScript:

// 마지막 클릭 이벤트 저장
let lastClick;
addEventListener('click', event => (lastClick = event));

function spaNavigate(data) {
  // 이 API를 지원하지 않는 브라우저에 대한 폴백:
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // 클릭 위치를 가져오거나 없으면 화면 중앙으로 대체
  const x = lastClick?.clientX ?? innerWidth / 2;
  const y = lastClick?.clientY ?? innerHeight / 2;
  // 가장 먼 코너까지의 거리 계산
  const endRadius = Math.hypot(
    Math.max(x, innerWidth - x),
    Math.max(y, innerHeight - y)
  );

  // 전환 생성:
  const transition = document.startViewTransition(() => {
    updateTheDOMSomehow(data);
  });

  // 의사 요소가 생성될 때까지 대기:
  transition.ready.then(() => {
    // 루트의 새로운 뷰에 애니메이션 적용
    document.documentElement.animate(
      {
        clipPath: [
          \`circle(0 at ${x}px ${y}px)\`,
          \`circle(${endRadius}px at ${x}px ${y}px)\`,
        ],
      },
      {
        duration: 500,
        easing: 'ease-in',
        // 애니메이션할 의사 요소 지정
        pseudoElement: '::view-transition-new(root)',
      }
    );
  });
}

그리고 결과는 다음과 같습니다:

2. CSS 속성

2.1. 개별적으로 전환되는 하위 트리 태깅: view-transition-name 속성

이름: view-transition-name
값: none | <custom-ident>
초기값: none
적용 대상: 모든 요소
상속됨: 아니오
백분율: 해당 없음
계산된 값: 명시된 그대로
정규화 순서: 문법에 따름
애니메이션 타입: 불연속(discrete)

참고: view-transition-name불연속적으로 애니메이션 가능하지만, 그것을 애니메이션한다고 해서 실행 중인 뷰 전환에 영향을 주진 않습니다. 오히려 시간이 흐르면서, 또는 타임라인에 따라 해당 값을 변화시킬 수 있는 방법입니다. 예를 들어 view-transition-name스크롤 기반 애니메이션에 따라 변경하는 경우를 생각할 수 있습니다.

view-transition-name 속성은 요소를 뷰 전환에서 캡처 대상으로 “태그”하며, 지정된 뷰 전환 이름 아래에서 뷰 전환 트리 내에서 독립적으로 추적됩니다. 이렇게 캡처된 요소는 페이지의 나머지 부분과 독립적으로 애니메이션됩니다.

none

요소는 뷰 전환에 독립적으로 참여하지 않습니다.

<custom-ident>

요소는 지정된 뷰 전환 이름과 함께, 이전 또는 새로운 요소로서 뷰 전환에 독립적으로 참여합니다.

여기서 noneauto 값은 <custom-ident>에서 제외됩니다.

참고: 이 이름이 고유하지 않은 경우(즉, 두 요소가 동시에 동일한 뷰 전환 이름을 지정하면) 뷰 전환이 중단됩니다.

참고: 이 API에서는, 만약 한 요소가 이전 상태에서 뷰 전환 이름 foo를 갖고, 다른 요소가 새로운 상태에서 뷰 전환 이름 foo를 갖는다면, 두 요소는 동일한 요소의 서로 다른 시각적 상태로 간주되어, 뷰 전환 트리에서 쌍(pair)으로 처리됩니다. 요소 자체가 반드시 동일 객체를 참조하지 않더라도, 개념적으로 동일한 페이지 엔티티의 시각적 상태로 보는 것이 유용합니다.

요소의 주 박스(principal box)분절(fragmented)되거나, 내용이 건너뜀(skipped)이거나, 렌더링되지 않은 경우에는 이 속성은 효과가 없습니다. 자세한 사항은 § 7 알고리즘을 참고하세요.

2.1.1. 렌더링 통합

요소뷰 전환에서 캡처되었거나, 뷰 전환 중이거나, view-transition-name계산된 값none이 아닌 경우(언제든):

3. 의사 요소

3.1. 의사 요소 트리

참고: 이것은 의사 요소 트리에 대한 일반적인 정의입니다. 다른 기능에서 이 동작이 필요하다면, 이러한 정의는 [css-pseudo-4]로 이동될 수 있습니다.

의사 요소 루트트리 기반 의사 요소의 한 종류로, 트리 루트가 되어 트리 내의 트리 기반 의사 요소를 포함합니다. 이를 의사 요소 트리라고 합니다.

의사 요소 트리는 그 자손 트리 기반 의사 요소의 문서 순서를 정의합니다.

의사 요소의사 요소 트리에 참여할 때, 그 기원 의사 요소(originating pseudo-element)부모가 됩니다.

자손 pseudo의사 요소 루트의 다른 형제(sibling)가 없다면, :only-child가 그 pseudo에 매치됩니다.

참고: ::view-transition-new(ident):only-child::view-transition-image-pair(ident)가 단일 자식만 포함할 때에만 ::view-transition-new(ident)를 선택합니다. 즉, 형제 ::view-transition-old(ident)가 없는 경우입니다.

3.2. 뷰 전환 의사 요소

뷰 전환의 시각화는 아래에 정의된 뷰 전환 의사 요소로 구성된 의사 요소 트리뷰 전환 트리로 표현됩니다. 이 트리는 전환 의사 요소 설정 단계에서 생성되며, ::view-transition 의사 요소 아래에 루트로서 위치합니다. 기원(originating)루트 요소입니다. 모든 뷰 전환 의사 요소는 그 궁극적 기원 요소, 즉 문서 요소에서 선택됩니다.

뷰 전환 트리는 접근성 트리에는 노출되지 않습니다.

예를 들어, ::view-transition-group() 의사 요소는 루트 요소 셀렉터에 직접 붙으며, :root::view-transition-group() 같은 식으로 사용됩니다; 이는 그 부모인 ::view-transition 의사 요소에 붙는 것이 아닙니다.
UA가 문서의 “이전”과 “새로운” 상태를 모두 캡처하면, 다음과 같은 의사 요소 구조를 생성합니다:
::view-transition
├─ ::view-transition-group(name)
│  └─ ::view-transition-image-pair(name)
│     ├─ ::view-transition-old(name)
│     └─ ::view-transition-new(name)
└─ …other groups…

view-transition-name을 가진 각 요소는 개별적으로 캡처되며, 고유한 view-transition-name마다 ::view-transition-group()이 생성됩니다.

편의를 위해 문서 요소에는 view-transition-name "root"가 UA 스타일시트에서 부여됩니다.

캡처에 “이전” 또는 “새로운” 상태가 없는 경우 ::view-transition-old() 또는 ::view-transition-new()가 존재하지 않을 수 있습니다.

생성된 각각의 의사 요소는 CSS로 외형, 동작 또는 애니메이션을 커스터마이즈할 수 있습니다. 이를 통해 전환을 완전히 커스터마이즈할 수 있습니다.

3.2.1. 이름 있는 뷰 전환 의사 요소

여러 뷰 전환 의사 요소이름 있는 뷰 전환 의사 요소입니다. 이들은 함수형(functional) 트리 기반 뷰 전환 의사 요소로, 뷰 전환 이름과 연결됩니다. 이 의사 요소들은 <pt-name-selector>를 인자로 받고, 문법은 다음과 같습니다:

::view-transition-pseudo(<pt-name-selector>)

여기서 <pt-name-selector>뷰 전환 이름을 선택하며, 문법 정의는 다음과 같습니다:

<pt-name-selector> = '*' | <custom-ident>

named view transition pseudo-element 셀렉터(selector)는 해당하는 의사 요소(pseudo-element)<pt-name-selector>가 그 의사 요소(pseudo-element)view transition name과 일치할 때만 매칭됩니다. 즉, *이거나 일치하는 <custom-ident>일 때입니다.

참고: 뷰 전환 이름은 해당 뷰 전환 의사 요소를 생성한 view-transition-name으로 설정됩니다.

이름 있는 뷰 전환 의사 요소 선택자<custom-ident> 인자를 가지면 타입 선택자와 동일한 특이성(specificity)을 갖습니다. 이름 있는 뷰 전환 의사 요소 선택자* 인자를 가지면 특이성은 0입니다.

3.2.2. 뷰 전환 트리 루트: ::view-transition 의사 요소

::view-transition 의사 요소트리 기반 의사 요소이며 동시에 의사 요소 루트입니다. 기원 요소는 문서의 문서 요소이고, 포함 블록(containing block)스냅샷 포함 블록입니다.

참고: 이 요소는 모든 ::view-transition-group() 의사 요소의 부모 역할을 합니다.

3.2.3. 뷰 전환 이름 하위 트리 루트: ::view-transition-group() 의사 요소

::view-transition-group() 의사 요소이름 있는 뷰 전환 의사 요소로서, 일치하는 이름의 뷰 전환 캡처를 나타냅니다. ::view-transition-group() 의사 요소뷰 전환 이름마다 하나씩, ::view-transition 의사 요소자식으로 생성되며, 해당 ::view-transition-image-pair()를 포함합니다.

이 요소는 처음에는 “이전” 요소의 크기와 위치를 반영하며, “이전” 요소가 없다면 “새로운” 요소의 크기와 위치를 반영합니다.

“이전”과 “새로운” 상태가 모두 있을 경우, 동적 뷰 전환 스타일시트의 스타일이 이 의사 요소의 widthheight를 이전 요소의 border box 크기에서 새로운 요소의 border box 크기로 애니메이션합니다.

또한 transform 속성은 이전 요소의 화면 공간 변환에서 새로운 요소의 화면 공간 변환으로 애니메이션됩니다.

이 스타일은 애니메이션 속성 값이 전환 시작 시점에 결정되므로, 동적으로 생성됩니다.

3.2.4. 뷰 전환 이미지 페어 분리: ::view-transition-image-pair() 의사 요소

::view-transition-image-pair() 의사 요소이름 있는 뷰 전환 의사 요소로서, “이전/새로운” 뷰 전환 캡처 쌍을 나타냅니다. 이 의사 요소는 해당 ::view-transition-group() 의사 요소의 자식으로 생성되며, ::view-transition-old() 의사 요소 및/또는 ::view-transition-new() 의사 요소를 (순서대로) 포함합니다.

이 요소는 자식에게 isolation: isolate를 제공하기 위해 존재하며, 각 ::view-transition-group()자식으로 항상 존재합니다. 이 격리는 이미지 페어가 비정상적인 블렌드 모드로 혼합될 때 다른 시각적 출력에 영향을 주지 않도록 보장합니다.

3.2.5. 뷰 전환 이전 상태 이미지: ::view-transition-old() 의사 요소

::view-transition-old() 의사 요소는 “이전” 상태의 시각적 스냅샷을 대체 요소로 나타내는 비어 있는 이름 있는 뷰 전환 의사 요소입니다. 나타낼 “이전” 상태가 없으면 생략됩니다. 각 ::view-transition-old() 의사 요소는 해당 ::view-transition-image-pair() 의사 요소의 자식입니다.

:only-child는 이 요소가 ::view-transition-image-pair() 내에서 유일한 요소일 때 매치하는 데 사용할 수 있습니다.

이 요소의 외형은 다른 대체 요소와 마찬가지로 object-* 속성으로 조작할 수 있습니다.

참고: 이미지의 콘텐츠와 고유 크기(natural dimensions)이미지 캡처 단계에서 캡처되며, 전환 의사 요소 설정 단계에서 설정됩니다.

참고: 이 의사 요소에 애니메이션을 추가하는 동적 뷰 전환 스타일시트의 추가 스타일은 전환 의사 요소 설정의사 요소 스타일 업데이트에 자세히 설명되어 있습니다.

3.2.6. 뷰 전환 신규 상태 이미지: ::view-transition-new() 의사 요소

::view-transition-new() 의사 요소는 (유사한 ::view-transition-old() 의사 요소와 같이) “신규” 상태의 시각적 스냅샷을 대체 요소로 나타내는 비어 있는 이름 있는 뷰 전환 의사 요소입니다. 나타낼 “신규” 상태가 없으면 생략됩니다. 각 ::view-transition-new() 의사 요소는 해당 ::view-transition-image-pair() 의사 요소의 자식입니다.

참고: 이미지의 콘텐츠와 고유 크기(natural dimensions)이미지 캡처 단계에서 캡처되며, 전환 의사 요소 설정의사 요소 스타일 업데이트에서 설정 및 갱신됩니다.

4. 뷰 전환 레이아웃

뷰 전환 의사 요소는 일반 요소와 같이 스타일링, 레이아웃 및 렌더링되지만, 스냅샷 포함 블록에서 시작되고 초기 포함 블록에서 시작하지 않으며, 문서의 나머지 위에 뷰 전환 레이어에 페인팅됩니다.

4.1. 스냅샷 포함 블록

스냅샷 포함 블록은 창에서 페이지 콘텐츠가 표시될 수 있는 모든 영역을 덮는 사각형이며 (따라서 루트 스크롤바나 인터랙티브 위젯과 관계없이 일관적입니다). 이는 문서 요소이전 이미지새로운 요소에 대해 일관성을 높여줍니다.

iframe의 경우 스냅샷 포함 블록은 해당 초기 포함 블록에 해당합니다.

A diagram of a phone screen, including a top status bar, a browser URL bar, web-content area with a floating scrollbar, a virtual keyboard, and a bottom bar with an OS back button The previous diagram, but highlights the area that's the 'snapshot containing block', which includes everything except the top status bar and the bottom bar with the OS back button
모바일 OS에서의 스냅샷 포함 블록 예시. 스냅샷에는 URL 바가 포함되는데, 이는 스크롤로 사라질 수 있기 때문입니다. 키보드는 나타났다 사라지므로 포함됩니다. 상단/하단 바는 브라우저가 아닌 OS의 일부이므로 스냅샷 포함 블록에 포함되지 않습니다.
A diagram of a desktop browser window, including a tab bar, a URL bar, and a web-content area featuring both horizontal and vertical scrollbars The previous diagram, but highlights the area that's the 'snapshot containing block', which includes the web content area and the scrollbars
데스크톱 OS에서의 스냅샷 포함 블록 예시. 이 영역에는 스크롤바가 포함되지만, URL 바는 웹 콘텐츠가 해당 영역에 나타나지 않으므로 포함되지 않습니다.

스냅샷 포함 블록 원점스냅샷 포함 블록의 왼쪽 위 모서리를 의미합니다.

스냅샷 포함 블록 크기스냅샷 포함 블록의 너비와 높이를 튜플(tuple)로 나타냅니다.

스냅샷 포함 블록절대 위치 포함 블록이자 고정 위치 포함 블록으로 간주되며, ::view-transition 및 그 하위 요소들에 적용됩니다.

4.2. 뷰 전환 페인팅 순서

이 명세는 뷰 전환 레이어라는 새로운 스태킹 레이어를 CSS2§E Elaborate Description of Stacking Contexts에서 정의된 페인팅 순서의 끝에 추가합니다. [CSS2]

::view-transition 의사 요소는 뷰 전환 레이어라는 새로운 스태킹 컨텍스트를 생성하며, 이 레이어는 문서의 다른 모든 콘텐츠(상단 레이어 포함) 이후에 페인팅되고, 해당 콘텐츠에 적용된 필터와 효과 이후에 렌더링됩니다. (뷰 전환 레이어는 이러한 필터 및 효과의 적용 대상이 아니지만, ::view-transition-old()::view-transition-new() 의사 요소의 렌더링된 내용에는 영향을 줄 수 있습니다.)

참고: 이 기능의 목적은 페이지의 콘텐츠(상단 레이어 포함)를 캡처할 수 있도록 하는 것입니다. 이를 위해 뷰 전환 레이어는 캡처된 스태킹 컨텍스트의 일부가 될 수 없습니다. 그렇지 않으면 순환 의존성이 생기기 때문입니다. 따라서 뷰 전환 레이어는 모든 다른 콘텐츠의 형제(sibling)입니다.

Document활성 뷰 전환단계가 "animating"일 때, 해당 Document 내에서 뷰 전환에서 캡처된 모든 요소와 그 요소 내용이, 전환 루트 의사 요소포함 자손을 제외하고, 페인팅되지 않으며(visibility: hidden과 같이), 히트 테스트에도 응답하지 않습니다(pointer-events: none과 같이).

참고: 전환에 참여하는 요소는 DOM 위치에서 페인팅을 건너뛰어야 합니다. 해당 이미지가 ::view-transition-new() 의사 요소에서 페인팅되기 때문입니다. 마찬가지로, 히트 테스트도 건너뛰어야 하는데, 요소의 DOM 위치가 콘텐츠가 렌더링되는 위치와 일치하지 않기 때문입니다. 단, 이러한 요소에 대한 접근성 기술이나 접근성 트리 접근 방식에는 변화가 없습니다.

5. 사용자 에이전트 스타일시트

글로벌 뷰 전환 사용자 에이전트 스타일시트는 다음 규칙을 포함하는 사용자 에이전트 출처 스타일시트입니다:

:root {
  view-transition-name: root;
}

:root::view-transition {
  position: fixed;
  inset: 0;
}

:root::view-transition-group(*) {
  position: absolute;
  top: 0;
  left: 0;

  animation-duration: 0.25s;
  animation-fill-mode: both;
}

:root::view-transition-image-pair(*) {
  position: absolute;
  inset: 0;

  animation-duration: inherit;
  animation-fill-mode: inherit;
  animation-delay: inherit;
}

:root::view-transition-old(*),
:root::view-transition-new(*) {
  position: absolute;
  inset-block-start: 0;
  inline-size: 100%;
  block-size: auto;

  animation-duration: inherit;
  animation-fill-mode: inherit;
  animation-delay: inherit;
}

/* 기본 크로스 페이드 전환 */
@keyframes -ua-view-transition-fade-out {
  to { opacity: 0; }
}
@keyframes -ua-view-transition-fade-in {
  from { opacity: 0; }
}

/* 이미지가 2개일 때 블렌딩을 위한 키프레임 */
@keyframes -ua-mix-blend-mode-plus-lighter {
  from { mix-blend-mode: plus-lighter }
  to { mix-blend-mode: plus-lighter }
}
설명 요약 이 UA 스타일시트는 여러 작업을 수행합니다:

추가 스타일은 사용자 에이전트 출처뷰 전환동적 뷰 전환 스타일시트를 통해 동적으로 추가됩니다.

6. API

6.1. Document에 대한 추가 사항

partial interface Document {
  ViewTransition startViewTransition(optional UpdateCallback updateCallback);
};

callback UpdateCallback = Promise<any> ();
viewTransition = document.startViewTransition(updateCallback)

새로운 뷰 전환을 시작합니다(이미 document활성 뷰 전환이 있다면 취소됨).

updateCallback이 제공되면, 현재 문서 상태가 캡처된 후 비동기적으로 호출됩니다. 그리고 updateCallback에서 반환된 promise가 완료되면, 문서의 새로운 상태가 캡처되고 전환이 시작됩니다.

updateCallback은 항상 호출되며, 전환이 불가능한 경우(예: 중복된 view-transition-name 값 등)에도 마찬가지입니다. 전환은 상태 변화의 향상(enhancement)이므로, 전환 생성 실패가 상태 변화를 막지는 않습니다. 이에 대한 자세한 내용은 § 1.4 향상 기능으로서의 전환을 참고하세요.

updateCallback에서 반환된 promise가 reject되면, 전환은 건너뜁니다.

6.1.1. startViewTransition() 메서드 단계

startViewTransition(updateCallback)메서드 단계는 다음과 같습니다:
  1. transitionthis관련 Realm에서 새로운 ViewTransition 객체로 만든다.

  2. updateCallback이 제공된 경우, transitionupdate callbackupdateCallback으로 설정한다.

  3. documentthis관련 글로벌 객체연관된 document로 한다.

  4. documentvisibility state가 "hidden"이면, skip transition을 "InvalidStateError" DOMException과 함께, 반환하고 transition을 리턴한다.

  5. document활성 뷰 전환이 null이 아니라면, 그 뷰 전환을 건너뛴다("AbortError" DOMException this의 관련 Realm에서).

    참고: 이렇게 하면 두 개의 비동기 update callback이 동시에 실행될 수 있습니다 (따라서 순서가 뒤섞일 수도 있음): 하나는 document의 현재 활성 뷰 전환용, 또 하나는 이번 transition용입니다. 이 기능의 설계에 따라, 개발자가 이러한 DOM 변경을 올바르게 스케줄링하기 위해 다른 기능 또는 프레임워크를 사용한다고 가정합니다.

  6. document활성 뷰 전환transition으로 설정한다.

    참고: 뷰 전환 처리는 뷰 전환 설정에서, 보류 중인 전환 작업 수행을 통해 계속됩니다.

  7. transition을 반환한다.

6.2. ViewTransition 인터페이스

[Exposed=Window]
interface ViewTransition {
  readonly attribute Promise<undefined> updateCallbackDone;
  readonly attribute Promise<undefined> ready;
  readonly attribute Promise<undefined> finished;
  undefined skipTransition();
};

ViewTransition 인터페이스는 단일 동일 문서 뷰 전환을 나타내며 제어합니다. 즉, 시작과 끝 문서가 동일하지만, 문서의 DOM 구조가 변경될 수 있는 전환입니다.

viewTransition.updateCallbackDone

updateCallback에서 반환한 promise가 완료되면 fulfill되고, reject되면 reject되는 promise입니다.

참고: View Transition API는 DOM 변경을 감싸고 시각적 전환을 생성합니다. 하지만 때때로 전환 애니메이션의 성공/실패가 아니라 DOM 변경이 언제/어떻게 발생하는지만 알고 싶은 경우가 있습니다. updateCallbackDone은 그런 용도입니다.

viewTransition.ready

전환을 위한 의사 요소가 생성되고 애니메이션이 시작될 준비가 되었을 때 fulfill되는 promise입니다.

전환을 시작할 수 없는 경우 reject됩니다. 이는 잘못된 설정(예: 중복된 'view-transition-name')이나 updateCallbackDone에서 reject된 promise 등일 수 있습니다.

ready가 fulfill되는 시점은 뷰 전환 의사 요소Web Animation API로 애니메이션을 적용할 수 있는 이상적인 기회입니다.

viewTransition.finished

최종 상태가 사용자에게 완전히 보이고 상호작용 가능해지면 fulfill되는 promise입니다.

오직 updateCallback에서 반환된 promise가 reject된 경우에만 reject됩니다. 이는 최종 상태가 생성되지 않았음을 나타냅니다.

그 외에 전환 시작 실패나 skipTransition()으로 건너뛴 경우에도, 최종 상태에는 도달하므로 finished는 fulfill됩니다.

viewTransition.skipTransition()

전환을 즉시 완료하거나 시작을 방지합니다.

이것은 updateCallback이 호출되는 것을 절대 막지 않습니다. DOM 변경은 전환과 독립적이기 때문입니다. 자세한 내용은 § 1.4 향상 기능으로서의 전환을 참고하세요.

ready가 resolve되기 전에 호출하면 ready는 reject됩니다.

finished가 아직 resolve되지 않았다면, updateCallbackDone과 함께 fulfill 또는 reject됩니다.

ViewTransition은 다음을 가집니다:

named elements

map으로, 키는 view transition name이고 값은 캡처된 요소입니다. 최초에는 새로운 map입니다. 참고: 이는 ViewTransition에 연결되어 있으므로, 뷰 전환 초기화가 호출될 때 정리됩니다.

phase

다음 순서의 단계 중 하나이며, 최초에는 "pending-capture":

  1. "pending-capture".

  2. "update-callback-called".

  3. "animating".

  4. "done".

참고: 이 API를 사용하는 개발자는 대부분의 경우 각 단계에 대해 신경 쓰지 않아도 됩니다. 단계는 자동으로 진행됩니다. 다만 각 단계에서 어떤 단계가 발생하는지(스냅샷 캡처, 의사 요소 DOM 생성 등)는 이해하는 것이 중요합니다. 아래 단계 설명은 구현자가 명세에 부합하는 구현을 할 수 있도록 최대한 명확한 절차를 제시하려는 목적입니다.

update callback

UpdateCallback 또는 null. 최초에는 null.

ready promise

Promise. 최초에는 새로운 promise이며, this관련 Realm에서 생성됩니다.

update callback done promise

Promise. 최초에는 새로운 promise이며, this관련 Realm에서 생성됩니다.

참고: ready promiseupdate callback done promise는 즉시 생성되므로, reject되면 unhandledrejection이 발생할 수 있습니다. 만약 getter(예: updateCallbackDone)가 접근되지 않아도 마찬가지입니다.

finished promise

Promise. 최초에는 새로운 promise이며, this관련 Realm에서 handled로 표시됩니다.

참고: 이 promise는 handled로 표시되어 중복 unhandledrejection을 방지하며, 이 promise는 오직 update callback done promise와 함께 reject됩니다.

transition root pseudo-element

::view-transition. 최초에는 새로운 ::view-transition입니다.

initial snapshot containing block size

두 숫자(너비, 높이)로 이루어진 tuple 또는 null. 최초에는 null.

참고: 이는 스냅샷 포함 블록 크기 변화를 감지하는 데 사용됩니다. 변화가 있으면 전환을 skip합니다. 이 동작에 대한 논의 참고.

finishedgetter 단계thisfinished promise를 반환하는 것입니다.

readygetter 단계thisready promise를 반환하는 것입니다.

updateCallbackDonegetter 단계thisupdate callback done promise를 반환하는 것입니다.

6.2.1. skipTransition() 메서드 단계

skipTransition()메서드 단계는 다음과 같습니다:
  1. thisphase가 "done"이 아니라면, 뷰 전환을 건너뛴다(this에 대해 "AbortError" DOMException과 함께).

7. 알고리즘

7.1. 데이터 구조

7.1.1. Document에 대한 추가 사항

Document 는 추가적으로 다음을 가집니다:

active view transition

ViewTransition 또는 null. 최초에는 null.

뷰 전환 렌더링 억제(rendering suppression for view transitions)

boolean. 최초에는 false.

Document뷰 전환 렌더링 억제가 true인 동안, 모든 포인터 히트 테스트는 문서 요소(document element)만을 대상으로 하며, 다른 요소는 무시됩니다.

참고: 이는 포인터 캡처된 포인터에는 영향을 주지 않습니다.

동적 뷰 전환 스타일시트(dynamic view transition style sheet)

스타일시트(style sheet). 최초에는 사용자 에이전트 출처에 새로운 스타일시트로, 글로벌 뷰 전환 사용자 에이전트 스타일시트 뒤에 배치됩니다.

참고: 이는 전환과 관련된 동적 스타일을 보관하는 용도로 사용됩니다.

show view transition tree

boolean. 최초에는 false.

이 값이 true일 때, thisactive view transitiontransition root pseudo-elementthis문서 요소(document element)의 자식으로 렌더링되며, this문서 요소(document element)기원 요소(originating element)가 됩니다.

참고: transition root pseudo-element문서 요소 내 위치는 중요하지 않습니다. transition root pseudo-element포함 블록스냅샷 포함 블록이기 때문입니다.

7.1.2. 요소에 대한 추가 사항

요소뷰 전환에서 캡처됨(captured in a view transition)이라는 boolean을 갖습니다. 최초에는 false.

참고: 이 명세는 요소의 CSS 정의를 사용하며, 여기에는 의사 요소도 포함됩니다.

7.1.3. 캡처된 요소

캡처된 요소(captured element)는 다음을 포함하는 구조체(struct)입니다:

old image

2D 비트맵 또는 null. 최초에는 null.

old width
old height

unrestricted double, 최초에는 0.

old transform

<transform-function>, 최초에는 identity transform function.

old writing-mode

Null 또는 writing-mode, 최초에는 null.

old direction

Null 또는 direction, 최초에는 null.

old text-orientation

Null 또는 text-orientation, 최초에는 null.

old mix-blend-mode

Null 또는 mix-blend-mode, 최초에는 null.

old backdrop-filter

Null 또는 backdrop-filter, 최초에는 null.

old color-scheme

Null 또는 color-scheme, 최초에는 null.

new element

요소 또는 null. 최초에는 null.

또한, 캡처된 요소는 다음 스타일 정의(style definitions)를 가집니다:

group keyframes

CSSKeyframesRule 또는 null. 최초에는 null.

group animation name rule

CSSStyleRule 또는 null. 최초에는 null.

group styles rule

CSSStyleRule 또는 null. 최초에는 null.

image pair isolation rule

CSSStyleRule 또는 null. 최초에는 null.

image animation name rule

CSSStyleRule 또는 null. 최초에는 null.

참고: 이는 문서(document)동적 뷰 전환 스타일시트에서 스타일을 업데이트하고 나중에 제거할 때 사용됩니다.

7.2. 보류 중인 전환 작업 수행

이 알고리즘은 html 명세의 렌더링 루프 업데이트의 일부로 호출됩니다.

보류 중인 전환 작업 수행(perform pending transition operations)Document document에 대해 실행할 때, 다음 단계를 수행합니다:

  1. documentactive view transition이 null이 아니면:

    1. documentactive view transitionphase가 "pending-capture"라면, 뷰 전환 설정(setup view transition)documentactive view transition에 대해 실행합니다.

    2. 그 외에 documentactive view transitionphase가 "animating"이라면, transition frame 처리(handle transition frame)documentactive view transition에 대해 실행합니다.

7.3. 뷰 전환 설정

setup view transitionViewTransition transition에 대해 실행하려면, 다음 단계를 수행합니다:

참고: 이 알고리즘은 문서의 현재 상태를 캡처하고, 전환의 UpdateCallback를 호출한 뒤, 문서의 새로운 상태를 캡처합니다.

  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. 이전 상태 캡처transition에 대해 실행한다.

    실패가 반환되면, 뷰 전환 건너뛰기transition에 대해 "InvalidStateError" DOMException (in transition관련 Realm)로 실행하고 반환한다.

  3. document뷰 전환 렌더링 억제를 true로 설정한다.

  4. 글로벌 태스크 큐DOM 조작 태스크 소스에, transition관련 글로벌 객체를 넘겨서 다음 단계를 실행하도록 큐잉한다:

    참고: 이미지 캡처에서 텍스처 읽기가 비동기일 수 있으므로 태스크를 큐잉합니다. HTML 명세의 렌더 단계는 동기처럼 동작합니다.

    1. transitionphase가 "done"이면 이 단계 중단.

      참고: transition이 이 시점 전에 건너뛰기 되었을 때 발생.

    2. update callback 호출.

activate view transitionViewTransition transition에 대해 실행하려면, 다음 단계를 수행합니다:
  1. transitionphase가 "done"이면 반환.

    참고: transition이 이 시점 전에 건너뛰기 되었을 때 발생.

  2. 뷰 전환 렌더링 억제를 false로 설정한다.

  3. transition초기 스냅샷 포함 블록 크기스냅샷 포함 블록 크기와 다르면, 뷰 전환 건너뛰기transition에 대해 실행하고 반환.

  4. 신규 상태 캡처transition에 대해 실행한다.

    실패가 반환되면 뷰 전환 건너뛰기transition에 대해 "InvalidStateError" DOMException (transition관련 Realm)로 실행하고 반환.

  5. resolve transitionupdate callback done promise를 undefined로.

  6. capturedElementtransitionnamed elementsvalues에서 반복:

    1. capturedElementnew element가 null이 아니면, capturedElementnew element뷰 전환에서 캡처됨을 true로 설정한다.

  7. 전환 의사 요소 설정transition에 대해 실행한다.

  8. 의사 요소 스타일 업데이트transition에 대해 실행한다.

    실패가 반환되면 뷰 전환 건너뛰기transition에 대해 "InvalidStateError" DOMException (transition관련 Realm)로 실행하고 반환.

    참고: 위 단계에서는 스타일/레이아웃 중 계산된 정보를 얻기 위해 문서 라이프사이클 단계를 실행해야 할 수도 있습니다.

  9. transitionphase를 "animating"으로 설정한다.

  10. resolve transitionready promise를 실행한다.

7.3.1. 이전 상태 캡처

이전 상태 캡처ViewTransition transition에 대해 실행하려면:
  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. namedElementstransitionnamed elements로 한다.

  3. usedTransitionNames를 새로운 문자열 set으로 한다.

  4. captureElements를 새로운 요소 리스트(list)로 한다.

  5. documenttransition관련 글로벌 객체연관된 document로 한다.

  6. 스냅샷 포함 블록 크기구현 정의 최대치를 초과하면 실패 반환.

  7. transition초기 스냅샷 포함 블록 크기스냅샷 포함 블록 크기로 설정한다.

  8. element를 모든 요소connected이고, node documentdocument와 동일한 경우, 페인트 순서로 반복:

    페인트 순서로 반복하는 것은 namedElements에 이 순서를 캐시하기 위함입니다. 이것은 ::view-transition-group 의사 요소의 DOM 순서를 정의하며, 페인트 스택 맨 아래 요소가 ::view-transition의 첫 번째 의사 자식이 되도록 합니다.
    1. elementflat tree 상위 요소 중 하나라도 내용 건너뜀(skips its contents)이면 continue.

    2. elementbox fragment를 2개 이상 가지면, continue.

      참고: 향후 버전에서는 분절된 요소에 대한 전환을 지원할 수도 있습니다. #8900 참고.

      참고: 여기서 언급하는 box fragmentinline boxline box로 분할되는 것은 아닙니다. 그런 인라인들은 전환에 참여할 수 있습니다.

    3. transitionNameelement계산값 view-transition-name으로 한다.

    4. transitionNamenone이거나, element렌더링되지 않은 경우이면, continue.

    5. usedTransitionNames포함transitionName이 있으면 실패 반환.

    6. Append transitionNameusedTransitionNames에 추가.

    7. element뷰 전환에서 캡처됨을 true로 설정.

    8. Append elementcaptureElements에 추가.

    이 알고리즘은 별도의 루프로 계속되어, 뷰 전환에서 캡처됨이 이 캡처에 참여하는 모든 요소에 설정된 뒤, 알고리즘의 후속 단계에서 읽히도록 보장합니다.
  9. elementcaptureElements에서 반복:

    1. capture를 새로운 캡처된 요소 구조체로 한다.

    2. captureold imageelement이미지 캡처 결과로 설정.

    3. originalRectelement문서 요소라면 스냅샷 포함 블록으로, 아니면 요소의 border box로 한다.

    4. captureold widthoriginalRectwidth로 설정.

    5. captureold heightoriginalRectheight로 설정.

    6. captureold transform<transform-function> 값으로 설정(스냅샷 포함 블록 원점에서 현재 시각적 위치로 border box를 매핑함).

    7. captureold writing-modeelement계산값 writing-mode로 설정.

    8. captureold directionelement계산값 direction로 설정.

    9. captureold text-orientationelement계산값 text-orientation로 설정.

    10. captureold mix-blend-modeelement계산값 mix-blend-mode로 설정.

    11. captureold backdrop-filterelement계산값 backdrop-filter로 설정.

    12. captureold color-schemeelement계산값 color-scheme로 설정.

    13. transitionNameelement계산값 view-transition-name로 한다.

    14. namedElements[transitionName] = capture로 설정.

  10. elementcaptureElements에서 반복:

    1. element뷰 전환에서 캡처됨을 false로 설정.

7.3.2. 신규 상태 캡처

신규 상태 캡처ViewTransition transition에 대해 실행하려면:
  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. namedElementstransitionnamed elements로 한다.

  3. usedTransitionNames를 새로운 문자열 set로 한다.

  4. element를 모든 요소connected이고, node documentdocument와 동일한 경우, 페인트 순서로 반복:

    1. elementflat tree 상위 요소 중 하나라도 내용 건너뜀(skips its contents)이면 continue.

    2. transitionNameelement계산값 view-transition-name으로 한다.

    3. transitionNamenone이거나, element렌더링되지 않은 경우이면, continue.

    4. usedTransitionNames포함transitionName이 있으면 실패 반환.

    5. Append transitionNameusedTransitionNames에 추가.

    6. namedElements[transitionName]이 존재하지 않으면, namedElements[transitionName]에 새로운 캡처된 요소 구조체를 추가.

      참고: 일부러 이 구조체를 정렬된 맵의 끝에 추가합니다. 즉, 새로운 DOM에만 존재하는 이름(등장 애니메이션)이 이전 DOM에만 있는 이름(퇴장 애니메이션) 및 둘 다 있는 이름(페어 애니메이션) 위에 페인팅됩니다. 모든 경우에 올바른 레이어링이 아닐 수도 있습니다. issue 8941 참고.

    7. namedElements[transitionName]의 new elementelement로 설정.

7.3.3. 전환 의사 요소 설정

전환 의사 요소 설정ViewTransition transition에 대해 실행하려면:

참고: 이 알고리즘은 전환을 위한 의사 요소 트리를 생성하며, 초기 스타일을 생성합니다. 의사 트리 구조는 § 3.2 뷰 전환 의사 요소에 자세히 설명되어 있습니다.

  1. documentthis관련 글로벌 객체연관된 document로 한다.

  2. documentshow view transition tree를 true로 설정.

  3. transitionNamecapturedElementtransitionnamed elements에서 반복:

    1. group을 새로운 ::view-transition-group()으로 생성, view transition nametransitionName으로 설정.

    2. grouptransitiontransition root pseudo-element에 추가.

    3. imagePair를 새로운 ::view-transition-image-pair()로 생성, view transition nametransitionName으로 설정.

    4. imagePairgroup에 추가.

    5. capturedElementold image가 null이 아니면:

      1. old를 새로운 ::view-transition-old()로 생성, view transition nametransitionName으로 설정, capturedElementold image대체(replaced) 콘텐츠로 표시.

      2. oldimagePair에 추가.

    6. capturedElementnew element가 null이 아니면:

      1. new를 새로운 ::view-transition-new()로 생성, view transition nametransitionName으로 설정.

        참고: 이 의사 요소의 스타일링은 의사 요소 스타일 업데이트에서 처리됩니다.

      2. newimagePair에 추가.

    7. capturedElementold image가 null이면:

      1. Assert: capturedElementnew element가 null이 아님.

      2. capturedElementimage animation name rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        :root::view-transition-new(transitionName) {
          animation-name: -ua-view-transition-fade-in;
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

    8. capturedElementnew element가 null이면:

      1. Assert: capturedElementold image가 null이 아님.

      2. capturedElementimage animation name rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        :root::view-transition-old(transitionName) {
          animation-name: -ua-view-transition-fade-out;
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

    9. capturedElementold imagenew element가 모두 null이 아니면:

      1. transformcapturedElementold transform으로 한다.

      2. widthcapturedElementold width로 한다.

      3. heightcapturedElementold height로 한다.

      4. backdropFiltercapturedElementold backdrop-filter로 한다.

      5. capturedElementgroup keyframes를 새로운 CSSKeyframesRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        @keyframes -ua-view-transition-group-anim-transitionName {
          from {
            transform: transform;
            width: width;
            height: height;
            backdrop-filter: backdropFilter;
          }
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

      6. capturedElementgroup animation name rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        :root::view-transition-group(transitionName) {
          animation-name: -ua-view-transition-group-anim-transitionName;
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

      7. capturedElementimage pair isolation rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        :root::view-transition-image-pair(transitionName) {
          isolation: isolate;
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

      8. capturedElementimage animation name rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, document동적 뷰 전환 스타일시트에 추가:

        :root::view-transition-old(transitionName) {
          animation-name: -ua-view-transition-fade-out, -ua-mix-blend-mode-plus-lighter;
        }
        :root::view-transition-new(transitionName) {
          animation-name: -ua-view-transition-fade-in, -ua-mix-blend-mode-plus-lighter;
        }
        

        참고: 위 코드 예시는 변수 치환이 필요합니다.

        참고: mix-blend-mode: plus-lighter는 old/new 이미지의 동일 픽셀 블렌딩 시 동일한 색상값이 결과로 나오고, “정확한” 크로스 페이드를 달성합니다.

7.4. update callback 호출

update callback 호출ViewTransition transition에 대해 실행하려면:

참고: 이 단계는 모든 ViewTransition에 대해 반드시 실행됩니다, 전환이 건너뛰기(skipped)되어도 마찬가지입니다. 그 이유는 § 1.4 향상 기능으로서의 전환에서 설명됩니다.

  1. Assert: transitionphase가 "done" 또는 "update-callback-called" 이전임을 확인.

  2. callbackPromise를 null로 한다.

  3. transitionupdate callback이 null이면, callbackPromiseundefined로 resolve된 promise로 설정, transition관련 Realm에서 실행.

  4. 그 외에는 callbackPromisecallback 함수 호출의 결과로 설정.

  5. transitionphase가 "done"이 아니면, transitionphase를 "update-callback-called"로 설정.

  6. fulfillSteps를 다음 단계로 정의:

    1. 뷰 전환 활성화transition에 대해 실행.

    2. resolve transitionupdate callback done promise를 undefined로.

      참고: 이전 단계에서 이미 promise가 resolve되었다면 이 단계는 no-op입니다.

  7. rejectStepsreason을 인자로 다음 단계로 정의:

    1. reject transitionupdate callback done promisereason으로.

    2. transitionphase가 "done"이면 반환.

      참고: transition이 이 시점 전에 건너뛰기 되었을 때 발생.

    3. handled로 표시 transitionready promise를.

      참고: transitionupdate callback done promiseunhandledrejection을 제공합니다. 중복을 방지하는 단계입니다.

    4. 뷰 전환 건너뛰기transitionreason과 함께 실행.

  8. promise settle 후 단계 실행callbackPromise에 대해 fulfillStepsrejectSteps로 등록.

  9. 타임아웃 후 전환을 건너뛰려면, 사용자 에이전트는 아래 단계를 병렬로 실행할 수 있다:

    1. 구현 정의 지속 시간만큼 대기.

    2. 글로벌 태스크 큐DOM 조작 태스크 소스에, transition관련 글로벌 객체를 넘겨서 다음 단계를 실행하도록 큐잉:

      1. transitionphase가 "done"이면 반환.

        참고: transition 이 시점 전에 건너뛰기 되었을 때 발생.

      2. 뷰 전환 건너뛰기transition에 "TimeoutError" DOMException과 함께 실행.

7.5. 뷰 전환 건너뛰기

뷰 전환 건너뛰기ViewTransition transition에 대해 reason과 함께 실행하려면:
  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. Assert: transitionphase가 "done"이 아님을 확인.

  3. transitionphase가 "update-callback-called" 이전이면, 글로벌 태스크 큐DOM 조작 태스크 소스에, transition관련 글로벌 객체를 넘겨서 update callback 호출을 실행.

  4. 뷰 전환 렌더링 억제를 false로 설정.

  5. documentactive view transitiontransition이면, 뷰 전환 초기화transition에 대해 실행.

  6. transitionphase를 "done"으로 설정.

  7. reject transitionready promisereason으로 처리.

    참고: ready promise가 이 시점에서 이미 resolve되어 있을 수 있음. skipTransition() 이 애니메이션 시작 후 호출된 경우, 이 단계는 no-op.

  8. resolve transitionfinished promiseupdate callback done promise settle 후 처리 결과로:

    • promise가 fulfill되면 undefined 반환.

    참고: transitionupdate callback done promise가 여기서 명시적으로 처리되지 않으므로, transitionupdate callback done promise가 reject되면, transitionfinished promise도 같은 이유로 reject됨.

7.6. 뷰 전환 page-visibility 변경 단계

뷰 전환 page-visibility 변경 단계Document document에 대해 다음과 같이 동작한다:
  1. documentvisibility state가 "hidden"이면:

    1. documentactive view transition이 null이 아니면, 뷰 전환 건너뛰기documentactive view transition에 "InvalidStateError" DOMException과 함께 실행.

  2. 그 외에는 assert: active view transition이 null이어야 함.

참고: 이 단계는 HTML 명세에서 호출됨.

7.7. 이미지 캡처

이미지 캡처element element에 대해 실행하려면 다음 단계 수행. 이 단계는 이미지를 반환한다.
  1. element문서 요소라면:

    1. 문서의 영역을 렌더링한다 (캔버스 배경상단 레이어 콘텐츠 포함) 스냅샷 포함 블록과 교차되는 부분을 스냅샷 포함 블록 크기의 투명 캔버스에 렌더링하며, 캡처 렌더링 특성과 다음 추가 특성을 따른다:

      • element스크롤 박스 바깥 영역은 스크롤된 것처럼 렌더링하지만 레이아웃 뷰포트를 실제로 이동하거나 크기 변경하지 않는다. 이로 인해 IntersectionObserver 등 스크롤/리사이즈 관련 이벤트가 발생하면 안 됨.

        A phone browser window, showing a URL bar, a fixed-position element directly beneath it, and some page content beneath that. A scroll bar indicates the page has been scrolled significantly. The captured snapshot. It shows that content beneath the URL bar was included in the capture.
        사용자가 보는 화면과 캡처된 스냅샷의 예시. 이 예시에서는 루트가 유일하게 전환 이름을 갖는 요소임을 가정.
      • 스크롤할 수 없는 영역(범위를 벗어난 경우)은 캔버스 배경을 렌더링한다.

        A phone browser window, showing a URL bar, and some content beneath. A scroll bar indicates the page is scrolled to the top. The captured snapshot. It shows the area underneath the URL bar as the same color as the rest of the document.
        사용자가 보는 화면과 캡처된 스냅샷의 예시. 이 예시에서는 루트가 유일하게 전환 이름을 갖는 요소임을 가정.
    2. 이 캔버스를 이미지로 반환. 이미지의 자연 크기는 스냅샷 포함 블록과 동일.

  2. 그 외에는:

    1. element 및 그 자손elementnode document에서 보이는 크기와 동일하게 무한 투명 캔버스에 렌더링하며, 캡처 렌더링 특성을 따른다.

    2. 이 캔버스에서 element잉크 오버플로우 사각형을 포함하는 부분을 이미지로 반환한다. 이 이미지의 자연 크기는 해당 principal border box와 동일하며, 원점은 border box의 원점과 일치해야 하며, 이미지는 border box의 내용과 캡처된 잉크 오버플로우가 이 경계 바깥에 표시됨을 의미.

      참고: 이 이미지가 대체 요소자연 크기로 렌더링되면, 요소의 principal box의 크기와 내용이 표시되고, 캡처된 잉크 오버플로우content box 바깥에 넘쳐 보임.

7.7.1. 캡처 렌더링 특성

캡처 렌더링 특성은 다음과 같다:

7.8. 전환 프레임 처리

전환 프레임 처리ViewTransition transition에 대해 실행하려면:
  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. hasActiveAnimations을 boolean, 최초에는 false로 한다.

  3. elementtransitiontransition root pseudo-element포함 자손에서 반복:

    1. animation들 중 timelinedocument timeline이고 document와 연결되어 있으며, associated effect 중 적어도 하나의 effect targetelement인 경우, 아래 조건 중 하나라도 true이면 hasActiveAnimations을 true로 설정:

  4. hasActiveAnimations이 false라면:

    1. transitionphase를 "done"으로 설정.

    2. 뷰 전환 초기화transition에 대해 실행.

    3. resolve transitionfinished promise.

    4. 반환.

  5. transition초기 스냅샷 포함 블록 크기스냅샷 포함 블록 크기와 다르면, 뷰 전환 건너뛰기transition에 대해 실행하고 반환.

  6. 의사 요소 스타일 업데이트transition에 대해 실행.

    실패가 반환되면 뷰 전환 건너뛰기transition에 대해 "InvalidStateError" DOMException (transition관련 Realm)로 실행하고 반환.

    참고: 위 내용은 들어오는 요소의 크기나 위치가 변경되면 새로운 keyframe이 생성된다는 의미입니다. 이로 인해 시각적 점프가 발생할 수 있습니다. 부드럽게 retarget할 수도 있지만 복잡성을 정당화할 use-case가 없어 구현하지 않았습니다. 자세한 내용은 issue 7813 참고.

7.9. 의사 요소 스타일 업데이트

의사 요소 스타일 업데이트ViewTransition transition에 대해 실행하려면:
  1. transitionNamecapturedElementtransitionnamed elements에서 반복:

    1. width, height, transform, writingMode, direction, textOrientation, mixBlendMode, backdropFilter, colorScheme을 모두 null로 초기화한다.

    2. capturedElementnew element가 null이면:

      1. widthcapturedElementold width로 설정.

      2. heightcapturedElementold height로 설정.

      3. transformcapturedElementold transform으로 설정.

      4. writingModecapturedElementold writing-mode로 설정.

      5. directioncapturedElementold direction으로 설정.

      6. textOrientationcapturedElementold text-orientation으로 설정.

      7. mixBlendModecapturedElementold mix-blend-mode로 설정.

      8. backdropFiltercapturedElementold backdrop-filter로 설정.

      9. colorSchemecapturedElementold color-scheme로 설정.

    3. 그 외의 경우:

      1. 아래 조건 중 하나라도 true이면 실패 반환:

        참고: 다른 렌더링 제한 사항은 capturedElementnew element뷰 전환에서 캡처됨인 것으로 보장됨.

      2. widthcapturedElementnew element의 현재 border box의 너비로 설정.

      3. heightcapturedElementnew element의 현재 border box의 높이로 설정.

      4. transformcapturedElementnew elementborder box스냅샷 포함 블록 원점에서 현재 시각적 위치로 매핑하는 변환으로 설정.

      5. writingModecapturedElement계산값 writing-mode로 설정(capturedElementnew element 기준).

      6. directioncapturedElement계산값 direction으로 설정(capturedElementnew element 기준).

      7. textOrientationcapturedElement계산값 text-orientation으로 설정(capturedElementnew element 기준).

      8. mixBlendModecapturedElement계산값 mix-blend-mode로 설정(capturedElementnew element 기준).

      9. backdropFiltercapturedElement계산값 backdrop-filter로 설정(capturedElementnew element 기준).

      10. colorSchemecapturedElement계산값 color-scheme로 설정(capturedElementnew element 기준).

    4. capturedElementgroup styles rule이 null이면, capturedElementgroup styles rule을 새로운 CSSStyleRule로 생성, 아래 CSS를 표현하고, transition관련 글로벌 객체연관된 document동적 뷰 전환 스타일시트에 추가.

      그 외에는 capturedElementgroup styles rule을 아래 CSS와 일치하도록 갱신:

      :root::view-transition-group(transitionName) {
        width: width;
        height: height;
        transform: transform;
        writing-mode: writingMode;
        direction: direction;
        text-orientation: textOrientation;
        mix-blend-mode: mixBlendMode;
        backdrop-filter: backdropFilter;
        color-scheme: colorScheme;
      }
      

      참고: 위 코드 예시는 변수 치환이 필요합니다.

    5. capturedElementnew element가 null이 아니면:

      1. new::view-transition-new()로 하고 view transition nametransitionName으로 한다.

      2. new대체 요소(replaced element) 콘텐츠를 capturedElement이미지 캡처 결과(대상: capturedElementnew element)로 설정.

이 알고리즘은 사용자 에이전트 출처에서 웹 API를 통해 그 효과가 관찰될 수 있다면 반드시 실행되어야 함.

참고: 예시로 window.getComputedStyle(document.documentElement, "::view-transition") 같은 웹 API가 있음.

7.10. 뷰 전환 초기화

뷰 전환 초기화ViewTransition transition에 대해 실행하려면:
  1. documenttransition관련 글로벌 객체연관된 document로 한다.

  2. assert: documentactive view transitiontransition이어야 한다.

  3. capturedElementtransitionnamed elementsvalues에서 반복:

    1. capturedElementnew element가 null이 아니면, capturedElementnew element뷰 전환에서 캡처됨을 false로 설정.

    2. stylecapturedElementstyle definitions에서 반복:

      1. style이 null이 아니고, document동적 뷰 전환 스타일시트에 포함되어 있다면, styledocument동적 뷰 전환 스타일시트에서 제거한다.

  4. documentshow view transition tree를 false로 설정.

  5. documentactive view transition을 null로 설정.

개인정보 보호 고려사항

이 명세는 추가적인 개인정보 보호 고려사항을 도입하지 않습니다.

보안 고려사항

이미지 캡처 알고리즘으로 생성된 이미지는 교차 출처 데이터(문서에 교차 출처 리소스가 포함된 경우)나 방문한 링크와 같은 민감 정보를 포함할 수 있습니다. 구현체는 이 데이터가 문서에서 접근할 수 없도록 반드시 보장해야 합니다. 이 데이터에 대한 접근은 문서의 기본 렌더링에서도 이미 차단되어야 하므로, 이를 준수하는 것은 가능해야 합니다.

부록 A. 변경 내역

이 부록은 정보 제공용입니다.

2022-05-30 Working Draft에서의 변경 사항 (원문 보기)

2022-05-25 Working Draft에서의 변경 사항 (원문 보기)

2022-11-24 Working Draft에서의 변경 사항 (원문 보기)

2022-10-25 Working Draft (FPWD)에서의 변경 사항 (원문 보기)

적합성(Conformance)

문서 규약(Document conventions)

적합성 요구사항은 설명적 단언과 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"로 규범 텍스트와 구분됩니다. 예시:

참고: 이것은 정보 제공용 노트입니다.

권고(advisement)는 특별한 주의를 환기하기 위한 규범 섹션이며, <strong class="advisement">로 스타일링되어 다른 규범 텍스트와 구분됩니다. 예시: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

적합성 클래스(Conformance classes)

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

style sheet
CSS 스타일시트.
renderer
UA(사용자 에이전트)로, 스타일시트의 의미를 해석하고 스타일시트를 사용하는 문서를 렌더링함.
authoring tool
UA로, 스타일시트를 작성함.

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

렌더러가 이 명세에 적합성이 있으려면, 스타일시트를 관련 명세에 따라 해석하는 것 외에도, 이 명세에서 정의된 모든 기능을 올바르게 파싱하고 문서를 올바르게 렌더링해야 합니다. 단, UA가 장치의 한계로 인해 문서를 올바르게 렌더링하지 못해도 UA가 부적합하다고 할 수 없습니다. (예: UA가 모노크롬 모니터에서 색상을 렌더링할 필요는 없음)

작성 도구(authoring tool)가 이 명세에 적합성이 있으려면, 이 모듈의 일반 CSS 문법 및 각 기능의 개별 문법에 따라 구문적으로 올바른 스타일시트를 작성해야 하며, 이 모듈에서 설명한 스타일시트의 다른 모든 적합성 요구사항도 충족해야 합니다.

부분 구현(Partial implementations)

저자가 호환성 있는 파싱 규칙을 활용하여 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원하지 않는 at-rule, 속성, 속성값, 키워드, 기타 구문을 적절히 무시해야 합니다. 특히, 사용자 에이전트는 지원하지 않는 구성 값만 선택적으로 무시하거나, 하나의 multi-value 속성 선언에서 지원되는 값만 적용해서는 안 됩니다: 어떤 값이라도 유효하지 않으면(지원하지 않는 값은 반드시 유효하지 않음), CSS는 전체 선언을 무시해야 합니다.

불안정 및 독자 기능 구현(Implementations of Unstable and Proprietary Features)

향후 안정된 CSS 기능과의 충돌을 피하기 위해, CSSWG는 최선의 구현 방안을 따라 불안정 기능 및 독자 확장을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 CR 단계 기능을 프리픽스 없이 릴리즈해야 합니다.

CSS의 구현 간 상호운용성을 확립하고 유지하기 위하여, CSS 워킹 그룹은 비실험적 CSS 렌더러가 어떤 CSS 기능을 프리픽스 없이 릴리즈하기 전에 구현 보고서(필요시 테스트케이스 포함)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 워킹 그룹의 검토 및 수정 대상이 됩니다.

테스트케이스 및 구현 보고서 제출에 관한 자세한 정보는 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의 사항은 public-css-testsuite@w3.org 메일링 리스트로 보내야 합니다.

CR 종료 기준(CR exit criteria)

이 명세가 Proposed Recommendation 단계로 진행되려면, 각 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품이 구현할 수 있으며, 모든 기능을 하나의 제품이 구현해야 할 필요는 없습니다. 이 기준을 위해 아래 용어를 정의합니다:

independent
각 구현은 서로 다른 조직에서 개발되어야 하며, 다른 구현에서 사용하는 코드를 공유, 재사용, 파생해서는 안 됩니다. 이 명세 구현에 영향이 없는 코드 영역은 예외입니다.
interoperable
공식 CSS 테스트 스위트의 해당 테스트를 통과하거나(웹 브라우저가 아닌 경우 동일한 테스트), 모든 관련 테스트에 대해 등가 테스트가 만들어져 있어야 하며, 등가 테스트가 사용될 경우 최소 한 개 이상의 추가 UA도 같은 방식으로 등가 테스트를 통과해야 합니다. 등가 테스트는 동료 검토(peer review)를 위해 공개되어야 합니다.
implementation
다음을 만족하는 사용자 에이전트:
  1. 명세를 구현함.
  2. 일반 대중에게 공개되어 있음. 구현은 출시 제품, 공개된 버전(베타 버전, 프리뷰 릴리즈, "nightly build") 등일 수 있음. 출시되지 않은 제품의 경우, 해당 기능을 최소 1개월 이상 구현하여 안정성을 입증해야 함.
  3. 실험적이지 않아야 함(즉, 테스트 스위트 통과만을 위해 특별히 설계된 버전이 아니어야 하며, 향후 정상적으로 사용될 버전이어야 함).

이 명세는 최소 6개월간 Candidate Recommendation 상태로 유지됩니다.

색인(Index)

이 명세에서 정의된 용어(Terms defined by this specification)

참조로 정의된 용어

참고 문헌

규범 참고 문헌

[COMPOSITING-1]
Chris Harrelson. Compositing and Blending Level 1. 2024년 3월 21일. CR. URL: https://www.w3.org/TR/compositing-1/
[CSS-2022]
Tab Atkins Jr.; Elika Etemad; Florian Rivoal. CSS Snapshot 2022. 2022년 11월 22일. NOTE. URL: https://www.w3.org/TR/css-2022/
[CSS-ANIMATIONS-1]
David Baron; 외. CSS Animations Level 1. 2023년 3월 2일. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024년 3월 11일. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2022년 11월 3일. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018년 12월 18일. WD. URL: https://www.w3.org/TR/css-break-4/
[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-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 2024년 2월 13일. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-ADJUST-1]
Elika Etemad; 외. CSS Color Adjustment Module Level 1. 2022년 6월 14일. CR. URL: https://www.w3.org/TR/css-color-adjust-1/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022년 9월 17일. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023년 3월 30일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023년 12월 18일. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4. 2023년 2월 17일. WD. URL: https://www.w3.org/TR/css-images-4/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2021년 8월 5일. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023년 3월 29일. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2023년 4월 3일. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-POSITION-4]
CSS Positioned Layout Module Level 4. Editor's Draft. URL: https://drafts.csswg.org/css-position-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022년 12월 30일. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014년 4월 3일. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-TRANSFORMS-1]
Simon Fraser; 외. CSS Transforms Module Level 1. 2019년 2월 14일. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TRANSFORMS-2]
Tab Atkins Jr.; 외. CSS Transforms Module Level 2. 2021년 11월 9일. WD. URL: https://www.w3.org/TR/css-transforms-2/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021년 3월 16일. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VIEWPORT-1]
Florian Rivoal; Emilio Cobos Álvarez. CSS Viewport Module Level 1. 2024년 1월 25일. WD. URL: https://www.w3.org/TR/css-viewport-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019년 12월 10일. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019년 7월 30일. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 외. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016년 4월 12일. WD. URL: https://www.w3.org/TR/CSS22/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[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 Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FILTER-EFFECTS-1]
Dirk Schulze; Dean Jackson. Filter Effects Module Level 1. 2018년 12월 18일. WD. URL: https://www.w3.org/TR/filter-effects-1/
[FILTER-EFFECTS-2]
Filter Effects Module Level 2. Editor's Draft. URL: https://drafts.fxtf.org/filter-effects-2/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018년 12월 4일. CR. URL: https://www.w3.org/TR/geometry-1/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2023년 7월 19일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 외. 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/
[INTERSECTION-OBSERVER]
Stefan Zager; Emilio Cobos Álvarez; Traian Captan. Intersection Observer. 2023년 10월 18일. WD. URL: https://www.w3.org/TR/intersection-observer/
[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-3]
Tantek Çelik; 외. Selectors Level 3. 2018년 11월 6일. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022년 11월 11일. WD. URL: https://www.w3.org/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles; 외. Web Animations. 2023년 6월 5일. WD. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보 제공 참고 문헌

[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021년 12월 17일. WD. URL: https://www.w3.org/TR/css-sizing-3/
[POINTEREVENTS3]
Patrick Lauke; Robert Flack. Pointer Events. 2024년 3월 18일. WD. URL: https://www.w3.org/TR/pointerevents3/
[SCROLL-ANIMATIONS-1]
Brian Birtles; 외. Scroll-driven Animations. 2023년 6월 6일. WD. URL: https://www.w3.org/TR/scroll-animations-1/

속성 색인(Property Index)

이름(Name) 값(Value) 초기값(Initial) 적용 대상(Applies to) 상속(Inh.) % 비율(%ages) 애니메이션 타입(Animation type) 정식 순서(Canonical order) 계산값(Computed value)
view-transition-name none | <custom-ident> none 모든 요소(all elements) 아니오(no) 해당 없음(n/a) 불연속(discrete) 문법 기준(per grammar) 지정값(as specified)

IDL 색인(IDL Index)

partial interface Document {
  ViewTransition startViewTransition(optional UpdateCallback updateCallback);
};

callback UpdateCallback = Promise<any> ();

[Exposed=Window]
interface ViewTransition {
  readonly attribute Promise<undefined> updateCallbackDone;
  readonly attribute Promise<undefined> ready;
  readonly attribute Promise<undefined> finished;
  undefined skipTransition();
};