CSS ビュー遷移モジュール レベル 2

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-css-view-transitions-2-20241113/
最新公開バージョン:
https://www.w3.org/TR/css-view-transitions-2/
編集者草案:
https://drafts.csswg.org/css-view-transitions-2/
履歴:
https://www.w3.org/standards/history/css-view-transitions-2
フィードバック:
CSSWG イシューレポジトリ
仕様内インライン
編集者:
Noam Rosenthal (Google)
Khushal Sagar (Google)
Vladimir Levin (Google)
Tab Atkins-Bittner (Google)
この仕様への編集提案:
GitHub エディター

概要

このモジュールは、View Transition API がドキュメント間ナビゲーションでどのように動作するかを定義します。

CSSは、構造化文書(HTML や XML など)の画面や紙などへのレンダリング方法を記述する言語です。

この文書のステータス

このセクションは公開時点での文書のステータスについて説明します。 現在の W3C の公開文書一覧や、この技術レポートの最新版は W3C 技術レポート一覧 https://www.w3.org/TR/ で確認できます。

この文書は CSS 作業グループ により 作業草案として 勧告トラックを用いて公開されました。 作業草案としての公開は W3C およびその会員による承認を意味しません。

この文書はドラフトであり、いつでも他の文書によって更新・置換・廃止される可能性があります。 この文書を進行中の作業以外のものとして引用するのは適切ではありません。

ご意見は GitHub の issue(推奨)で spec コード “css-view-transitions” をタイトルに含めて送信してください(例: “[css-view-transitions] …コメント概要…”)。 すべての issue とコメントはアーカイブされます。 または、(アーカイブあり) 公開メーリングリスト www-style@w3.org に送信することもできます。

この文書は 2023年11月3日 W3C プロセス文書 に従って管理されています。

この文書は W3C特許ポリシーの下で運用されているグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許の公開リストを維持しています。 そのページには特許開示方法の説明もあります。 特許の実際の知識があり、その特許が必須クレームを含むと信じる個人は、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

1. はじめに

このセクションは規範的ではありません。

[css-view-transitions-1]で定義されているView Transitionsは、開発者がdocumentの視覚的状態間でアニメーション付きの遷移を作成できる機能です。

レベル2は、同一オリジンかつクロスドキュメントナビゲーション間での遷移を可能にするためのAPIやライフサイクルを追加するほか、よりリッチなビュー遷移を作成しやすくするためのいくつかの拡張を含みます。

レベル2では以下を定義します:

2. クロスドキュメントビュー遷移

2.1. 概要

このセクションは規範的ではありません。

2.1.1. アクティベーション

同一ドキュメントのビュー遷移では、作者はJavaScriptを使ってstartViewTransitionを呼び出すことでビュー遷移を開始します。 クロスドキュメントビュー遷移では、ビュー遷移をトリガーするのは2つのドキュメント間のナビゲーションですが、下記の条件がすべて満たされている必要があります:

詳細はライフサイクルセクションを参照してください。

2.1.2. 新しい状態の安定化を待つ

同一ドキュメントのビュー遷移では、作者はstartViewTransitionに渡したコールバックで新しい状態が安定したことを示すことができます。 クロスドキュメントビュー遷移は宣言的なので、明示的なPromiseはありません。代わりにユーザーエージェントはレンダーブロッキング機構を利用して、ドキュメントが安定状態に達したかを判断します。 この方法で、作者はblocking属性を使い、下記のいずれかで遷移を遅延させることができます:

注: レンダーブロッキング機構を過剰に使うと、古い状態が長時間フリーズし、ユーザー体験が悪化する場合があります。 これを避けるため、レンダーブロッキング要素は速やかに利用可能となるようにしてください。

この例では、旧ドキュメントの最後のフレームが表示され、下記のすべての条件が満たされるまでアニメーションが遅延されます:

<!DOCTYPE html>
    <html>
      <head>
        < !-- これはデフォルトでレンダーブロッキング -->
        <link rel="stylesheet" href="style.css">

        < !-- このスクリプトはレイアウト修正用なので、レンダーブロッキングとしてマークすると
            ビュー遷移が開始される前に実行されます -->
        <script async href="fixup.js" blocking="render"></script>

        < !-- main-article要素が検出・パースされるまで
            遷移のアクティベーションを待機 -->
        <link rel="expect" href="#main-article" blocking="render">
      </head>
      <body>
        <header>...</header>
        <main>
          <article id="main-article">...</article>
        </main>
        <article id="secondary-article">...</article>
      </body>
    </html>
    

2.1.3. カスタマイズ

ViewTransition オブジェクトを使うことで、スクリプトから遷移をカスタマイズできます。 同一ドキュメントのビュー遷移では、ライフサイクル全体でViewTransition オブジェクト1つを使用します。 クロスドキュメントビュー遷移では、旧ドキュメントと新ドキュメントにそれぞれViewTransition オブジェクトが存在します。
2.1.3.1. 旧ドキュメントでのビュー遷移の処理

pageswap イベントは、ドキュメントがアンロードされて他のドキュメントにスワップされる直前の最後の瞬間に発火します。 このイベントを使ってビュー遷移が行われるかどうかの判定、typesによるカスタマイズ、 キャプチャ対象要素の直前変更、不要な場合のスキップなどが可能です。 PageSwapEvent インターフェースには、ナビゲーションがビュー遷移の対象となる場合に非nullとなるviewTransition オブジェクトと、リダイレクト後のURLなどナビゲーション情報を持つactivation オブジェクトがあります。 遷移のfinished promiseは、後でドキュメントがBFCacheから復元された場合の後始末などに利用できます。

2.1.3.2. 新ドキュメントでのビュー遷移の処理

pagereveal イベントは、新しいドキュメントの最初のフレームが表示される直前に発火します。 このイベントを使い、viewTransition 属性を参照してビュー遷移が有効かを確認できます。 同一ドキュメントビュー遷移と同様に、作者はtypesで異なる遷移を選択したり、 キャプチャ要素の直前変更、ready 待機によるアニメーション開始、または遷移そのもののスキップが可能です。

2.1.4. ライフサイクル

このセクションは規範的ではありません。

クロスドキュメントビュー遷移が正常に行われる場合、以下の段階を経て進行します:

  1. Document側で:

    1. ユーザーがリンククリック、フォーム送信、ブラウザの戻るボタンなどでナビゲーションを開始する。

      注: 一部のナビゲーション(例えばURLバーに新しいアドレスを入力)はビュー遷移をトリガーしません。

    2. 新しいDocument がアクティベート可能になると、pageswap イベントが発火します。

    3. ナビゲーションが同一オリジンで、 クロスオリジンリダイレクトがなく、旧Documentクロスドキュメントビュー遷移にオプトインしている場合、このイベントのviewTransition 属性は ViewTransition オブジェクトとなります。

    4. 作者はこのタイミングでtypes を変更したり、skip で遷移をスキップしたりできます。

    5. ViewTransition がスキップされない場合、旧ドキュメントの状態がキャプチャされます。

    6. ナビゲーションが進行し、旧Document がアンロードされ、新しいDocument がアクティブになります。

  2. 続いて、新しいDocument側で:

    1. 新しいDocument が最初のレンダリング機会を迎えると、pagereveal イベントが新しいDocumentで発火し、 viewTransition 属性が渡されます。

    2. このViewTransitionupdateCallbackDone promiseは既に解決済みで、 キャプチャされた要素は旧Documentから引き継がれます。

    3. ここでも作者はtypes の変更や、 skip で遷移自体をスキップするなどカスタマイズできます。

    4. 新しいドキュメントの状態がキャプチャされ、「新しい」状態として遷移に利用されます。

    5. この時点以降、遷移はビュー遷移のアクティベーションに従い、同一ドキュメント遷移と同様の流れで進行します。

2.2.

最初の例CSS View Transitions 1 § 1.6 Examplesと同じクロスフェードをドキュメント間で生成する場合、 JavaScriptは不要です。

代わりに、ページ1とページ2の両方でナビゲーション時のview-transitionにオプトインします:

// 両方のドキュメントで:
    @view-transition {
      navigation: auto;
    }
    

ページ1からページ2、またはその逆へのリンクは、例1のクロスフェード遷移を生成します。 例2、3、4の効果を得るには、両方のドキュメントに疑似要素用のCSSを記述してください。

@view-transitionルールはメディアクエリと組み合わせて利用できます。 例えば、画面幅が指定値より大きい場合のみ遷移を行うには、以下のようにします:
@view-transition {
      navigation: auto;
    }

    @media (max-width: 600px) {
      navigation: none;
    }
    
例5の効果を得るには、いくつかの手順が必要です:

両方のページ:

@view-transition {
      navigation: auto;
    }
    
旧ページ側:
addEventListener('click', event => {
      sessionStorage.setItem("lastClickX", event.clientX);
      sessionStorage.setItem("lastClickY", event.clientY);
    });
    

新しいページ側:

// これは初回ロード時とBFCacheからの再活性化時の両方で実行されます。
    addEventListener("pagereveal", async event => {
      if (!event.viewTransition)
        return;

      const x = sessionStorage.getItem("lastClickX") ?? innerWidth / 2;
      const y = sessionStorage.getItem("lastClickY") ?? innerHeight / 2;

      const endRadius = Math.hypot(
        Math.max(x, innerWidth - x),
        Math.max(y, innerHeight - y)
      );

      await event.viewTransition.ready;

      // 新しいドキュメントのビューをアニメーション
      document.documentElement.animate(
        {
          clipPath: [
            <code data-opaque bs-autolink-syntax='`circle(0 at ${x}px ${y}px)`'>circle(0 at ${x}px ${y}px)</code>,
            <code data-opaque bs-autolink-syntax='`circle(${endRadius}px at ${x}px ${y}px)`'>circle(${endRadius}px at ${x}px ${y}px)</code>,
          ],
        },
        {
          duration: 500,
          easing: 'ease-in',
          pseudoElement: '::view-transition-new(root)'
        }
      );
    })
    
ナビゲーションのプロパティや画像のロード状態によって、キャプチャ対象要素を選ぶ場合:

旧ページ側:

window.addEventListener("pageswap", event => {
      // 例えば、ページが非表示だった場合やナビゲーションがクロスドキュメントだった場合
      if (!event.viewTransition)
        return;

      // 戻る/進むナビゲーションでview transitionをしたくない場合...
      if (event.activation.navigationType === "traverse") {
        event.viewTransition.skipTransition();
      }

      const newURL = new URL(event.activation.entry.url);
      if (newURL.pathname === "/details" && thumbnail.complete) {
        thumbnail.classList.add("transition-to-hero");

        // ページがBFCacheから復元された場合の後始末
        event.viewTransition.finished.then(() => {
          thumbnail.classList.remove("transition-to-hero");
        });
      }

    });
    

新しいページ側:

window.addEventListener("pagereveal", event => {
      // 例えば、ページが非表示、ナビゲーションがクロスドキュメント、または旧ドキュメントで遷移がスキップされた場合
      if (!event.viewTransition)
        return;

      const oldURL = new URL(navigation.activation.from.url);
      if (newURL.pathname === "/list") {
        event.viewTransition.types.add("coming-from-list");

        // view transitionが終わるまでサムネイルを表示
        if (!hero.complete)
          setToThumbnail(hero);
          event.viewTransition.finished.then(() => {
            setToFullResolution(hero);
          })
        }
      }
    });
    

2.3. クロスドキュメントビュー遷移へのオプトイン

2.3.1. @view-transitionルール

@view-transitionルールは、ドキュメントがクロスドキュメントナビゲーション時に ViewTransition をセットアップ・アクティベートすることを示すために使われます。

@view-transitionルールの構文は次の通りです:

@view-transition {
      <declaration-list>
    }
    

@view-transitionルールは、navigationおよびtypes記述子を受け付けます。

注: デフォルトの挙動として、@view-transitionルールは、条件付きグループルール(例:@media@supports)の中にネスト可能です。

@view-transitionルールがDocument documentで変更された場合、ユーザーエージェントはdocumentに対して アウトバウンド遷移のオプトイン状態を更新しなければなりません。

注: この結果はナビゲーション時に並列で参照される必要があるため、ブール値としてキャッシュする必要があります。

2.3.2. navigation記述子

名前: navigation
対象: @view-transition
値: auto | none
初期値: none

'navigation'記述子は、特定の種類のナビゲーション時に自動的にビュー遷移を開始するためのオプトインです。 旧ドキュメント・新ドキュメント両方に記述されている必要があります。

none

遷移は発生しません。

auto

ナビゲーションが同一オリジンであり、クロスオリジンリダイレクトがなく、かつ NavigationType が次のいずれかの場合に遷移が有効になります:

注: autoから除外されるナビゲーションには、URLアドレスバーによる遷移、ブックマーククリック、reload を使ったユーザーやスクリプトによる全てのリロードが含まれます。

このatルールはCSSの前方互換パース要件に従います。 準拠パーサーがこれらのルールを理解しない場合でも、エラーなく無視されます。 未認識・未実装の記述子、またはここや将来仕様で定義される文法と一致しない値を持つ記述子は全て無視されます。 それらは@view-transitionルール自体を無効化しません。

2.3.3. @view-transitionルールのCSSOMによるアクセス

CSSViewTransitionRule@view-transitionルールを表します。

[Exposed=Window]
    interface CSSViewTransitionRule : CSSRule {
      readonly attribute CSSOMString navigation;
      [SameObject] readonly attribute FrozenArray<CSSOMString> types;
    };
    

navigation のgetterは、対応するnavigation記述子が存在すればその値を、なければ空文字列を返します。

types のgetterは、対応するtypes記述子が存在すればその値を、なければ空のリストを返します。

3. セレクティブビュー遷移

3.1. 概要

このセクションは規範的ではありません。

単純なページや単一のビュー遷移のみの場合は、参加要素にview-transition-nameプロパティを設定するだけで十分です。 しかし、より複雑なケースでは作者が複数のビュー遷移を宣言し、そのうち一つだけを同時に実行したい場合があります。 例えば、ナビゲーションバーをクリックした時はページ全体をスライドさせ、リストの項目をドラッグした時はリストを並べ替えるなどです。

各ビュー遷移が必要なものだけをキャプチャし、異なる遷移同士が干渉しないようにするため、 この仕様ではactive typesの概念と、 :active-view-transitionおよび :active-view-transition-type()疑似クラスを導入します。

:active-view-transitionは、document elementactive view transitionがある場合にマッチします。 また、:active-view-transition-type()は、 セレクター内の型がactive view transitionactive typesと一致する場合に document elementにマッチします。

ViewTransitionactive typesは、以下のいずれかで設定されます:

  1. startViewTransition(callbackOptions) の引数として渡す

  2. 遷移のtypes を任意のタイミングで変更する

  3. クロスドキュメントビュー遷移の場合、types記述子として宣言する

3.2.

例えば、開発者が以下のように遷移を開始する場合:
document.startViewTransition({update: updateTheDOMSomehow, types: ["slide-in", "reverse"]});
    

この場合、以下のいずれかのセレクターがアクティブになります:

:root:active-view-transition-type(slide-in) {}
    :root:active-view-transition-type(reverse) {}
    :root:active-view-transition-type(slide-in, reverse) {}
    :root:active-view-transition-type(slide-in, something-else) {}
    :root:active-view-transition {}
    

遷移タイプを指定せずに遷移を開始した場合は、':active-view-transition'のみがアクティブになります:

document.startViewTransition(updateTheDOMSomehow);
    // または
    document.startViewTransition({update: updateTheDOMSomehow});
    
/* これはアクティブになります */
    :root { }
    :root:active-view-transition {}

    /* これはアクティブになりません */
    :root:active-view-transition-type(slide-in) {}
    :root:active-view-transition-type(any-type-at-all-except-star) {}
    

3.3. アクティブなビュー遷移に基づいて選択する

3.3.1. :active-view-transition疑似クラス

:active-view-transition疑似クラスは、ドキュメントのルート要素に適用され、その要素にactive view transitionが存在する場合に有効です。

:active-view-transition特異性は、1つの疑似クラスセレクターです。

:active-view-transition疑似クラスは、document elementノードドキュメントに、非nullのactive view transitionが存在する場合にマッチします。

3.3.2. :active-view-transition-type()疑似クラス

:active-view-transition-type()疑似クラスは、ドキュメントのルート要素に対して、該当するactive view transitionがある場合に適用されます。 構文は以下の通りです:

:active-view-transition-type(<custom-ident>#)
    

:active-view-transition-type()の特異性は、1つの疑似クラスセレクターです。

:active-view-transition-type()疑似クラスは、document elementノードドキュメントに、非nullのactive view transitionが存在し、そのactive typesが、セレクター引数で指定したいずれかの<custom-ident>含む場合にマッチします。

3.4. 進行中のビュー遷移の型を変更する

ViewTransition インターフェースは以下のように拡張されます:

[Exposed=Window]
    interface ViewTransitionTypeSet {
      setlike<DOMString>;
    };

    [Exposed=Window]
    partial interface ViewTransition {
      attribute ViewTransitionTypeSet types;
    };
    

ViewTransitionTypeSet オブジェクトは、特別な意味を持たない文字列のセットを表します。

注: ViewTransitionTypeSet には、:active-view-transition-typeとして無効な文字列(例えば、<custom-ident>でないもの)も含まれる場合があります。

typesgetterの処理は、thisactive typesを返します。

3.5. クロスドキュメントビュー遷移で型をアクティベートする

types記述子

名前: types
対象: @view-transition
値: none | <custom-ident>+
初期値: none

'types'記述子は、キャプチャや遷移実行時のactive typesを設定します。 これは、startViewTransition(callbackOptions)typesに相当します。

注: types記述子は定義されたDocument内でのみ適用されます。 作者は、両ドキュメントで同じ型セットを利用する責任があります。

4. ビュー遷移疑似要素間でのスタイル共有

4.1. 概要

このセクションは規範的ではありません。

DOM内で複数要素を同様にスタイリングする場合、class属性を使い、複数要素に共通の名前を付与しクラスセレクターで共有スタイルを宣言するのが一般的です。

ビュー遷移疑似要素(例:view-transition-group())はDOMで定義されているのではなく、view-transition-nameプロパティによって定義されます。 そのため、view-transition-class CSSプロパティは、HTMLのclassに相当する機能をビュー遷移に提供します。 view-transition-nameを持つ要素がview-transition-class値も持つ場合、疑似要素セレクターでそのクラスを選択できるようになります(参照)。

4.2.

この例では、各ボックスが固有の名前で遷移に参加しつつ、全ボックスのアニメーションに1秒のdurationを適用しています:
<div class="box" id="red-box"></div>
    <div class="box" id="green-box"></div>
    <div class="box" id="yellow-box"></div>
    
div.box {
      view-transition-class: any-box;
      width: 100px;
      height: 100px;
    }
    #red-box {
      view-transition-name: red-box;
      background: red;
    }
    #green-box {
      view-transition-name: green-box;
      background: green;
    }
    #yellow-box {
      view-transition-name: yellow-box;
      background: yellow;
    }

    /* 'view-transition-class' により、全ボックスにこのスタイルが適用されます */
    ::view-transition-group(*.any-box) {
      animation-duration: 1s;
    }
    

4.3. view-transition-classプロパティ

名前: view-transition-class
値: none | <custom-ident>+
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 記述通り
正規順序: 文法通り
アニメーション型: 離散

view-transition-classは、異なる名前付きビュー遷移疑似要素に同じスタイルルールを適用するために使えます。 view-transition-nameは旧状態と新状態の要素同士をマッチングするために使われますが、 view-transition-classは ビュー遷移疑似要素 (::view-transition-group(), ::view-transition-image-pair(), ::view-transition-old(), ::view-transition-new()) のみスタイルを適用するために使われます。

なお、view-transition-classだけでは要素がキャプチャ対象にはならず、 view-transition-nameを既に持っている要素の追加的なスタイリング手段としてのみ使われます。

none

この要素用に生成された名前付きビュー遷移疑似要素にはクラスが適用されません。

<custom-ident>+

指定された<custom-ident>値(none以外)はすべて、 名前付きビュー遷移疑似要素セレクターで使用すると適用されます。 noneview-transition-classに対して無効な<custom-ident>です。他の<custom-ident>と組み合わせても無効です。

各「ビュー遷移クラス」はツリースコープ名です。

注: もし同じview-transition-nameが遷移の旧・新両状態で要素に指定された場合、 view-transition-classの値は新状態のものだけが適用されます。 クロスドキュメントビュー遷移でも同様で、旧ドキュメントのクラスは新ドキュメントで対応するview-transition-nameが指定されなかった場合のみ適用されます。

4.4. 名前付きビュー遷移疑似要素への追加

名前付きビュー遷移疑似要素view-transition-group(), view-transition-image-pair(), view-transition-old(), view-transition-new()) は以下の構文をサポートするように拡張されます:

::view-transition-group(<pt-name-and-class-selector>)
    ::view-transition-image-pair(<pt-name-and-class-selector>)
    ::view-transition-old(<pt-name-and-class-selector>)
    ::view-transition-new(<pt-name-and-class-selector>)
    

ここで、<pt-name-selector>は以前定義された通りであり、 <pt-name-and-class-selector>は次の構文定義を持ちます:

<pt-name-and-class-selector> = <pt-name-selector> <pt-class-selector>? | <pt-class-selector>
    <pt-class-selector> = ['.' <custom-ident>]+
    

上記の文法を解釈する際、空白は以下では禁止されます:

名前付きビュー遷移疑似要素selectorが、 <custom-ident>値を1つ以上 <pt-class-selector>に持つ場合、 疑似要素のview-transition-nameに対応するclass list値が それらすべての値を含む場合のみ一致します。

特異性は、以下のいずれかを持つ名前付きビュー遷移疑似要素selectorについて:

これは型セレクターに相当します。

引数に*があり、 <pt-class-selector>が空の場合、 特異性はゼロです。

5. document.startViewTransition()の拡張

dictionary StartViewTransitionOptions {
      ViewTransitionUpdateCallback? update = null;
      sequence<DOMString>? types = null;
    };

    partial interface Document {
      ViewTransition startViewTransition(optional (ViewTransitionUpdateCallback or StartViewTransitionOptions) callbackOptions = {});
    };
    
startViewTransition(callbackOptions)メソッド手順は以下の通りです:
  1. updateCallbackをnullにする。

  2. callbackOptionsViewTransitionUpdateCallbackの場合、 updateCallbackcallbackOptionsを代入する。

  3. それ以外でcallbackOptionsStartViewTransitionOptionsの場合、 updateCallbackcallbackOptionsupdateを代入する。

  4. thisactive view transitionがnullでなく、かつそのoutbound post-capture stepsがnullでない場合、次を行う:

    1. preSkippedTransitionを、thisrelevant realmで新規に生成した ViewTransitionupdate callbackupdateCallback)とする。

      注: このpreSkippedTransitiontypes は、遷移がアクティベートされないため無視されます。

    2. Skip preSkippedTransition(エラーコード "InvalidStateError" DOMException)。

    3. preSkippedTransitionを返す。

    注: これは、pageswap 発火後に開始された同一ドキュメント遷移がスキップされることを保証します。

  5. viewTransitionを、メソッド手順startViewTransition(updateCallback) (引数updateCallback)を実行した結果とする。

  6. callbackOptionsStartViewTransitionOptionsの場合、 viewTransitionactive typestypesクローンセットとして設定する。

  7. viewTransitionを返す。

6. view-transition-nameの自動決定

6.1. 概要

このセクションは規範的ではありません。

要素がビュー遷移に参加するには、固有のview-transition-nameを受け取る必要があります。 多くの要素が同じビュー遷移に関与する場合、とくに同一要素遷移(旧状態・新状態で同じview-transition-nameになる)では、個別設定が煩雑で冗長になりがちです。

これを簡易化するため、view-transition-nameautoを設定すると、 要素用にview-transition-nameが自動生成され、もしくは要素にidがあればそれを利用します。

6.2.

この例では、ビュー遷移を用いてリストをアニメーションで並び替えています:
<ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
      <li>Item 4</li>
      ...
    </ul>
    

通常は各アイテムに固有のview-transition-nameを割り当てます:

li:nth-child(1) { view-transition-name: item1; }
    li:nth-child(2) { view-transition-name: item1; }
    li:nth-child(3) { view-transition-name: item1; }
    li:nth-child(4) { view-transition-name: item1; }
    ...
    

autoを使えば、次のCSSで動作します:

li {
      view-transition-name: auto;
    }
    

6.3. view-transition-nameへの追加

既存値に加えて、view-transition-nameにはautoキーワードも指定できます。 view-transition-name使用値elementに解決するには:

  1. computed算出値view-transition-name)とする。

  2. computednoneならnullを返す。

  3. computed<custom-ident>ならcomputedを返す。

  4. Assert: computedautoである。

  5. elementに関連付けられたidがあり、 computedelementrootと同じrootに関連付けられている場合、elementidの値を返す。

    注: ::part()疑似要素は対応する要素のidに解決されません。

  6. 一意な文字列を返す。この文字列は、elementDocumentについて 少なくともelementノードドキュメントactive view transitionのライフタイム内で一貫性・一意性を保つべきです。

    注: この文字列はウェブから観測できず、内部アルゴリズムで要素を識別するために使用されます。

    注: クロスドキュメントビュー遷移で使われる場合、生成されたauto値は一致しないため、 ::view-transition-group()疑似要素が 1つは退出用、1つは入場用として分かれて生成されます。

autoで生成されたview-transition-nameツリースコープ名です。

7. 入れ子ビュー遷移

7.1. 概要

このセクションは規範的ではありません。

デフォルトでは、複数の要素にview-transition-nameを設定すると、すべてのビュー遷移ツリーがフラットに生成され、すべての::view-transition-group()疑似要素が::view-transition疑似要素の子になります。 これは多くの単純なユースケースには十分ですが、フラットなツリーでは実現できないスタイリング用途もあります。 代表的な例はクリッピングで、フラットツリーではすべての疑似要素がスナップショットの包含ブロックにクリップされてしまい、通常のツリーでクリッピングされている要素もビュー遷移中にクリッピングが失われ、意図しない見た目になります。 以下のような効果はフラットツリーだと予期しない見た目になります:

こうした用途に対応するため、この仕様ではビュー遷移疑似要素の入れ子(ネスト)概念を導入しています。 view-transition-group CSSプロパティを使うことで、 作者は生成された::view-transition-group()疑似要素の「親グループ」を指定でき、 ビュー遷移ツリーに階層構造を作れます。

7.2.

この例はビュー遷移ツリーが入れ子構造になるケースです:
<section class="container">
      <article>Content</article>
    </section>
    
.container {
      view-transition-name: container;
    }

    .container,
    ::view-transition-group(container) {
      clip-path: circle();
    }

    article {
      view-transition-name: article;
      view-transition-group: container;
    }
    

container要素およびその生成疑似要素の両方にclip-pathを適用することで、 遷移中もクリッピングを維持できます。 内部要素にview-transition-groupをcontainer参照で指定することで、 ツリーが「ネスト」され、クリッピングが適用されます。

7.3. view-transition-groupプロパティ

名前: view-transition-group
値: normal | contain | nearest | <custom-ident>
初期値: normal
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 記述通り
正規順序: 文法通り
アニメーション型: 離散

view-transition-group プロパティは、view-transition-name と組み合わせて使用することで、名前付きビュー遷移疑似要素の階層を生成できます。

used value(使用値)は、view-transition-groupに対して、祖先チェーン内のview-transition-name、またはnoneに解決されます。名前付きビュー遷移疑似要素を生成する際、その名前の::view-transition-group()が、この要素の::view-transition-group()view-transition-name)が生成される場合の親となります。

8. レイヤーキャプチャ

8.1. 概要

このセクションは規範的ではありません。

[css-view-transitions-1]では、旧状態・新状態がスナップショットとしてキャプチャされ、初期・最終のジオメトリがキャプチャされます。 デフォルトではクロスフェードアニメーションとなり、シンプルですが多くの場合は望ましい結果が得られます。

しかし、2つのフラットなスナップショットをクロスフェードするだけでは、必ずしも最も表現力のあるアニメーションにはなりません。CSSでは、ボーダーやグラデーション背景、filterbox-shadowなどもアニメーションでき、場合によってはクロスフェードより自然で表現力のあるUXとなります。

また、入れ子ビュー遷移を使った場合、CSSプロパティがスナップショットにフラット化されることで一部アニメーションが「不自然」に見えることがあります。 これはツリー効果(opacitymaskclip-pathfilterなど)や、overflowによるクリッピングも含みます。これらの効果は、単一要素やその内容だけでなく要素ツリー全体に適用されるよう設計されています。

レイヤーキャプチャでは、ツリー全体やボックス装飾に影響するCSSプロパティがスタイルとしてキャプチャされ、グループの一部としてアニメーションします。

この挙動はCSSプロパティによるopt-in/opt-outにするべきか? issue 11078参照。

8.2. キャプチャされるCSSプロパティ一覧

以下のレイヤーキャプチャプロパティリストは、レイヤーキャプチャに参加するCSSプロパティを定義します。 要素の旧状態または新状態がキャプチャされる際、これらのプロパティはスタイルとしてキャプチャされ、ユーザーエージェントはスナップショット描画時にそのプロパティを無視して描画しなければなりません:

9. アルゴリズム

9.1. データ構造

9.1.1. Documentへの追加

Document にはさらに以下が追加されます:
inbound view transition params

view transition paramsまたはnull。 初期値はnull。

can initiate outbound view transition

真偽値。 初期値はfalse。

注: この値はナビゲーション中に並列で読み取られる場合があります。

9.1.2. ViewTransitionへの追加

ViewTransition にはさらに以下が追加されます:
active types

ViewTransitionTypeSet、初期値は空。

outbound post-capture steps

nullまたは手順セット、初期値はnull。

9.1.3. シリアライズ可能なview transition params

view transition params は、ビュー遷移情報をドキュメント間でシリアライズするための構造体です。 以下の項目を持ちます:
named elements

マップ。キーは文字列、値はcaptured elements

initial snapshot containing block size

2つの数値(幅・高さ)のタプル

9.2. ビュー遷移ページ可視性変更手順への追加

以下の手順は、documentに対して現在の手順の後にキューされたタスクview transition page-visibility change stepsに追加されます:
  1. documentinbound view transition paramsをnullに設定する。

注: これはHTML仕様から呼ばれます。

9.2.1. キャプチャ要素拡張

captured element構造体は、既存の項目に加えて以下のフィールドを持つべきです:
class list

文字列のリスト、初期値は空。

containing group name

nullまたは文字列、初期値はnull。

old layered-capture style

文字列。

transform from snapshot containing block

マトリックス、初期値はidentity transform function

old box properties
new box properties

layered box propertiesまたはnull、初期値はnull。

layered box propertiesは構造体で、以下のフィールドを含みます:

box sizing

border-boxまたはcontent-box

content box
padding box

CSSピクセル単位の矩形(border boxからの相対値)。

9.3. @view-transitionルールの解決

@view-transition rule を解決するには、Document documentに対して:

注: これは旧ドキュメント・新ドキュメント両方で呼ばれます。

  1. documentvisibility stateが"hidden"なら、"skip transition"を返す。

  2. matchingRuledocument内の最後の@view-transitionルールとする。

  3. matchingRuleが見つからなければ、"skip transition"を返す。

  4. matchingRuleのnavigation記述子の算出値noneなら、"skip transition"を返す。

  5. Assert: matchingRuleのnavigation記述子の算出値autoである。

  6. typesDescriptorをmatchingRuleのtypes記述子とする。

  7. typesDescriptorの算出値noneなら、セット « » を返す。

  8. typesDescriptorの算出値に対応する文字列のセットを返す。

9.4. Documentでのビュー遷移のセットアップ

9.4.1. クロスドキュメントビュー遷移の発動条件判定

navigation can trigger a cross-document view-transition? の判定手順は Document oldDocumentDocument newDocumentNavigationType navigationType、およびboolean isBrowserUINavigationを受け取る:

注: これはナビゲーション中、並列で呼ばれる場合があります。

  1. ユーザーエージェントが、実装依存のナビゲーション体験(例:戻る操作のジェスチャベース遷移など)を表示する場合、作者定義のビュー遷移は無視され得る。その場合、falseを返す。

  2. oldDocumentcan initiate outbound view transitionがfalseなら、falseを返す。

  3. navigationTypereloadなら、falseを返す。

  4. oldDocumentoriginnewDocumentorigin同一オリジンでない場合、falseを返す。

  5. newDocumentクロスオリジンリダイレクト経由で作成され、かつ newDocumentlatest entryがnullなら、falseを返す。

    注: Documentlatest entryがnullなのは新規ナビゲーションの場合で、BFCacheからの復元の場合はnullではありません。

  6. navigationTypetraverseなら、trueを返す。

  7. isBrowserUINavigationがtrueなら、falseを返す。

  8. trueを返す。

9.4.2. ページスワップ準備時にアウトバウンド遷移をセットアップする

クロスドキュメントビュー遷移をセットアップする手順は、Document oldDocumentDocument newDocument、およびproceedWithNavigation(引数無しアルゴリズム)を受け取る:

注: この手順はHTML仕様から呼ばれます。

  1. Assert: これらの手順はoldDocument上でキューされたタスクの一部として実行される。

  2. oldDocumentcan initiate outbound view transitionがfalseなら、nullを返す。

  3. transitionTypesFromRuleoldDocumentに対して@view-transitionルールの解決の結果とする。

  4. Assert: transitionTypesFromRuleは"skip transition"ではない。

    注: 新しいドキュメントnewDocumentがオプトイン済みかは現時点では不明(まだパースされていない可能性あり)。 newDocumentのオプトイン確認はpagerevealイベント発火時に行う。

  5. oldDocumentactive view transitionがnullでない場合、 skip手順でoldDocumentactive view transitionを "AbortError" DOMExceptionoldDocumentrelevant Realmでスキップする。

    注: ドキュメントアンロード準備時に、実行中の遷移は必ずスキップされる。

  6. outboundTransitionoldDocumentrelevant Realmで新規作成したViewTransitionオブジェクトとする。

  7. outboundTransitionactive typestransitionTypesFromRuleを設定する。

    注: active typesはドキュメント間で共有されない。 新しいドキュメントでtypesを操作しても newDocumentのtypesには影響しない。新ドキュメントではtypes記述子から取得される。

    注: このViewTransitionは旧ドキュメントがhiddenになるとスキップされる。

  8. outboundTransitionoutbound post-capture stepsに下記手順(view transition paramsまたはnullparams受け取り)を設定する:

    1. newDocumentinbound view transition paramsparamsを設定する。

      注: インバウンド遷移はpagerevealイベント後にアクティベートされる。これによりイベント内の変化がキャプチャ新状態に反映される。

    2. タイムアウト後に遷移をスキップする場合、ユーザーエージェントは以下を並列で実行できる:

      1. 実装依存durationを待機。

      2. グローバルタスクをキューし、DOM操作タスクソースnewDocumentrelevant global objectで下記を実行:

        1. newDocumentinbound view transition paramsparamsなら、inbound view transition paramsをnullに。

    3. proceedWithNavigationを呼び出す。

  9. oldDocumentactive view transitionoutboundTransitionを設定する。

    注: 処理はperform pending transition operationsに続く。

  10. ユーザーエージェントは、以下のいずれかまで現在表示中のフレームを表示するべき:

    注: 旧状態と新状態の表示間に意図しないフラッシュが起こらないよう、スムーズな遷移を保証するため。

  11. outboundTransitionを返す。

9.4.3. 現在状態に合わせてオプトインフラグを更新する

アウトバウンド遷移用オプトイン状態を更新する手順は、Document documentに対し:
  1. documenthas been revealedかつ@view-transitionルールの解決結果が"skip transition"でない場合、 documentcan initiate outbound view transitionをtrueに設定。

  2. それ以外の場合は、documentcan initiate outbound view transitionをfalseに設定。

9.4.4. ビュー遷移がスキップされた場合はナビゲーション継続

skip the view transition手順に、ViewTransition transitionに対して以下を追加:
  1. transitionoutbound post-capture stepsがnullでない場合、outbound post-capture stepsをnullで実行する。

注: この部分は暫定的なパッチで、L1仕様が正式化され次第統合される予定。

9.4.5. 旧状態キャプチャ後にクロスドキュメントビュー遷移を継続

perform pending transition operationsアルゴリズムに対し、Document documentで以下を先頭に追加:
  1. documentactive view transitionがnullでなく、かつoutbound post-capture stepsがnullでない場合:

    1. Assert: documentactive view transitionphaseは"pending-capture"。

    2. viewTransitionParamsをnullとする。

    3. documentビュー遷移のためのレンダリング抑制をtrueに。

      旧状態のキャプチャはここでは同期的ステップのように見えるが、実際には非同期処理(画像化は同期不可)。L1仕様で明示すべき。

    4. 旧状態のキャプチャtransitionに対して行う。

    5. 成功時はviewTransitionParamsに新規view transition paramsを設定し、named elementstransitionnamed elementsクローンinitial snapshot containing block sizetransitioninitial snapshot containing block size

    6. documentビュー遷移のためのレンダリング抑制をfalseに。

    7. transitionoutbound post-capture stepsviewTransitionParamsで呼び出す。

注: この部分は暫定的なパッチで、L1仕様が正式化され次第統合される予定。

9.5. Documentでビュー遷移をアクティベートする

インバウンドクロスドキュメントビュー遷移を解決する手順はDocument documentで:
  1. Assert: documentfully activeである。

  2. Assert: documenthas been revealedはtrue。

  3. アウトバウンド遷移用オプトイン状態を更新する手順をdocumentに対して実行。

  4. inboundViewTransitionParamsdocumentinbound view transition paramsとする。

  5. inboundViewTransitionParamsがnullなら、nullを返す。

  6. documentinbound view transition paramsをnullに設定。

  7. documentactive view transitionがnullでない場合、nullを返す。

    注: ドキュメント公開前に同一ドキュメント遷移を開始した場合、保留中のクロスドキュメント遷移はキャンセルされる。

  8. @view-transitionルールの解決手順をdocumentに対し実行し、結果をresolvedRuleとする。

  9. resolvedRuleが"skip transition"なら、nullを返す。

  10. transitiondocumentrelevant Realmで新規作成したViewTransitionとし、named elementsinboundViewTransitionParamsnamed elementsinitial snapshot containing block sizeinboundViewTransitionParamsinitial snapshot containing block size

  11. documentactive view transitiontransitionを設定。

  12. resolve手順でtransitionupdate callback done promiseをundefinedで解決。

  13. transitionphaseを"update-callback-called"に設定。

  14. transitionactive typesresolvedRuleを設定。

  15. transitionを返す。

9.6. view-transition-classのキャプチャ

要素の旧状態または新状態をキャプチャする際、captured element captureelement element を受け取り、以下を行う:
  1. captureclass listを、element算出値 view-transition-classに設定する。 (elementnode documentに関連付けられている場合のみ)

注: この部分は暫定的なパッチで、L1仕様が正式化され次第統合される予定です。

9.7. view-transition-groupのキャプチャと適用

9.7.1. view-transition-group の値の解決

Element elementdocument-scoped view transition groupを取得するには、以下を行う:
  1. computedGroupを element の算出値 view-transition-groupプロパティとする。

  2. computedGroupelementnode documentに関連付けられていればcomputedGroupを返す。

  3. normalを返す。

9.7.2. containing group name の解決

Element elementnearest containing group nameを解決するには、ViewTransition viewTransitionを受け取って、以下を行う:

  1. Assert: elementviewTransitionに参加している。

  2. ancestorGroupを、elementの最近傍のフラットツリー祖先で、viewTransitionに参加し、かつdocument-scoped view transition groupnormalでないものとする。

  3. ancestorGroupが存在すれば、そのdocument-scoped view transition nameを返す。

  4. noneを返す。

9.7.3. group name の解決

Element elementused group nameを解決するには、ViewTransition transitionを受け取って以下を行う:
  1. Assert: elementtransitionに参加している。

  2. groupelementdocument-scoped view transition groupとする。

  3. containingGroupNameelementnearest containing group nametransitionを渡す)とする。

  4. groupに応じて最初に一致する条件の値を返す:

normal
contain

containingGroupNameを返す。

注: contain を持つ要素は、その子孫に対して 最も近い包含グループ名 となります。

nearest

その要素の最近傍のdocument-scoped view transition nametransitionに参加するフラットツリー祖先)を返す。

<custom-ident>

要素に flat treeancestor が存在し、その document-scoped view transition namegroup であり、transition に参加している場合は group。それ以外の場合は containingGroupName

9.7.4. view-transition-groupの計算

要素の旧状態をキャプチャする際、captured element capturedElementViewTransition transitionelement elementを受け取り、以下を行う:
  1. capturedElementcontaining group nameelementused group nametransition指定)を設定する。

9.7.5. view-transition-groupの計算

要素の新状態をキャプチャする際、captured element capturedElementViewTransition transitionelement elementを受け取り、以下を行う:
  1. capturedElementcontaining group nameelementused group nametransition指定)を設定する。

9.7.6. 指定された containing group へ ::view-transition-group() を再親化する

transition pseudo-element のセットアップ時、captured element capturedElementtransitionNametransitionを受け取り、以下を行う:
  1. containingGroupNamecapturedElementcontaining group nameとする。

  2. containingGroupNameがnullでなければ:

    1. groupContainerElementtransitionnamed elements[containingGroupName]とする。

    2. group::view-transition-group()view transition nametransitionNameとする)とする。

    3. parentGroup::view-transition-group()view transition namecontainingGroupNameとする)とする。

    4. groupparentGroupに追加する。

    5. アニメーションキーフレーム設定時、transformに対して、groupContainerElementold transformgroupContainerElementold widthgroupContainerElementold heightgroupContainerElementold box propertiesを渡し、adjust the nested group transformを行う。

注: 旧・新グループが不一致な場合の処理は未定。Issue 10631参照。

9.7.7. グループのtransformを containing ::view-transition-group()に対して相対化する

transition pseudo-element のスタイル更新時、captured element capturedElementtransformViewTransition transitionを受け取り、以下を行う:
  1. capturedElementtransform from snapshot containing blocktransformを設定する。

  2. capturedElementcontaining group nameがnullでなければ:

    1. groupContainerElementtransitionnamed elements[capturedElementcontaining group name]とする。

    2. containerRectを、capturedElementdocument elementの場合はsnapshot containing block、それ以外はcapturedElementborder boxとする。

    3. adjust the nested group transformtransformに対して、groupContainerElementtransform from snapshot containing blockcontainerRectのwidth、height、groupContainerElementnew box propertiesを渡して実行。

9.8. レイヤーCSSプロパティのキャプチャ

9.8.1. layered-capture style の計算

Element elementlayered capture styleを計算するには:
  1. propertiesToCaptureリストとして新規作成し、layered capture propertiesに対応させる。

  2. overflowとcontainmentの挙動は要指定。issue 11079参照。

  3. stylesを « » とする。

  4. propertyについてpropertiesToCaptureをループし、appendで、 « property, ":", element算出値property)、";" » をstylesに追加。

  5. concatentationstylesを返す。

Element elementlayered capture geometryを計算するには、layered box propertiesを新規作成し、 box sizingelement算出値 box-sizingpadding boxelementpadding boxcontent boxelementcontent boxとする。

elementを受け取ってdefault group sizeを計算する場合、elementcontent boxのサイズを返す。element算出値 box-sizingcontent-boxならそうし、そうでなければelementborder boxのサイズを返す。

9.8.2. 旧レイヤー化プロパティのキャプチャ

要素の旧状態をキャプチャする際、captured element capturedElementelement element を受け取り、以下を行う:
  1. capturedElementold layered-capture styleelementlayered capture styleを設定する。

  2. capturedElementold box propertieselementlayered capture geometryを設定する。

  3. capturedElementの(old width, old height)に elementdefault group sizeを設定する。

9.8.3. 画像キャプチャサイズの調整

画像をキャプチャする場合、画像の自然な寸法は、要素のcontent boxのサイズに基づき、border boxではありません。

9.8.4. レイヤーキャプチャ付きスナップショットの描画

要素をスナップショットへキャプチャする際、要素の内容のみが描画され、要素の効果やボックス装飾は描画されません。 具体的には、要素のbackgroundborderborder-imagebox-shadowoutlineは描画されず、 border-radiusclip-pathfiltermaskopacityは適用されません。

9.8.5. 入れ子グループのtransformの調整

adjust the nested group transformは、matrix transformmatrix parentTransformborderBoxWidthborderBoxHeightlayered box properties boxPropertiesを受け取り、以下を行う:
  1. Multiply transformparentTransformの逆行列を掛ける。

  2. (left, top)をboxPropertiespadding box のボーダーエッジ(borderBoxWidth, borderBoxHeight内)とする。

  3. transformを(-left, -top)だけ平行移動する。

    注: これらの操作により、入れ子グループのデフォルト位置は元の要素の位置と等価となり、デフォルトでは入れ子の':view-transition-group'は親のpadding edge基準で配置されるようになります。

9.8.6. 旧レイヤーキャプチャプロパティを::view-transition-group()キーフレームに適用

transition pseudo-element のセットアップ時、captured element capturedElementtransitionNameを受け取り、以下を行う:
  1. keyframesNameを « -ua-view-transition-group-anim-, transitionName » の連結とする。

  2. capturedElementold layered-capture styleを構築ルール(keyframesName用)に追加する。

9.8.7. 新レイヤーキャプチャプロパティを::view-transition-group()に適用

transition pseudo-element のスタイル更新時、transitionNamecapturedElementwidthheightElement elementを受け取り、以下を行う:

注: これはwidthheightが変更される可能性がある。

  1. styleelementlayered capture styleとする。

  2. capturedElementnew box propertieselementlayered capture propertiesを設定する。

  3. (width, height)をelementdefault group sizeで設定する。

  4. « "::view-transition-group(", transitionName, ") {", style, "}" » の連結をユーザーエージェントスタイルシートに追加する。

  5. (oldContentWidth, oldContentHeight)を capturedElementold width, capturedElementold heightcapturedElementold box propertiesがnullの場合)、そうでなければcapturedElementold box propertiescontent boxのサイズとする。

  6. (newContentWidth, newContentHeight)を(width, height)(new box propertiesがnullの場合)、そうでなければcapturedElementnew box propertiescontent boxのサイズとする。

  7. 次の文字列(変数置換済み)をユーザーエージェントスタイルシートに追加する:

    @keyframes -ua-view-transition-content-geometry-transitionName {
          from {
            width: oldContentWidth;
            height: oldContentHeight;
          }
        }
    
        :root::view-transition-image-pair(transitionName) {
          position: relative;
          inset: unset;
          width: newContentWidth;
          height: newContentHeight;
          animation-name: -ua-view-transition-transitionName;
          animation-direction: inherit;
          animation-timing-function: inherit;
          animation-iteration-count: inherit;
          animation-duration: inherit;
        }
        

注: ':view-transition-image-pair' 疑似要素は relative配置を使い、グループのpaddingが有効になるようにしています。

プライバシーに関する考慮事項

この仕様は新しいプライバシーに関する考慮事項を導入しません。

セキュリティに関する考慮事項

クロスオリジン問題を防ぐため、現時点ではクロスドキュメントビュー遷移は同一オリジンナビゲーションのみ有効です。WICG/view-transitions#200 で議論された通り、依然として2つの潜在的脅威があります:

  1. 両ドキュメントのcross-origin isolated capabilityが異なる場合。 これにより、Documentcross-origin isolatedのときに、非 cross-origin isolated なドキュメントから画像データを取得できる状況が生じます。これはすでに [[css-view-transitions-1#sec] で 緩和されており、クロスオリジンiframeキャプチャにも同じ制限が適用されています。

  2. 同一オリジンナビゲーションでもクロスオリジンリダイレクト経由で発生する可能性があり、例:https://example.com から https://auth-provider.com/へリンクし、 そこから https://example.com/loggedinにリダイレクトされるケース。

    この場合、クロスオリジンの第三者がユーザーを予期せぬファーストパーティURLにリダイレクトし、予期せぬ遷移を発生させ、リダイレクトがあった事実を隠すことができます。 緩和策として、現在は Documentwas created via cross-origin redirectsの場合は遷移が無効になります。 このチェックは Documentreactivatedされる場合には適用されません(すでにリダイレクトが完了しているため)。

    注: これはサーバーサイドリダイレクトのみ該当。クライアントサイドリダイレクト(meta/http-equiv/refresh など)は新規ナビゲーション扱いです。

  3. 本機能はCSSによりナビゲーション関連情報がより多く露出することになります。これにより、第三者CSSの安全性への懸念が生じますが、原則として第三者スタイルシートは元々信頼できるソースのみが利用されるべきです。CSSはドキュメント情報取得や様々な変更が可能なためです。

Issue #8684WICG/view-transitions#200も参照。

付録A. 変更履歴

この付録は参考情報です。

2024-05-16 Working Draft からの変更点

適合性

文書の慣例

適合性要件は、記述的なアサーションと 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はアクセシブルな代替手段を提供しなければなりません。

適合クラス

本仕様への適合は、3つの適合クラスに対して定義されます:

スタイルシート
CSSスタイルシートです。
レンダラー
UAであり、スタイルシートの意味を解釈し、それを用いるドキュメントをレンダリングします。
オーサリングツール
UAであり、スタイルシートを作成します。

スタイルシートは、本仕様に適合するためには、このモジュールで定義されている構文を用いたすべての文が、汎用CSS文法および本モジュールで定義される各機能の個別文法に従って有効である必要があります。

レンダラーは、本仕様に適合するために、適切な仕様で定義された通りにスタイルシートを解釈することに加え、本仕様で定義されたすべての機能を正しく解析し、ドキュメントを適切にレンダリングする必要があります。ただし、デバイスの制限によってUAがドキュメントを正しくレンダリングできない場合でも、UAは非適合とみなされません。(例えば、UAはモノクロモニター上で色をレンダリングする必要はありません。)

オーサリングツールは、本仕様に適合するために、汎用CSS文法および本モジュールで定義される各機能の個別文法に従って構文的に正しいスタイルシートを作成し、このモジュールで記載されるスタイルシートのその他すべての適合要件も満たす必要があります。

部分的な実装

著者がフォワード互換のパース規則を活用してフォールバック値を割り当てられるように、CSSレンダラーは、利用可能なレベルのサポートがないatルール、プロパティ、プロパティ値、キーワード、その他の構文的構成を無効として(適切に無視)、処理しなければなりません。特に、ユーザーエージェントは、1つの複数値プロパティ宣言内でサポートされない値だけを選択的に無視し、サポートされる値だけを適用してはなりません。いずれかの値が無効(サポートされない値は必ず無効)とみなされた場合、CSSは宣言全体を無視することを要求します。

不安定・独自機能の実装

将来の安定CSS機能との衝突を避けるために、CSSWGはCSSの不安定な機能独自拡張を実装する際にはベストプラクティスに従うことを推奨します。

非実験的な実装

仕様がCandidate Recommendation段階に達すると、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できると証明できるCRレベルの機能については、プレフィックスなしの実装をリリースすべきです。

CSSの実装間での相互運用性を確立・維持するため、CSSワーキンググループは、非実験的なCSSレンダラーが、プレフィックスなしのCSS機能実装をリリースする前に、W3Cに実装報告書(必要ならばそのテストケースも)を提出するよう求めています。W3Cに提出されたテストケースは、CSSワーキンググループによるレビューや修正の対象となります。

テストケースや実装報告書提出に関する詳細はCSSワーキンググループのウェブサイトhttps://www.w3.org/Style/CSS/Test/で確認できます。ご質問はpublic-css-testsuite@w3.orgメーリングリスト宛にご連絡ください。

索引

この仕様で定義されている用語

参照で定義される用語

参考文献

規範的な参考文献

[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-BORDERS-4]
CSS Borders and Box Decorations Module Level 4. Editor's Draft. URL: https://drafts.csswg.org/css-borders-4/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-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-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-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-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-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-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/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[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-VIEW-TRANSITIONS-1]
Tab Atkins Jr.; Jake Archibald; Khushal Sagar. CSS View Transitions Module Level 1. 2024年3月28日. CR. URL: https://www.w3.org/TR/css-view-transitions-1/
[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/
[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/
[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/
[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/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[CSS-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS Conditional Rules Module Level 3. 2024年8月15日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2024年8月10日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS Shadow Parts. 2018年11月15日. WD. URL: https://www.w3.org/TR/css-shadow-parts-1/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正規順序 算出値
view-transition-class none | <custom-ident>+ none すべての要素 no n/a 離散 文法通り 記述通り
view-transition-group normal | contain | nearest | <custom-ident> normal すべての要素 no n/a 離散 文法通り 記述通り

@view-transition 記述子

名前 初期値
navigation auto | none none
types none | <custom-ident>+ none

IDL索引

[Exposed=Window]
    interface CSSViewTransitionRule : CSSRule {
      readonly attribute CSSOMString navigation;
      [SameObject] readonly attribute FrozenArray<CSSOMString> types;
    };

    [Exposed=Window]
    interface ViewTransitionTypeSet {
      setlike<DOMString>;
    };

    [Exposed=Window]
    partial interface ViewTransition {
      attribute ViewTransitionTypeSet types;
    };

    dictionary StartViewTransitionOptions {
      ViewTransitionUpdateCallback? update = null;
      sequence<DOMString>? types = null;
    };

    partial interface Document {
      ViewTransition startViewTransition(optional (ViewTransitionUpdateCallback or StartViewTransitionOptions) callbackOptions = {});
    };

    

課題索引

この挙動はCSSプロパティによるopt-in/opt-outにするべきか? issue 11078参照。
旧状態のキャプチャはここでは同期的ステップのように見えるが、実際には非同期処理(要素を画像化するレンダリングは同期不可)。L1仕様でより明示すべき。
overflowとcontainmentの挙動は要指定。issue 11079参照。