ウェブアニメーション

W3C作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2023/WD-web-animations-1-20230605/
最新公開バージョン:
https://www.w3.org/TR/web-animations-1/
編集者草案:
https://drafts.csswg.org/web-animations-1/
過去のバージョン:
履歴:
https://www.w3.org/standards/history/web-animations-1
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/web-animations
フィードバック:
CSSWG課題リポジトリ
仕様内で直接表示
編集者:
(招待エキスパート)
(Google)
(Google)
(Apple Inc)
前任編集者:
(Google)
(Google)
(Google)
(Google)
この仕様への編集提案:
GitHub 編集者
参加方法:
GitHubで本文を修正
「waapi」チャンネルに参加:Animation at Work slack
IRC: #webanimations (W3CのIRC)

概要

この仕様は、Webページの表示に対する変更の同期とタイミングのためのモデルを定義します。 また、この仕様はこのモデルとやり取りするためのアプリケーションプログラミングインターフェースも定義しており、さらに他の仕様がこれらの機能を公開する宣言的な手段を定義することが期待されています。

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

この文書のステータス

このセクションは、本書が公開された時点でのステータスを説明します。 現在のW3C出版物の一覧や、この技術報告書の最新改訂版は https://www.w3.org/TR/ のW3C技術報告書インデックスで確認できます。

この文書は、CSS作業グループによって 作業草案として 勧告トラックを用いて公開されました。 作業草案としての公開は、W3Cおよびそのメンバーによる支持を意味するものではありません。

これは草案文書であり、随時更新、置換、または他の文書により廃止される可能性があります。 作業中の文書以外として引用することは不適切です。

フィードバックは GitHubでIssueを提出(推奨)、 件名に仕様コード「web-animations」を含めてください(例:「[web-animations] …コメント概要…」)。 すべてのIssueおよびコメントは アーカイブされます。 または、(アーカイブ済み)公開メーリングリスト www-style@w3.org に送信いただくこともできます。

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

この文書は、W3C特許ポリシーのもとで活動しているグループによって作成されました。 W3Cは、グループの成果物に関連する特許開示の公開リストを管理しています。 そのページには特許開示の方法も記載されています。 特許の実際の知識を持つ者は、その特許が必須クレームを含むと信じる場合、W3C特許ポリシー第6節に従い情報を開示する必要があります。

1. はじめに

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

Web Animationsは、Webプラットフォーム上でアニメーションと同期をサポートするためのモデルを定義します。 他の仕様がこのモデルを基盤として、宣言的な手段でその機能を公開することを想定しています。 さらに、この仕様はスクリプト対応のユーザーエージェントによって実装可能な、モデルへのプログラミングインターフェースも定義します。

1.1. ユースケース

Web Animationsモデルは、CSS Transitions [CSS-TRANSITIONS-1]、 CSS Animations [CSS-ANIMATIONS-1]、 SVG [SVG11]を表現するために必要な機能を提供することを目的としています。 そのため、Web Animationsモデルのユースケースはこれら3つの仕様のユースケースの集合となります。

プログラミングインターフェースのユースケースには次のようなものがあります:

実行中のアニメーションの調査

Webアプリケーションでは、特定のアニメーション効果が完了するまで状態更新を待機する必要がある場合がよくあります。 この仕様のプログラミングインターフェースを使えば、現在実行中のすべてのアニメーションの完了を待機できます。 それらがCSS Transitions、CSS Animations、SVGアニメーション、またはプログラミングインターフェースで直接作成されたものであっても関係ありません。

// すべてのアニメーションが終了したら要素を削除する
Promise.all(
  elem.getAnimations().map(animation => animation.finished)
).then(() => elem.remove());

また、アプリケーションによっては、待機せずにアニメーションの再生状態を問い合わせたい場合もあります。

const isAnimating = elem.getAnimations().some(
  animation => animation.playState === 'running'
);
実行中のアニメーションの制御

アニメーションを外部入力に応じて制御できると便利な場合があります。 例えば、モーダルダイアログ表示前に既存のアニメーションすべてを一時停止し、ユーザーの注意をそらさないようにする必要があるかもしれません。

// ドキュメント内の既存アニメーションをすべて一時停止する
for (const animation of document.getAnimations()) {
  animation.pause()
}
スクリプトによるアニメーションの作成

ECMAScriptでrequestAnimationFrame [HTML]を使ってアニメーションすることも可能ですが、 そのようなアニメーションは宣言的アニメーションとは、CSSカスケードでの表現や別スレッドで実行可能などのパフォーマンス最適化の点で挙動が異なります。 Web Animationsプログラミングインターフェースを使えば、宣言的アニメーションと同じ挙動・パフォーマンス特性を持ったスクリプトによるアニメーションを作成できます。

// 素早くフェードアウト
elem.animate({ transform: 'scale(0)', opacity: 0 }, 300);
アニメーションのデバッグ

複雑なアプリケーションでは、要素が現在の状態に至った理由を把握するのが困難な場合があります。 Web Animationsプログラミングインターフェースを使えば、 実行中のアニメーションを調査して「なぜこの要素のopacityが変化しているのか?」などの疑問に答えることができます。

// elem上のopacityアニメーションのidを出力する
for (const animation of elem.getAnimations()) {
  if (
    animation.effect instanceof KeyframeEffect &&
    animation.effect
      .getKeyframes()
      .some(frame => frame.hasOwnProperty('opacity'))
  ) {
    console.log(animation.id);
  }
}

同様に、アニメーションを細かく調整するには再生速度を落として再再生することがよくあります。

// transformアニメーションを遅くして再生する
const transformAnimations = elem.getAnimations().filter(
  animation =>
    animation.effect instanceof KeyframeEffect &&
    animation.effect.getKeyframes().some(
      frame => frame.hasOwnProperty('transform')
    )
);

for (const animation of transformAnimations) {
  animation.currentTime = 0;
  animation.updatePlaybackRate(0.5);
}
アニメーションのテスト

アニメーションを利用するアプリケーションをテストする際、アニメーションが完了するまで待つのは現実的でない場合が多いです。 そのため、アニメーションを特定の時刻にシークすることが望ましいです。

// アニメーションの半分までシークしてopacityが50%か確認
for (const animation of elem.getAnimations()) {
  const { delay, activeDuration } = animation.effect.getComputedTiming();
  animation.currentTime = delay + activeDuration / 2;
}
assert.strictEqual(getComputedStyle(elem).opacity, '0.5');

// アニメーション終了後にロード画面が非表示になることを確認
for (const animation of elem.getAnimations()) {
  animation.finish();
}
// イベントハンドラが動作するよう1フレーム待つ
requestAnimationFrame(() => {
  assert.strictEqual(
    getComputedStyle(document.querySelector('#loading')).display, 'none');
});

1.2. 他の仕様との関係

CSS Transitions [CSS-TRANSITIONS-1]、CSS Animations [CSS-ANIMATIONS-1]、 SVG [SVG11]はすべてWebページ上でアニメーションコンテンツを生成する仕組みを提供します。 これら3つの仕様は多くの類似機能を提供しますが、記述方法は異なっています。 本仕様では3つの仕様の共通機能を包含する抽象的なアニメーションモデルを提案します。 このモデルはこれらの仕様の現行挙動と後方互換性があり、観測可能な変化なしにこのモデルで定義可能です。

SVG 1.1のアニメーション機能はSMIL Animation [SMIL-ANIMATION]で定義されています。 SVGのアニメーション機能をWeb Animationsモデルで定義することで、SVGとSMIL Animationの依存を排除できることを目指しています。

アニメーションフレームコールバック(通称"requestAnimationFrame")[HTML]のように、 本仕様のプログラミングインターフェース部分ではスクリプトからアニメーションを生成できます。 ただし本仕様で定義されたインターフェースで生成されたアニメーションは、生成後はユーザーエージェントによって完全に実行されるため、 マークアップで定義されたアニメーションと同じパフォーマンス特性を持ちます。 このインターフェースを用いることで、より簡単かつ高性能にスクリプトからアニメーションを作成できます。

プログラミングインターフェースで使用される時間値は アニメーションフレームコールバック [HTML]で使われるものと対応しており、両インターフェースが同時利用できるよう実行順序も定義されています。

本仕様のプログラミングインターフェース部分はHTML [HTML]で定義されているインターフェースにもいくつか追加を行います。

1.3. 本仕様の概要

本仕様はまずアニメーションの抽象モデルを定義します。 その後、この抽象モデルに基づいて定義されたプログラミングインターフェースについて説明します。 プログラミングインターフェースは抽象モデルに基づいて定義され、スクリプト対応のユーザーエージェントにのみ関係します。

2. 仕様の規約

この仕様は、アニメーションアニメーション効果などの抽象概念、およびそれらに属する再生速度反復期間などのプロパティについて説明することから始まります。 これらのプロパティに加えて、再生速度を設定する手順や開始時刻を設定する手順など、プロパティを更新するための特定の手続きが存在することがよくあります。

この仕様で特定の手順へのリンクがない場合、ユーザーエージェントがプロパティを更新するよう求められるテキスト(例:「animation開始時刻未解決にする」)は、関連する手順を呼び出すことなく直接プロパティを更新することを指すものと理解してください。

この仕様に特有でないさらなる文書規約については、文書の規約で説明されています。

3. ウェブアニメーションモデル概要

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

概観として、Webアニメーションモデルは主に2つの独立した構成要素、タイミングモデルアニメーションモデルから構成されています。それぞれの役割は下記の通りです:

タイミングモデル

ある時刻を受け取り、反復進捗と呼ばれるアニメーションの1回の反復内での割合に変換します。 また、いくつかのアニメーションが反復するたびに挙動が異なるため、反復インデックスも記録されます。

アニメーションモデル

タイミングモデルによって生成された反復進捗値や反復インデックスを受け取り、それらをターゲットプロパティに適用する値の系列へと変換します。

この流れは、図示すると以下のように表せます:

Web Animationsモデルの動作概要。
Web Animationsモデルの動作概要。
現在時刻がタイミングモデルに入力され、反復進捗値と反復インデックスが生成されます。
これらのパラメータがアニメーションモデルの入力として使われ、適用する値が出力されます。

例として、以下のようなアニメーションを考えます:

最初の3つのポイントはタイミングモデルに関係します。 6秒の時点ではアニメーションが2回目の反復の半分まで進んでいると計算され、0.5という結果を出します。 アニメーションモデルはその情報を用いて幅を計算します。

この仕様はタイミングモデルから始まり、続いてアニメーションモデルに進みます。

4. タイミングモデル

このセクションでは、Web Animationsタイミングモデルの挙動を説明・定義します。

4.1. タイミングモデル概要

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

Web Animationsタイミングモデルには2つの特徴があります。ステートレスであり、階層構造を持ちます。

4.1.1. ステートレス

Web Animationsタイミングモデルは、入力時刻を受け取り、出力として反復進捗を生成します。 出力は入力時刻のみに基づき、過去の入力に依存しないため、このモデルはステートレスと記述できます。 この性質により、モデルには以下の特性があります:

フレームレート非依存

出力は過去の入力に依存しないため、モデルの更新頻度が進捗に影響することはありません。 入力時刻が実時間の進捗に比例していれば、デバイスの性能に関係なくアニメーションは同じ速度で進行します。

方向非依存

入力の順序が重要でないため、モデルは方向性を持ちません。 そのため、モデルを任意の時刻に更新する際に特別な処理は不要です。

定数時間でのシーク

各入力が過去の入力と独立しているため、将来の任意の時刻へのシーク操作に必要な処理は、少なくとも理論上は定数時間です。

タイミングモデルのステートレスな挙動にはいくつか例外があります。

まず、モデルのプログラミングインターフェースで定義されたメソッドのいくつかは、 アニメーションの一時停止などの再生制御を提供します。 これらのメソッドは呼び出された時刻に基づいて定義されるため、状態的(stative)です。 これらのメソッドは主に利便性のために提供されており、コアのタイミングモデルには含まれず、上位レイヤーで実装されています。

同様に、アニメーションの終了時の挙動では、 メディア(関連効果)の終了時刻に動的な変更が加えられると、変更のタイミングによって異なる結果になることがあります。 この挙動は直感的かつHTMLと整合的であると判断されており、惜しいながらも採用されています。 そのため、モデルはタイミングプロパティに動的変更がない限りステートレスとみなせます。

最後に、モデルが更新されるたび、一時的な状態が確立されると考えられます。 この一時状態はプログラミングインターフェースから返される値に影響しますが、次回の更新には影響せず、上述のステートレスな性質と矛盾しません。

4.1.2. 階層構造

タイミングモデルのもう一つの特徴は、時間が継承されることです。 時間はタイムラインから始まり、複数のステップを経て各アニメーション効果へとカスケードします。 各ステップで、時間は前後にシフトしたり、スケールしたり、反転したり、一時停止したり、繰り返されたりします。

タイミングノードの階層構造
タイミングノードの階層構造。
ツリー内の各ノードは親ノードから時間を取得します。

この仕様レベルでは階層は浅いですが、今後の仕様レベルでグループ効果の概念が導入され、より深いタイミング階層が可能になります。

4.2. 時間値

タイミングはタイミングノード間の階層的な時間関係に基づいています。 親ノードは時間値という形で子ノードにタイミング情報を提供します。

時間値は、ある瞬間からのミリ秒数を表す実数です。 時間値と実際の壁時計のミリ秒との関連は、 時間階層を通過する際に適用される様々な変換によって不明瞭になることがあります。

将来的には、スクロール位置やUIジェスチャーに基づくタイムラインもあり得ます。その場合、時間値とミリ秒との関係はさらに弱まります。

時間値は、例えばタイミングノードが時間値を生成できない状態の場合など、未解決にもなり得ます。

4.3. タイムライン

タイムラインは、同期のための時間値の発生源を提供します。

任意の時点で、タイムラインは、単一の現在の時間値を持ち、単純にタイムラインの現在時刻と呼ばれます。

タイムラインは、常に意味のある時間値を返すとは限らず、未解決な時間値しか返せない場合があります。 例えば、ドキュメントのloadイベント発火など、まだ発生していない瞬間を基準として定義されている場合です。 タイムラインは、その時間値未解決である時、非アクティブタイムラインとみなされます。

タイムラインは、報告された現在時刻が前回の報告時点より常に大きいか等しい場合、単調増加タイムラインです。

特定の種類のタイムラインは、タイムライン時刻をオリジン基準時刻に変換する手順を定義でき、時間値timeに対して、壁時計ベースのタイムラインで生成された時間値同士を比較できるようにします。

タイムラインドキュメントに関連付けられたタイムラインとなる場合があります。

アニメーションの更新とイベント送信Documentdocでタイムスタンプnowに対して実行する場合、以下の手順を踏みます:

  1. docに関連付けられた全ての現在時刻を持つタイムラインの現在時刻を、タイムスタンプとしてnowを渡して更新します。

    タイミングモデルの階層性により、タイムラインの現在時刻を更新する際には、以下も含みます:

  2. 置換されたアニメーションの削除docに対して行います。

  3. マイクロタスクチェックポイントの実行

    注: これは、前のステップでタイムラインの更新の一環としてPromiseオブジェクトの解決や拒否によってキューされたマイクロタスクが、アニメーションイベントのディスパッチより先にコールバックされることを保証するためです。

  4. events to dispatchdoc保留中アニメーションイベントキューのコピーとする。

  5. doc保留中アニメーションイベントキューをクリアする。

  6. events to dispatch内のアニメーションイベントを以下の方法で安定ソートする:

    1. イベントを予定イベント時刻でソートし、予定時刻が早いものほど前に、未解決の予定イベント時刻のイベントは解決済みより前に並べる。

    2. 同じ予定イベント時刻のイベント同士は、合成順序でソートする。

    注: イベントの順序を安定してソートする目的は、異なるデバイスの性能やフレームレートにかかわらず、できる限りイベントを一貫した順序でディスパッチするためです。

    注: 安定ソートが必要なのは、同時刻でキューされるイベントが時々あるためです。たとえばCSSアニメーションでdurationが0の場合、animationstartanimationend両方のイベントが同時にディスパッチされ、その順序を保持する必要があります。

  7. ディスパッチ手順に従い、events to dispatch内の各イベントを対応するターゲットに、前ステップで定めた順序で送信する。

この手順を実行するたび、新たなアニメーションフレームが確立されると表現すると便利な場合があります。 アニメーションアニメーション効果のタイミングプロパティの変更やオブジェクトの追加・削除は、タイミングモデルやアニメーションモデルの出力を変化させることがありますが、これら操作自体は新しいアニメーションフレームを作成するのではなく、単に現在のアニメーションフレームを更新するだけです。

4.3.1. ドキュメントタイムライン

ドキュメントタイムラインは、タイムラインの一種であり、ドキュメントに関連付けられ現在時刻が、アニメーションの更新とイベント送信手順が毎回実行される際に与えられるnowタイムスタンプからの固定オフセットとして計算されます。 この固定オフセットはドキュメントタイムラインの起点時刻と呼ばれます。

"origin time"より良い用語が必要です—"time origin"と似すぎています。[Issue #2079]

関連付けられたドキュメントのタイムオリジンが確立される前は、ドキュメントタイムライン非アクティブです。

ドキュメントタイムラインアクティブになると、単調増加となります。

ドキュメントタイムラインが、Documentで、アクティブなドキュメントでない場合も、非アクティブとみなされます。

タイムライン時刻timeline timeをオリジン基準時刻に変換するには、ドキュメントタイムラインtimelineに対して、timeline timetimeline起点時刻の合計を返す。timelineが非アクティブの場合は、未解決時間値を返す。

4.3.2. デフォルトドキュメントタイムライン

Documentは、ドキュメントタイムラインを持ち、これをデフォルトドキュメントタイムラインと呼びます。 デフォルトドキュメントタイムラインは各ドキュメントごとに固有であり、document.open() [HTML]の呼び出しを含め、ドキュメントの存続期間中持続します。

デフォルトドキュメントタイムライン起点時刻はゼロです。

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

ドキュメントタイムラインに渡されるnowタイムスタンプ値にはスケーリングが適用されないため、生成される時間値は壁時計のミリ秒に比例します。

さらに、デフォルトドキュメントタイムライン時間値タイムオリジンからのオフセットがゼロなので、 document.timeline.currentTimePerformance.now() [HR-TIME]にほぼ対応します。ただしdocument.timeline.currentTimeは、アニメーションの更新とイベント送信手順の呼び出し間は変化しません。

4.4. アニメーション

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

タイムラインの子はアニメーションと呼ばれます。 アニメーションは、あるアニメーション効果(一定時間の挙動の静的な記述)を取り、それをタイムラインに結びつけて実行します。 アニメーションは、アニメーション効果タイムラインとの接続を、再生・一時停止・シーク・速度制御などで実行時に制御できます。 アニメーションとアニメーション効果の関係は、DVDプレイヤーとDVDの関係に類似しています。

アニメーションは、単一のアニメーション効果関連効果と呼ばれる)をタイムラインに結びつけ、再生制御を提供します。 これらの関連付けは両方とも任意かつ設定可能であり、 アニメーションは、ある時点で関連効果タイムラインも持たない場合があります。

アニメーションタイミング用ドキュメントは、そのタイムライン関連付けられているDocumentです。 アニメーションがタイムラインに関連付けられていない場合や、そのタイムラインがドキュメントに関連付けられていない場合、タイミング用ドキュメントはありません。

アニメーション開始時刻は、関連効果の再生開始が予定される時点のタイムライン時間値です。 開始時刻は初期状態では未解決です。

アニメーションは、ホールド時刻時間値)も保持しており、一時停止などの状況でアニメーションの出力時間値現在時刻)を固定するために用いられます。 ホールド時刻も初期状態では未解決です。

競合するアニメーションの相対順序を確立するため、アニメーションは作成された順にグローバルアニメーションリストへ追加されます。ただし、特定のアニメーションクラスは、アニメーションの順序付けに別の方法を提供することがあります(§ 5.4.1 アニメーションクラス参照)。

4.4.1. アニメーションのタイムライン設定

アニメーションのタイムラインを設定する手順(animationnew timelineに設定、nullも可)は次の通りです:

  1. old timelineanimationの現在のタイムライン(あれば)とする。

  2. new timelineold timelineと同じオブジェクトなら、この手順を中止する。

  3. animationタイムラインnew timelineに設定する。

  4. animation開始時刻解決済みなら、animationホールド時刻未解決にする。

    注: このステップは、animation完了再生状態が「固着」せず、更新された現在時刻に基づいて再評価されることを保証します。

  5. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.2. アニメーションの関連効果設定

アニメーションの関連効果を設定する手順(animationnew effectに設定、nullも可)は次の通りです:

  1. old effectanimationの現在の関連効果(あれば)とする。

  2. new effectold effectと同じオブジェクトなら、この手順を中止する。

  3. animation保留中一時停止タスクがあれば、animationreadyになるとすぐにそのタスクを再スケジュールする。

  4. animation保留中再生タスクがあれば、animationreadyになりnew effectを再生できるときにそのタスクを再スケジュールする。

  5. new effectnullでなく、かつnew effectが他のアニメーションprevious animation)の関連効果である場合、previous animationに対しこの手順をnullをnew effectとして再実行する。

  6. animation関連効果new effectにする。

  7. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.3. アニメーションの現在時刻

アニメーションは、関連効果に対して時間値を提供し、それをアニメーションの現在時刻と呼びます。

現在時刻は以下から最初に一致する条件で計算されます:

アニメーションのホールド時刻解決済みの場合

現在時刻はアニメーションのホールド時刻です。

以下のいずれかが真の場合:

  1. アニメーションに関連付けられたタイムラインがない、または

  2. 関連付けられたタイムライン非アクティブ、または

  3. アニメーションの開始時刻未解決

現在時刻未解決な時間値です。

それ以外の場合
現在時刻 = (timeline time - 開始時刻) × 再生速度

timeline timeは、関連するタイムラインの現在の時間値です。 再生速度の値は§ 4.4.15 速度制御で定義されています。

4.4.4. アニメーションの現在時刻の設定

アニメーションの現在時刻は新しい値に設定することができ、アニメーションをシークできます。 現在時刻の設定手順は2つの部分に分かれています。

現在時刻を静かに設定する手順(animationの現在時刻をseek timeに設定)は次の通りです:

  1. seek time未解決な時間値の場合、以下の手順を実行する。

    1. 現在時刻解決済みなら、TypeErrorをスローする。

    2. これらの手順を中止する。

  2. animationホールド時刻または開始時刻を以下の通り更新する:

    以下のいずれかが真の場合:

    animationホールド時刻seek timeに設定する。

    それ以外の場合

    animation開始時刻を次で評価した結果に設定する: timeline time - (seek time / 再生速度) ここでtimeline timeは、animationに関連付けられたタイムラインの現在の時間値です。

  3. animationに関連付けられたタイムラインがない、または関連タイムライン非アクティブなら、animation開始時刻未解決にする。

    これは、アクティブなタイムラインがない場合、開始時刻または現在時刻のどちらかだけを設定できるという不変条件を保持します。

  4. animation直前の現在時刻未解決にする。

現在時刻を設定する手順(animationの現在時刻をseek timeに設定)は次の通りです:

  1. animationの現在時刻をseek time静かに設定する手順を実行する。

  2. animation保留中一時停止タスクがあれば、次の手順で一時停止操作を同期的に完了する:

    1. animationホールド時刻seek timeに設定する。

    2. 保留中再生速度animationに適用する。

    3. animation開始時刻未解決にする。

    4. 保留中一時停止タスクをキャンセルする。

    5. resolve手順でanimation現在のreadyプロミスanimationで解決する。

  3. animationに対して、did seekフラグをtrue、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.5. アニメーションの開始時刻の設定

開始時刻を設定する手順(animationanimationの開始時刻をnew start timeに設定)は次の通りです:

  1. timeline timeを、animationに関連付けられたタイムラインの現在の時間値とする。 animationに関連付けられたタイムラインがない、または関連タイムラインが非アクティブの場合は、timeline time未解決とする。

  2. timeline time未解決かつnew start time解決済みの場合、animationホールド時刻未解決にする。

    これは、アクティブなタイムラインがない場合、開始時刻現在時刻のどちらか一方のみ設定可能という不変条件を保持します。

  3. previous current timeanimation現在時刻とする。

    注: これは前のステップの変更後の現在時刻であり、現在時刻が未解決になる場合があります。

  4. 保留中再生速度の適用animationに行う。

  5. animation開始時刻new start timeに設定する。

  6. animationホールド時刻を下記から最初に一致する条件で更新する:

    new start time解決済みの場合

    animation再生速度がゼロでない場合、animationホールド時刻未解決にする。

    それ以外(new start time未解決の場合)

    animationホールド時刻previous current timeに設定する(previous current time未解決でも)。

  7. animation保留中再生タスクまたは 保留中一時停止タスクがあれば、そのタスクをキャンセルし、resolve手順で animation現在のreadyプロミスanimationで解決する。

  8. animationに対して、did seekフラグをtrue、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.6. 関連効果の待機

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

アニメーションによって行われる一部の操作は即座に発生しない場合があります。 例えば、ユーザーエージェントによってはアニメーションの再生を別プロセスや専用グラフィックスハードウェアに委譲し、セットアップのオーバーヘッドが発生することがあります。

そのようなアニメーションがトリガー時点から時刻計算される場合、セットアップ時間に対応してアニメーションの最初と2番目のフレーム間で大きなジャンプが生じることがあります。

この問題を避けるため、Web Animationsは通常、アニメーションの最初のフレームが完了した瞬間からタイミングを開始します。 これは、アニメーション上の開始時刻未解決として表現され、アニメーションが準備完了になると解決されます。 この挙動を回避したい場合は、開始時刻解決済み時間値に設定できます。

アニメーションは、以下の両方の条件が初めて真になる瞬間に準備完了となります:

4.4.7. 現在のreadyプロミス

アニメーション現在のreadyプロミスを持ちます。 現在のreadyプロミスは、初期状態では解決済みのPromiseであり、アニメーション自身を値として新たな解決済みPromiseを作成する手順で生成され、アニメーションの関連Realmで作成されます。

このオブジェクトは、アニメーションが新たに保留中再生タスク保留中一時停止タスクをキューした場合(以前は保留中タスクがなかった場合)、またはアニメーションがキャンセルされた場合(§ 4.4.14 アニメーションのキャンセル参照)には、新しいPromiseオブジェクトに置き換えられます。

同じオブジェクトが保留中再生・一時停止の両方のリクエストで使われるため、著者はPromiseオブジェクトが解決された際にアニメーションの状態を確認することを推奨します。

例えば、次のコード片では、現在のreadyプロミスが解決された時点でアニメーションの状態はrunningになります。 これは、play操作が保留中再生タスクがまだキュー済みの間に実行され、現在のreadyプロミスが再利用されるためです。

animation.pause();
animation.ready.then(function() {
  // 'running'と表示
  alert(animation.playState);
});
animation.play();

4.4.8. アニメーションの再生

アニメーションを再生する手順(animationauto-rewindフラグ付き)は次の通りです:

  1. aborted pauseを、animation保留中一時停止タスクがあればtrue、なければfalseとする。

  2. has pending ready promiseを初期値falseのブール値とする。

  3. seek timeを初期状態では未解決時間値とする。

  4. auto-rewindフラグがtrueの場合、以下から最初に一致する条件の手順を実行:

    animation実効再生速度が0以上、かつ現在時刻が:

    seek timeを0に設定する。

    animation実効再生速度が0未満、かつ現在時刻が:

    もし associated effect end が正の無限大の場合

    throw "InvalidStateError" DOMException を投げて、 これらの手順を中止する。

    それ以外の場合

    seek timeanimationassociated effect end に設定する。

  5. 以下3条件がすべて満たされた場合:

    seek timeを0に設定する。

    注: このステップにより、auto-rewindフラグの設定に関係なく、アイドル状態のアニメーションは再生されます。

  6. has finite timelineを、animationが関連付けられているタイムライン単調増加でない場合trueとする。

  7. seek time解決済みなら:

    has finite timelineがtrueの場合
    1. animation開始時刻seek timeに設定する。

    2. animationホールド時刻未解決とする。

    3. 保留中再生速度の適用animationに行う。

    それ以外の場合

    animationホールド時刻seek timeに設定する。

  8. animationホールド時刻解決済みなら、開始時刻未解決とする。

  9. animation保留中再生タスクまたは保留中一時停止タスクがあれば、

    1. そのタスクをキャンセルする。

    2. has pending ready promiseをtrueに設定する。

  10. 以下4条件がすべて満たされた場合:

    この手順を中止する。

  11. has pending ready promiseがfalseの場合、animation現在のreadyプロミスanimation関連Realm新しいPromiseにする。

  12. animation準備完了になるとすぐに実行されるタスクをスケジュールする。そのタスクは次を実行:

    1. animation開始時刻またはホールド時刻のいずれかが解決済みであることをアサートする。

    2. ready timeanimation準備完了になった瞬間の関連タイムライン時間値とする。

    3. 以下から最初に一致する条件に従う:

      animationホールド時刻解決済みの場合
      1. 保留中再生速度の適用animationに行う。

      2. new start timeready time - ホールド時刻 / 再生速度で評価した結果とする。再生速度が0ならnew start timeready timeとする。

      3. animation開始時刻new start timeに設定する。

      4. 再生速度が0でなければ、animationホールド時刻未解決とする。

      animation開始時刻が解決済みで、保留中再生速度がある場合
      1. current time to match(ready time - 開始時刻) × 再生速度で評価した結果とする。

      2. 保留中再生速度の適用animationに行う。

      3. 再生速度が0なら、animationホールド時刻current time to matchにする。

      4. new start timeready time - current time to match / 再生速度で評価した結果とする。再生速度が0ならnew start timeready timeとする。

      5. animation開始時刻new start timeに設定する。

    4. resolve手順でanimation現在のreadyプロミスanimationで解決する。

    5. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

      上記2ステップの順序は重要です。ゼロ長の関連効果を持つアニメーションでは、現在のreadyプロミス現在のfinishedプロミスより先に解決されます。

    このタスクがスケジュールされて未実行の間、animation保留中再生タスクを持つとされます。タスク実行中はanimation保留中再生タスク持たないとされます。

    ユーザーエージェントがanimationが即座に準備完了であると判断した場合、上記のタスクを次のマイクロタスクチェックポイントで実行されるマイクロタスクとしてスケジュールしてもよいが、同期的に実行してはならない

    上記の保留中再生タスクを非同期に実行する要件は、次のようなコードが各実装で一貫した挙動となることを保証します:

    animation.play();
    animation.ready.then(
      () => { console.log('Playback commenced'); },
      () => { console.log('Playback was canceled'); }
    );
    // 何らかの条件で再生をキャンセルする必要があると仮定...
    animation.cancel();
    // "Playback was canceled" がコンソールに出力される。
    

    上記コードで保留中再生タスクを同期的に実行した場合、現在のreadyプロミスはrejectされません。

  13. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.9. アニメーションの一時停止

アニメーション開始時刻未解決のとき、その現在時刻は一時停止されます。

アニメーションの再生と同様、一時停止は即座に発生しない場合があります(§ 4.4.6 関連効果の待機参照)。 例えば、アニメーションが別プロセスで実行されている場合、アニメーションプロセスによって描画された状態を反映するために現在時刻を同期する必要があるかもしれません。

アニメーションを一時停止する手順(animation)は次の通りです:

  1. animation保留中一時停止タスクがあれば、これらの手順を中止する。

  2. animation再生状態pausedの場合、これらの手順を中止する。

  3. seek timeを初期状態では未解決時間値とする。

  4. has finite timelineを、animationが関連付けられているタイムライン単調増加でない場合trueとする。

  5. animation現在時刻未解決の場合、以下から最初に一致する条件に従う:

    animation再生速度が0以上の場合

    seek timeを0に設定する。

    それ以外の場合
    もし associated effect endanimation に対して正の無限大の場合

    throw "InvalidStateError" DOMException を投げて、これらの手順を中止する。

    それ以外の場合

    seek timeanimationassociated effect end に設定する。

  6. seek time解決済みの場合:

    has finite timelineがtrueの場合

    animation開始時刻seek timeに設定する。

    それ以外の場合

    animationホールド時刻seek timeに設定する。

  7. has pending ready promiseを初期値falseのブール値とする。

  8. animation保留中再生タスクがあれば、そのタスクをキャンセルし、has pending ready promiseをtrueにする。

  9. has pending ready promiseがfalseの場合、animation現在のreadyプロミスanimation関連Realm新しいPromiseに設定する。

  10. 以下の両方の条件が初めて満たされた瞬間に実行されるタスクをスケジュールする:

    • ユーザーエージェントがanimation関連効果(あれば)の再生を一時停止するための処理を完了している。

    • アニメーションが非アクティブでないタイムラインに関連付けられている。

    タスクは次の手順を実行します:

    1. ready timeを、ユーザーエージェントがanimation関連効果の一時停止処理を完了した瞬間のタイムラインの時間値とする。

    2. animation開始時刻解決済みホールド時刻が解決済みでない場合、 ホールド時刻(ready time - 開始時刻) × 再生速度で評価した結果とする。

      注: ホールド時刻は、アニメーションが完了状態の場合や、保留中再生タスクがある場合はすでに設定されていることがあります。 いずれの場合もpaused状態に入る際にホールド時刻を維持したいです。

    3. 保留中再生速度の適用animationに行う。

    4. animation開始時刻を未解決にする。

    5. resolve手順でanimation現在のreadyプロミスanimationで解決する。

    6. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

    上記のタスクがスケジュールされて未実行の間、animation保留中一時停止タスクを持つとされます。タスク実行中はanimation保留中一時停止タスク持たないとされます。

    保留中再生タスクと同様、ユーザーエージェントは保留中一時停止タスクを非同期で実行する必要がありますが、それは次のマイクロタスクチェックポイントでも構いません。

  11. animationに対して、did seekフラグをfalse、synchronously notifyフラグをfalseに設定し、アニメーションの完了状態の更新手順を実行する。

4.4.10. 終了に到達

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

DVDプレイヤーやカセットプレイヤーは、通常メディアの終端まで再生し、到達すると停止します。 これらのプレイヤーが逆再生できる場合、メディアの始端に到達すると停止するのが一般的です。 この挙動を模倣し、HTMLのメディア要素 [HTML]との一貫性を持たせるため、 Web Animationsのアニメーションの現在時刻は、 その関連効果終了時刻を超えて再生されず、逆再生の場合は0未満に進行しません。

アニメーションが再生範囲の自然な境界に達した場合、完了したと言います。

現在時刻の制限効果は下図のとおりです。

アニメーションの現在時刻を制限した効果。
開始時刻1秒、関連効果の長さ3秒、正の再生速度アニメーション現在時刻を制限した効果。 アニメーションの現在時刻が関連効果の終端に到達すると、3秒で固定されます。

ただし、現在時刻関連効果の終了後にシークすることは可能です。 その場合、現在時刻は進行せず、アニメーションはシークされた時刻で一時停止したかのように振る舞います。

例えば、関連効果ないアニメーションの現在時刻を5秒にシークすることもできます。 後から5秒より遅い終了時刻を持つ関連効果がそのアニメーションに関連付けられた場合、再生は5秒から始まります。

上記と同様の挙動は、アニメーションの関連効果の長さが変化した場合にも発生します。

また、再生速度が負の場合、現在時刻は0未満には進行しません。

4.4.11. 現在のfinishedプロミス

各アニメーションは現在のfinishedプロミスを持ちます。 現在のfinishedプロミスは初期状態ではpendingなPromiseオブジェクトです。

アニメーションが完了再生状態を離れるたび、新しいpromiseに置き換えられます。

4.4.12. 完了状態の更新

再生速度が正の場合、 現在時刻関連効果終了まで増加し続けます。

関連効果終了は、アニメーションの関連効果終了時刻と等しいです。 アニメーションに関連効果がない場合、関連効果終了は0になります。

再生速度が負の場合、 現在時刻は0まで減少し続けます。

この境界に到達(または通過)し、開始時刻解決済みの実行中アニメーションは完了状態になります。

この境界の判定は、アニメーションオブジェクトを変更するたびに、下記のアニメーションの完了状態の更新手順でチェックされます。この手順はアニメーションの更新とイベント送信手順の一部としても実行されます。いずれの場合も、下記定義のdid seekフラグはfalseです。

各アニメーションについて、ユーザーエージェントは直前の現在時刻時間値)を管理します。初期値は未解決です。

通常再生中はアニメーション現在時刻は上記の境界に制限されますが、 現在時刻を設定する手順を使えば境界外の時刻にシークすることも可能です。

アニメーションの完了状態の更新手順(animationdid seekフラグ(現在時刻設定後か示す)、synchronously notifyフラグ(完了イベントのキューイングやfinished promiseの即時解決を期待する文脈か示す))は次の通りです:

  1. unconstrained current timeを、did seekがfalseならホールド時刻未解決時間値を代入して現在時刻を計算した結果、trueなら現在時刻自身とする。

    注: タイムラインの方向が変わる場合にも対応するために必要です。これがないと、一度完了したアニメーションがタイムラインが逆方向に進んでも完了のままになります。

  2. 以下3条件がすべて真なら、

    この場合、下記条件でanimationホールド時刻を更新:

    再生速度が0より大きく、unconstrained current time関連効果終了以上の場合

    did seekがtrueならホールド時刻unconstrained current timeにする。

    falseならホールド時刻を、直前の現在時刻関連効果終了の最大値にする。 直前の現在時刻未解決の場合はホールド時刻関連効果終了にする。

    再生速度が0未満、unconstrained current timeが0以下の場合

    did seekがtrueならホールド時刻unconstrained current timeにする。

    falseならホールド時刻直前の現在時刻と0の最小値にする。 直前の現在時刻未解決の場合はホールド時刻を0にする。

    再生速度が0でなく、animationアクティブタイムラインに関連付けられている場合

    以下を実行:

    1. did seekがtrueかつホールド時刻解決済みなら、animation開始時刻timeline time - (ホールド時刻 / 再生速度) で評価した値にする。timeline timeは関連するタイムラインの現在の時間値

    2. ホールド時刻未解決にする。

  3. animation直前の現在時刻現在時刻で計算した値にする。

  4. current finished stateを、animation再生状態完了ならtrue、それ以外はfalseとする。

  5. current finished stateがtrueで現在のfinishedプロミスが未解決なら、下記を実行:

    1. 完了通知手順は下記手順:

      1. animation再生状態完了でない場合、これらの手順を中止する。

      2. resolve手順でanimation現在のfinishedプロミスanimationで解決する。

      3. AnimationPlaybackEventfinishEvent)を作成。

      4. finishEventtype 属性をfinishに設定する。

      5. finishEventcurrentTime 属性をanimation現在時刻に設定する。

      6. finishEventtimelineTime 属性をanimationの関連タイムライン現在時刻に設定する。タイムラインがないか、非アクティブの場合は、timelineTimenull

      7. animationタイミング用ドキュメントがあれば、そのタイミング用ドキュメント保留中アニメーションイベントキューにターゲットanimationと共に追加する。予定イベント時刻には、変換したanimation関連効果終了のオリジン基準時刻を使う。

        それ以外の場合は、タスクをキューし、finishEventをanimationにディスパッチする。そのタスクソースはDOM操作タスクソース

    2. synchronously notifyがtrueなら、キュー済みの完了通知マイクロタスクをキャンセルし、直ちに完了通知手順を実行する。

      falseなら、マイクロタスクをキューして、すでにキューされていなければanimation完了通知手順を実行する。

  6. current finished stateがfalseで、animation現在のfinishedプロミスが既に解決済みなら、animation現在のfinishedプロミス新しいPromiseanimation関連Realm)にする。

通常は、アニメーションの完了状態の通知は非同期で行われます。これにより、アニメーションが一時的に完了再生状態に入っても、イベント発火やpromise解決が発生しないようにできます。

例えば、次のコード片ではanimationが一時的に完了状態になります。もし完了状態の通知が同期的に行われていれば、このコードはfinishイベントのキューや現在のfinishedプロミスの解決を引き起こします。しかし、2文の順序を逆にしてiterationsを先に更新すれば、このようなことは起きません。 このような予期せぬ挙動を避けるため、アニメーションの完了状態通知は通常非同期で行われます。

var animation = elem.animate({ left: '100px' }, 2000);
animation.playbackRate = 2;
animation.currentTime = 1000; // animationは今完了
animation.effect.updateTiming({ iterations: 2 }); // animationはもう完了ではない

唯一の例外は、アニメーションの完了手順(通常はfinish() メソッド呼び出し)を実行した場合です。この場合は著者が明示的に完了を意図しているので、完了状態の通知は下記の通り同期的に行われます。

var animation = elem.animate({ left: '100px' }, 1000);
animation.finish(); // finishイベントは即座にキューされ、finished promiseも
                    // 解決される。次の文で
                    // animationが完了状態でなくなっても。
animation.currentTime = 0;

アニメーションの完了手順同様、アニメーションのキャンセル手順も、cancelイベントを同期的にキューし、 現在のfinishedプロミス現在のreadyプロミスも同期的にrejectします。

4.4.13. アニメーションの完了

アニメーションは、下記のアニメーションの完了手順を使うことで、現在の再生方向の自然な終端まで進めることができます:

  1. もし animationeffective playback rate が 0 である場合、 または animationeffective playback rate が 0 より大きく、 associated effect end が無限大の場合は、 throw "InvalidStateError" DOMException を投げて、これらの手順を中止する。

  2. Apply any pending playback rateanimation に適用する。

  3. limit を次のように設定する:

    もし playback rate が 0 より大きい場合

    limitassociated effect end にする。

    それ以外の場合

    limit を 0 にする。

  4. Silently set the current timelimit に設定する。

  5. もし animationstart timeunresolved であり、かつ animation が関連付けられた active timeline を持つ場合、 start timetimeline time - (limit / playback rate)timeline time は関連付けられた timeline の現在の time value)で評価した値にする。

  6. もし pending pause task が存在し、start timeresolved の場合、

    1. hold timeunresolved にする。

      通常、hold time はすでに未解決ですが、animation が以前 idle 状態だった場合は例外です。
    2. pending pause task をキャンセルする。

    3. Resolveanimationcurrent ready promiseanimation で解決する。

  7. もし pending play task が存在し、 start timeresolved の場合、そのタスクをキャンセルし、 resolveanimationcurrent ready promiseanimation で解決する。

  8. animation に対して、did seek フラグを true、synchronously notify フラグを true に設定し、 update an animation’s finished state 手順を実行する。

4.4.14. アニメーションのキャンセル

アニメーションはキャンセルすることができ、これにより現在時刻未解決となり、関連効果による効果がすべて削除されます。

アニメーションをキャンセルする手順(animation)は次の通りです:

  1. animation再生状態idleでない場合、以下を実行:

    1. 保留中タスクのリセット手順をanimationに実行する。

    2. reject手順でanimation現在のfinishedプロミスを"AbortError"のDOMExceptionでrejectする。

    3. 現在のfinishedプロミスの[[PromiseIsHandled]]内部スロットをtrueにする。

    4. animation現在のfinishedプロミスを、新しいPromiseanimation関連Realm)にする。

    5. AnimationPlaybackEventcancelEvent)を作成する。

    6. cancelEventtype属性をcancelに設定する。

    7. cancelEventcurrentTimenullに設定する。

    8. timeline timeを、animationが関連付けられているタイムライン現在時刻とする。タイムラインがアクティブでない場合は、timeline time未解決時間値とする。

    9. cancelEventtimelineTimetimeline timeに設定する。timeline time未解決なら、nullに設定する。

    10. animationタイミング用ドキュメントがあれば、タイミング用ドキュメント保留中アニメーションイベントキューcancelEventとターゲットanimationを追加する。animationがアクティブなタイムラインに関連付けられており、タイムライン時刻をオリジン基準時刻に変換する手順を定義している場合は、予定イベント時刻をその手順でtimeline timeを変換した結果とする。 それ以外の場合は、予定イベント時刻未解決時間値とする。

      それ以外の場合は、タスクをキューし、cancelEventをanimationにディスパッチする。タスクソースはDOM操作タスクソース

  2. animationホールド時刻未解決にする。

  3. animation開始時刻未解決にする。

保留中タスクのリセット手順(animation)は次の通りです:

  1. animation保留中再生タスク保留中一時停止タスクも持たない場合、この手順を中止する。

  2. animation保留中再生タスクを持つ場合、そのタスクをキャンセルする。

  3. animation保留中一時停止タスクを持つ場合、そのタスクをキャンセルする。

  4. 保留中再生速度の適用animationに行う。

  5. reject手順でanimation現在のreadyプロミスを"AbortError"のDOMExceptionでrejectする。

  6. animation現在のreadyプロミスの[[PromiseIsHandled]]内部スロットをtrueにする。

  7. animation現在のreadyプロミス新たな解決済みPromiseオブジェクト(値はanimationanimation関連Realm)にする。

4.4.15. 速度制御

アニメーションの再生速度は 再生速度 を設定することで制御できます。 例えば、再生速度を2に設定すると、アニメーションの現在時刻タイムラインの2倍の速さで増加します。 同様に、再生速度を-1に設定すると アニメーションの現在時刻タイムライン時間値が増加するのと同じ速度で減少します。

アニメーション再生速度 を持ち、 関連付けられたタイムライン時間値の変化速度からアニメーションの現在時刻へのスケーリング係数を提供します。 再生速度の初期値は1です。

アニメーションの再生速度を0に設定すると、事実上一時停止状態になります(ただし再生状態が必ずしも一時停止になるとは限りません)。

4.4.15.1. アニメーションの再生速度の設定

再生速度の設定手順( アニメーション animationnew playback rateに設定)は次の通りです:

  1. animation保留中再生速度をクリアする。

  2. previous timeを、現在時刻の変更前の値とする。

  3. previous playback rateを、animationの現在の実効再生速度とする。

  4. 再生速度new playback rateに設定する。

  5. 以下のうち最初に一致する条件の手順を実行:

    animation単調増加タイムラインに関連付けられており、previous time解決済みの場合

    現在時刻の設定手順でanimationの現在時刻をprevious timeにする。

    animationがnull以外のタイムラインに関連付けられていて、かつ単調増加でなく、 animation開始時刻解決済み関連効果終了が無限大でなく、かつ いずれかが成立する場合:

    • previous playback rate < 0 かつ new playback rate ≥ 0

    • previous playback rate ≥ 0 かつ new playback rate < 0

    animation開始時刻関連効果終了 - 開始時刻 で評価した値にする。

    注: この操作は非単調タイムライン上でアニメーションの開始/終了時刻を反転し、開始時刻の相対オフセットを保ちます。

4.4.15.2. アニメーションの再生速度をシームレスに更新する

別プロセスやスレッド上で実行中のアニメーションの場合、 再生速度の設定手順は、 アニメーションの実行プロセス/スレッドが更新操作側と同期していないとジャンプを引き起こす可能性があります。

アニメーションの再生速度をシームレスに変更するために、 アニメーションには 保留中再生速度 を持たせることができ、 必要な同期後に(他プロセスやスレッドの場合)適用されます。

初期状態で保留中再生速度は未設定です。

実効再生速度は、 animation保留中再生速度があればそれを、なければ再生速度を使います。

アニメーション animation保留中再生速度の適用を行う手順:

  1. animation保留中再生速度を持たない場合、これらの手順を中止する。

  2. animation再生速度保留中再生速度に設定する。

  3. animation保留中再生速度をクリアする。

再生速度をシームレスに更新する手順(アニメーション animationnew playback rate現在時刻を保ったまま)は次の通りです:

  1. previous play stateanimation再生状態とする。

    注: animation実効再生速度を更新する前に再生状態を記録する必要があります。 このロジックでは、animation現在完了状態であれば、保留中再生速度を即座に適用したいからです。

  2. animation保留中再生速度new playback rateに設定する。

  3. 以下から最初に一致する条件による手順を実行:

    animation保留中再生タスクまたは保留中一時停止タスクを持つ場合

    これらの手順を中止する。

    注: 保留中タスクの種類によって、走行中に保留中再生速度が適用されるため、追加アクションは不要です。

    previous play stateidleまたは一時停止、あるいはanimation現在時刻未解決の場合

    保留中再生速度の適用手順をanimationに実行する。

    注: 2つ目の条件は、未解決の現在時刻かつ保留中再生タスクがない実行中アニメーションに対して、以下の再生処理を行わないようにするためです。

    previous play state完了の場合
    1. unconstrained current timeを、animation現在時刻ホールド時刻未解決時間値を代入して計算した値とする。

    2. animation開始時刻timeline time - (unconstrained current time / 保留中再生速度)timeline timeは関連タイムラインの現在時間値)に設定する。

      保留中再生速度が0なら、animation開始時刻timeline timeとする。

    3. 保留中再生速度の適用手順をanimationに実行する。

    4. アニメーションの完了状態の更新手順をanimationに対してdid seekフラグfalse、synchronously notifyフラグfalseで実行する。

    それ以外の場合

    アニメーション再生手順でanimationauto-rewindフラグをfalseで実行する。

4.4.16. アニメーションの逆再生

アニメーションの逆再生手順(animation animation)は次の通りです:

  1. もしanimationに関連付けられているタイムラインが存在しない場合、または関連付けられているタイムライン非アクティブである場合、throwし、「InvalidStateErrorDOMExceptionを発生させ、これらの手順を中止する。

  2. original pending playback rateanimationpending playback rate とする。

  3. animationpending playback rateeffective playback rate の加法逆数(すなわち -effective playback rate)に設定する。

  4. animation に対して auto-rewind フラグを true にして play an animation の手順を実行する。

    もし play an animation の手順で例外が発生した場合は、animationpending playback rateoriginal pending playback rate に戻し、例外を伝播する。

4.4.17. 再生状態

アニメーションは、以下のいずれかの再生状態となり得ます。各状態には非規範的な説明も付与されています:

idle

アニメーションの現在時刻未解決であり、 アニメーションの開始時刻未解決であり、 保留中タスクが存在しない。 この状態ではアニメーションは何の効果も持ちません。

running

アニメーションは解決済みの現在時刻を持ち、各アニメーションフレームごとに値が変化します(再生速度が0でなく、タイムラインアクティブかつ単調増加の場合)。

paused

アニメーションは一時停止されており、現在時刻が変化しなくなっています。

finished

アニメーションは再生範囲の自然な境界に到達し、現在時刻は更新されなくなります。

animation animation再生状態は、次の条件のうち最初に一致する状態となります:

すべての次の条件が真の場合:

idle

いずれかの次の条件が真の場合:

paused

animation現在時刻解決済みで、かつ以下のいずれかが真の場合:

finished

それ以外の場合

running

注意:paused再生状態は finished再生状態よりも優先されます。

ただし、自然な再生範囲外で一時停止されたアニメーションは、例えば以下のように開始時刻を設定することで、再開せずにpaused状態からfinished状態に変換できます:

animation.effect.updateTiming({ duration: 5000 });
animation.currentTime = 4000;
animation.pause();
animation.ready.then(function() {
  animation.effect.updateTiming({ duration: 3000 });
  alert(animation.playState); // 'paused'と表示
  animation.startTime =
    document.timeline.currentTime - animation.currentTime * animation.playbackRate;
  alert(animation.playState); // 'finished'と表示
});

4.4.18. アニメーションイベント

アニメーションイベントには、この仕様で定義されるアニメーション再生イベントや、 CSSトランジションのイベント [CSS-TRANSITIONS-1]CSSアニメーションのイベント [CSS-ANIMATIONS-1] が含まれます。 今後の仕様でさらに多様なアニメーションイベントが追加される可能性もあります。

Documentは、保留中アニメーションイベントキューを保持し、アニメーションイベントとその対応するイベントターゲット、 予定イベント時刻を格納します。 予定イベント時刻時間値であり、 タイムオリジン基準で、アニメーションが無限に高頻度で更新された場合にイベントが理想的にディスパッチされるタイミングを表します。 この値はアニメーションの更新とイベント送信手順でキューされたアニメーションイベントを時系列でソートするために使われます。 なお、この値は例えばアニメーションタイムラインがタイムオリジンと無関係な値を生成する場合(例:スクロール位置を追跡するタイムライン)や、 タイムライン非アクティブの場合は未解決となることがあります。

4.4.18.1. アニメーションイベントのソート

以下の定義は、イベントキューのソートを補助するためのものです。

アニメーション時刻をタイムライン時刻に変換する手順: 時間値 time(アニメーションの開始時刻基準)について、以下を実行:

  1. time未解決なら、timeを返す。

  2. timeが無限大なら、未解決時間値を返す。

  3. アニメーションの再生速度が0なら、未解決時間値を返す。

  4. アニメーションの開始時刻未解決なら、 未解決時間値を返す。

  5. 次を計算して返す:time × (1 / playback rate) + start timeplayback ratestart timeはそれぞれアニメーションの再生速度開始時刻)。

タイムライン時刻を原点相対時刻に変換するには、時間値 time時間値と同じスケールで表現される)、タイムライン timelineについて、次の手順を実行します。

  1. timeline timeを、アニメーション時刻をタイムライン時刻に変換する手順でtimeを変換した結果とする。

  2. timeline time未解決なら、timeを返す。

  3. アニメーションがタイムラインに関連付けられていない場合、未解決な時間値を返す。

  4. アニメーションが非アクティブタイムラインに関連付けられている場合、未解決な時間値を返す。

  5. 関連タイムラインにタイムライン時刻をオリジン基準時刻に変換する手順がない場合、未解決時間値を返す。

  6. 関連タイムラインの定義された手順でtimeline timeをオリジン基準時刻に変換した結果を返す。

4.4.18.2. アニメーション再生イベント

アニメーションの再生中に、状態の変化はアニメーション再生イベントによって報告されます。

アニメーション再生イベントはタイミングモデルのプロパティです。そのため、アニメーション関連効果が存在しない場合や目に見える結果がない場合でも、イベントはディスパッチされます。

4.4.18.3. アニメーション再生イベントの種類
finish

アニメーションがfinished再生状態になったときにキューされます。

cancel

アニメーションが他の状態からidle再生状態になったときにキューされます。新たなアニメーションが最初からidleの場合はcancelイベントは生成されません。

remove

アニメーションが自動的に削除されたときにキューされます。 詳細は§ 5.5 アニメーションの置換参照。

4.5. アニメーション効果

アニメーション効果は、タイミング階層内の項目を指す抽象的な用語です。

4.5.1. アニメーション効果とアニメーションの関係

アニメーション関連効果(設定されていれば)は、アニメーション効果の一種です。 関連効果は、そのアニメーション関連付けられていると言います。 ある時点では、アニメーション効果は最大で1つのアニメーションにのみ関連付けられます。

アニメーション効果effectは、timeline関連付けられていると言えるのは、effectアニメーションに関連付けられていて、そのアニメーションがtimelineに関連付けられている場合です。

4.5.2. アニメーション効果の種類

この仕様では、キーフレーム効果という1種類のアニメーション効果のみを定義しています。 今後の仕様レベルでさらに多様なアニメーション効果が定義されます。

すべてのアニメーション効果は、以下のセクションで説明する共通プロパティを持ちます。

4.5.3. アクティブ区間

アニメーション効果が実行される期間をアクティブ区間と呼びます。 各アニメーション効果はこの区間を1つだけ持ちます。

アクティブ区間の下限は、通常はこのアニメーション効果に関連付けられたアニメーション開始時刻に対応しますが、アニメーション効果開始遅延によってシフトする場合があります。

区間の上限はアクティブ期間によって決まります。

開始時刻開始遅延アクティブ期間の関係は下図で説明します。

開始遅延がアクティブ区間の端点に与える影響例
開始遅延アクティブ区間の端点に与える影響の例。
(a) 遅延なしのアニメーション効果:開始時刻アクティブ区間の始端は一致。
(b) 正の遅延がある場合:アクティブ区間の始端は遅延分だけ後ろ倒し。
(c) 負の遅延がある場合:アクティブ区間の始端は遅延分だけ前倒し。

終了遅延も指定可能ですが、主にアニメーションのシーケンス制御時に使われます。

アニメーション効果は、アクティブ区間を定義します。この区間は、効果がその効果を生むようにスケジュールされている期間であり、アクティブ区間外で適用される塗りつぶしモードは例外です。

アクティブ区間の下限は開始遅延で定義されます。

開始遅延は、アニメーション効果が関連付けられたアニメーション開始時刻からの符号付きオフセットです。

アクティブ区間の長さはアクティブ期間と呼ばれ、計算方法は§ 4.8.2 アクティブ期間の計算で定義されています。

開始遅延に似て、アニメーション効果には 終了遅延もあり、主に他のアニメーション効果終了時刻基準でシーケンス制御する際に使われます。 これは通常シーケンス効果(今後の仕様で導入)と組み合わせてのみ有効ですが、SVGのmin属性([SVG11]第19章)表現の目的でここに含まれます。

終了時刻は、アニメーション効果に対しmax(開始遅延 + アクティブ期間 + 終了遅延, 0)で評価されます。

4.5.4. ローカル時刻

ローカル時刻は、ある時点のアニメーション効果について、以下から最初に一致する条件で決まります:

アニメーション効果アニメーションに関連付けられている場合

ローカル時刻は関連アニメーション現在時刻です。

それ以外の場合

ローカル時刻は未解決です。

4.5.5. アニメーション効果のフェーズと状態

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

ある時点で、アニメーション効果は3つのフェーズのいずれかにあります。 アニメーション効果ローカル時刻未解決で持つ場合、いずれのフェーズにも属しません。

フェーズの違いは下図で示します。

アニメーション効果のフェーズと状態の例
アニメーション効果のフェーズと状態の例

フェーズの種類:

前フェーズ

アニメーション効果ローカル時刻アクティブ区間終了時刻よりも前、または負の開始遅延期間中。

アクティブフェーズ

アニメーション効果ローカル時刻アクティブ区間内かつ負の開始遅延や負の終了遅延期間外。

後フェーズ

アニメーション効果ローカル時刻アクティブ区間以降、または負の終了遅延により先に終了時刻に到達した場合。ただし負の開始遅延期間中は除く。

これらのフェーズに加えて、アニメーション効果は複数の重複する状態にも分類できます。 状態は1フレームだけ確立され、主にモデルの静的部分記述のために使われます。

これらの状態とモデル内での使い方の概要:

再生中

各フレームでアクティブ時刻が変化するアニメーション効果に対応。

現在

再生中、または現在のアニメーション再生速度次第で今後再生中になる可能性があるアニメーション効果に対応。

効果中

解決済みのアクティブ時刻を持つアニメーション効果に対応。 これはアニメーション効果アクティブフェーズにある場合や、アクティブフェーズ外でも塗りつぶしモード§ 4.6 塗りつぶし挙動参照)によりアクティブ時刻が解決される場合。 効果中アニメーション効果のみがターゲットに結果を適用します。

これらの状態の規範的定義は後述します。

アニメーション効果のフェーズ判定には以下の定義が必要です:

アニメーション方向

効果がアニメーションに関連付けられていて、関連アニメーション再生速度が0未満なら"逆方向"、それ以外は"順方向"。

アクティブ前境界時刻

max(min(開始遅延, 終了時刻), 0)

アクティブ後境界時刻

max(min(開始遅延 + アクティブ期間, 終了時刻), 0)

アニメーション効果は、前フェーズにあるのは、効果のローカル時刻未解決でなく、かつ以下いずれかの条件を満たす場合:

  1. ローカル時刻アクティブ前境界時刻未満、または

  2. アニメーション方向が"逆方向"で、ローカル時刻アクティブ前境界時刻と等しい場合。

アニメーション効果は、後フェーズにあるのは、効果のローカル時刻未解決でなく、かつ以下いずれかの条件を満たす場合:

  1. ローカル時刻アクティブ後境界時刻より大きい、または

  2. アニメーション方向が"順方向"で、ローカル時刻アクティブ後境界時刻と等しい場合。

アニメーション効果は、アクティブフェーズにあるのは、効果のローカル時刻未解決でなく、かつ前フェーズでも後フェーズでもない場合です。

さらに、上記いずれのフェーズにも属さない場合をアイドルフェーズと呼ぶことがあります。

アニメーション効果は、再生中であるのは、以下すべての条件が真の場合です:

  1. アニメーション効果アクティブフェーズにあり、かつ

  2. アニメーション効果アニメーションに関連付けられていて、しかもそのアニメーションが完了状態ではない。

アニメーション効果は、現在であるのは、以下いずれかの条件が真の場合です:

アニメーション効果は、効果中であるのは、アクティブ時刻§ 4.8.3.1 アクティブ時刻の計算参照)が未解決でない場合です。

4.5.6. 関連アニメーション

アニメーションアニメーション効果関連に基づいて関連すると定義できます。

アニメーション関連となる条件:

関連アニメーションは、要素または疑似要素targetについて、アニメーションのうち、そのアニメーションに含まれるアニメーション効果効果ターゲットtargetであるものの集合です。

サブツリーの関連アニメーションは、要素・疑似要素・documentshadow roottarget)について、アニメーションのうち、そのアニメーションに含まれるアニメーション効果効果ターゲットが、target包含的子孫(またはtargetdocumentshadow rootの場合は子孫)や、そうした子孫の疑似要素であるものの集合です。

4.6. 塗りつぶし挙動

アニメーション効果再生中でないときの効果は、その塗りつぶしモードによって決まります。

塗りつぶしモードの種類は以下の通りです:

これらモードの規範的定義は、アクティブ時刻の計算(§ 4.8.3.1 アクティブ時刻の計算)に組み込まれています。

著者は塗りつぶしモードを使って、効果が無期限に適用されるアニメーションを作ることは推奨されません。塗りつぶしモードは、CSSアニメーションで定義されるanimation-fill-modeプロパティを表現するために導入されました([CSS-ANIMATIONS-1])。 しかしこれにより、アニメーション状態が無限に蓄積される状況が生じ、§ 5.5 アニメーションの置換で定義されるアニメーションの自動削除が必要になります。 さらに、無期限に塗りつぶしされるアニメーションは、すべてのアニメーションが完了した後も、アニメーションスタイルがCSSカスケード内で優先されるため、指定スタイルの変更が長期間反映されなくなる場合があります([css-cascade-3])。

可能であれば、著者はアニメーションの最終状態を直接指定スタイルで設定することを推奨します。 これはアニメーションが完了するのを待ってからスタイルを更新することで実現できます。例:

// 次のアニメーションが完了した直後の最初のフレームで、`finished` promiseのコールバックは
// スタイル更新前に実行されるため、ちらつきません。
elem.animate({ transform: 'translateY(100px)' }, 200).finished.then(() => {
  elem.style.transform = 'translateY(100px)';
});

あるいは、アニメーション開始時に指定スタイルを設定し、元の値からアニメーションすることもできます。例:

elem.style.transform = 'translateY(100px)';
elem.animate({ transform: 'none', offset: 0 }, 200);

複数アニメーションを重ねる複雑な効果の場合、最終値を記録するため一時的にforwards塗りつぶしモードを使うことが必要な場合があります。 例:

elem.addEventListener('click', async evt => {
  const animation = elem.animate(
    { transform: `translate(${evt.clientX}px, ${evt.clientY}px)` },
    { duration: 800, fill: 'forwards' }
  );
  await animation.finished;
  // commitStylesは`animation`までのスタイルを記録し、elemの指定スタイルを更新します。
  animation.commitStyles();
  animation.cancel();
});

4.6.1. 塗りつぶしモード

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

塗りつぶしモードの効果は次の通りです:

none

アニメーション効果が再生中でない場合、何の効果もありません。

forwards

アニメーション効果が後フェーズにある場合、 スケジュール上最後に再生中だった瞬間と同じ反復進行度値を生成します。

その他の再生中でない時は効果がありません。

backwards

アニメーション効果が前フェーズにある場合、 スケジュール上最初に再生中になる瞬間と同じ反復進行度値を生成します。

その他の再生中でない時は効果がありません。

both

アニメーション効果が前フェーズにある場合はbackwards塗りつぶし挙動が使われます。

アニメーション効果が後フェーズにある場合はforwards塗りつぶし挙動が使われます。

これら塗りつぶしモードの例を以下に示します。

各種塗りつぶしモードと生成される状態の例。
各種塗りつぶしモードと生成される状態の例。
(a) fill mode "none"。アクティブフェーズ外では効果なし。
(b) fill mode "forwards"。アクティブフェーズ終了後も反復進行度値が維持される。
(c) fill mode "backwards"。アクティブフェーズ開始まで塗りつぶし値が生成される。
(d) fill mode "both"。アクティブフェーズ前後で塗りつぶし値が生成される。

注: 塗りつぶしモードの設定はアクティブ区間の端点やフェーズ間境界には影響しません。 ただし塗りつぶしモードはタイミングモデルの他のプロパティに影響します。なぜならアクティブ時刻は、 アニメーション効果がアクティブフェーズまたは塗りつぶしが適用される場合のみ定義される(未解決でない)ためです。

4.7. 反復

4.7.1. 反復区間

アニメーション効果が一定回数または無限に繰り返すよう指定することができます。 この反復はアクティブ区間で行われます。 1回の反復が行われる時間領域を反復区間と呼びます。

アクティブ区間とは異なり、アニメーション効果は複数の反復区間を持つことができますが、通常は現在の反復に対応する区間のみが重要です。

1回の反復の長さは反復期間と呼ばれます。 アニメーション効果の初期反復期間は0です。

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

反復期間アクティブ期間を比較すると:

反復期間

アニメーション効果が1回反復するのにかかる時間。

アクティブ期間

全アニメーション効果が完了するまでの時間(反復も含む)。 これは反復期間より長い場合も短い場合もあります。

反復期間アクティブ期間の関係は下図で説明します。

反復期間とアクティブ時間の比較。
反復回数2.5のアニメーション効果における反復期間アクティブ期間の比較。 最後の反復の反復期間は変化せず、単にアクティブ期間で途中で切られるだけです。

4.7.2. 反復の制御

アニメーション効果が繰り返す回数は反復回数と呼ばれます。 反復回数は0以上の実数です。 反復回数が正の無限大の場合、アニメーション効果は無限に繰り返されます。

反復回数に加え、アニメーション効果には反復開始プロパティもあり、アニメーション効果が始まる反復系列内のオフセットを指定します。 反復開始は0以上の有限実数です。

これらパラメータの挙動は§ 4.8 コアアニメーション効果計算で定義されています。

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

反復回数反復開始パラメータの効果は下図で示します。

反復回数と反復開始パラメータの効果。
反復回数反復開始パラメータの効果。
最初の例では反復回数が2.5で、3回目の反復が途中で反復区間で切られます。
2番目の例では反復開始が0.5で、最初の反復の途中からアニメーション効果が始まります。

反復回数パラメータとは異なり、反復開始パラメータはアクティブ期間の長さには影響しません。

反復開始が1以上の場合、アニメーション効果iteration composite operationaccumulateを指定している場合以外は、一般に有用ではありません。

4.7.3. 反復時空間

この節は非規範的です

Web Animationsでは、すべての時刻は何らかの基準点に対して相対的です。 これら異なる基準点によって、異なる時空間が生じます。

これはコンピュータグラフィックスで使われる座標空間と比較できます。 時空間のゼロ時刻は、座標空間の原点に相当します。

繰り返されるアニメーションについては、アニメーションが繰り返されるごとに新しい時空間が確立されると説明できます。それが反復時空間です。

反復時空間とは、アニメーション効果の現在の反復の開始がゼロ時刻となる時空間です。

Web Animationsモデル内では、アクティブ時刻についても言及します。これはアクティブ区間の開始に対して相対的な時刻です。 ただし、この時空間はモデル内部でのみ使用され、プログラミングインターフェースやマークアップには公開されません。

これらの時空間を下図に示します。

A comparison of local time, active time, and iteration time.
ローカル時刻、アクティブ時刻、反復時刻の比較(反復期間1秒、反復回数2.5のアニメーションの場合)

注: 時空間自体には境界はありませんが、Web Animationsではアクティブ時刻反復進行度が、図に示されるように一定範囲に制限されます。 例えば、アクティブ時空間で-1秒という時刻は有効ですが、アクティブ時刻の計算法(§ 4.8.3.1 アクティブ時刻の計算)では負の値が返されることはありません。

これら以外にも、ドキュメント時空間についても言及できます。これは、時間値デフォルトドキュメントタイムライン上で表される時空間であり、Document現在のグローバルオブジェクトに属します。

4.7.4. 区間タイミング

この節は非規範的です

アニメーション効果が繰り返されるとき、反復の境界での動作を定義する必要があります。 これには、そしてすべての区間タイミングについて、Web Animationsは端点排他的なタイミングモデルを採用しています。 これは、区間の開始時刻は区間に含まれ、終了時刻は含まれないことを意味します。 区間表記では[開始, 終了)と書きます。 このモデルによって、区間を繰り返したり並べた場合でも区間同士が重複しません。

以下の例では、繰り返し効果においてローカル時刻1秒の時、反復時刻は0となります。 シーケンスされたアニメーションでは、タイムライン時刻1秒の時、アニメーションBの関連効果のみが再生中であり、重複はありません。

Illustration of end-point exclusive timing.
端点排他的タイミングの図。繰り返し・シーケンス効果いずれも、区間の境界で重複しません。

この動作の例外として、塗り(fill)を行う場合、塗りが区間の端点で始まるときはその端点が使用されます。 この動作は§ 4.8.3.3 単純反復進行度の計算のアルゴリズムから導かれ、下図で示されます。

Effect of iterations and fill on iteration time.
1回目の反復後、反復進行度は0ですが、2回目以降は反復進行度が1となります。これはアニメーション効果が塗りを行う際の特別な動作によるものです。

4.8. コアアニメーション効果の計算

4.8.1. 概要

この節は非規範的です

Web Animationsのタイミングモデルの中心は、ローカル時刻値を反復進行度に変換する処理です。

この処理の第一段階は、アクティブ区間の境界を計算することです。これはアクティブ持続時間によって決まります。

この処理を下図に示します。

Calculation of the active duration.
アクティブ持続時間の計算は、反復期間反復回数を掛け合わせることに基づいています。

アクティブ持続時間の計算法は、§ 4.8.2 アクティブ持続時間の計算で現行標準的に定義されています。

アクティブ持続時間が確定したら、アニメーション効果ローカル時刻変換済み進行度反復進行度)に変換する処理が下図で示されます。

An overview of timing model calculations.
タイミングモデル計算の概要
(1) ローカル時刻は関連アニメーションから決定されます。
(2) ローカル時刻アクティブ時刻に変換されます。この際、開始遅延を考慮します。
(3) アクティブ時刻反復期間で割り、さらに反復開始プロパティも考慮して全体進行度を算出します。
(4) 全体進行度時刻は、1回の反復内のオフセットに変換されます。これが単純反復進行度です。
(5) 単純反復進行度は、再生方向を考慮して指向性進行度に変換されます。
(6) 最後に、タイミング関数が指向性進行度に適用され、変換済み進行度が得られます。

最初のステップであるローカル時刻の計算は、§ 4.5.4 ローカル時刻で説明されています。 図のステップ2〜4は次節以降で説明します。 ステップ5と6は、§ 4.9.1 指向性進行度の計算および§ 4.10.1 変換済み進行度の計算で説明されています。

4.8.2. アクティブ持続時間の計算

アクティブ持続時間は次のように計算します:

アクティブ持続時間 = 反復期間 × 反復回数

反復期間または反復回数のいずれかが0の場合、アクティブ持続時間は0となります。

この明確化は、IEEE 754-2008において無限大とゼロの乗算結果が未定義であるため必要です。

4.8.3. ローカル時刻の変換

4.8.3.1. アクティブ時刻の計算

アクティブ時刻は、ローカル時刻開始遅延に基づきます。 ただし、これはアニメーション効果が出力を生成すべき場合のみ定義され、そのため塗りモードやフェーズによって以下のように決まります:

アニメーション効果がbeforeフェーズの場合

結果は次の条件のうち最初に一致したものに依存します:

塗りモードbackwardsまたはbothの場合

max(ローカル時刻 - 開始遅延, 0)の評価結果を返します。

それ以外の場合

未解決時間値を返します。

アニメーション効果がactiveフェーズの場合

ローカル時刻 - 開始遅延の評価結果を返します。

アニメーション効果がafterフェーズの場合

結果は次の条件のうち最初に一致したものに依存します:

塗りモードforwardsまたはbothの場合

max(min(ローカル時刻 - 開始遅延, アクティブ持続時間), 0)の評価結果を返します。

それ以外の場合

未解決時間値を返します。

それ以外(ローカル時刻未解決の場合)

未解決時間値を返します。

4.8.3.2. 全体進行度の計算

全体進行度は、完了した反復回数(部分反復も含む)を示し、以下のように定義されます:

  1. アクティブ時刻未解決の場合、未解決を返します。

  2. 以下の条件のうち最初に一致したものに基づいて、overall progressの初期値を計算します:

    反復期間が0の場合

    アニメーション効果がbeforeフェーズであれば、overall progressは0とし、それ以外の場合は反復回数とします。

    それ以外の場合

    overall progressアクティブ時刻 / 反復期間 の計算結果とします。

  3. overall progress + 反復開始 の計算結果を返します。

4.8.3.3. 単純反復進行度の計算

単純反復進行度は、現在の反復内での進行度の割合であり、再生方向や効果に適用されるタイミング関数による時刻変換を無視し、以下のように計算されます:

  1. 全体進行度未解決の場合、 未解決を返します。

  2. 全体進行度が無限大の場合、simple iteration progress反復開始 % 1.0 とし、それ以外の場合は 全体進行度 % 1.0 とします。

  3. 以下のすべての条件が真の場合:

    simple iteration progressは1.0とします。

    上記の手順により、アニメーションのアクティブ区間が反復の終了点と一致した場合、次の反復の開始ではなく最終反復の端点を保持して塗りを行う動作が実現されます。

    最後の条件は、反復回数が0でアニメーションが1度も再生されていない場合にこの動作が適用されないようにします。

  4. simple iteration progressを返します。

4.8.4. 現在の反復の計算

現在の反復は、以下の手順で計算できます:

  1. アクティブ時刻未解決の場合、未解決を返します。

  2. アニメーション効果がafterフェーズ かつ 反復回数 が無限大の場合、無限大を返します。

  3. 単純反復進行度が1.0の場合、 floor(全体進行度) - 1 を返します。

  4. それ以外の場合、 floor(全体進行度) を返します。

4.9. 方向制御

アニメーション効果は、方向制御によって反復ごとに異なる方向で再生するよう設定できます。 このために、アニメーション効果には再生方向パラメータがあり、次のいずれかの値を取ります:

これらの値の意味は、後述する指向性進行度の計算に組み込まれています。

この節は非規範的です

これらの値の非規範的な定義は以下の通りです:

normal

すべての反復は指定通りに再生されます。

reverse

すべての反復は指定された方向と逆に再生されます。

alternate

偶数回の反復は指定通り、奇数回の反復は指定された方向と逆に再生されます。

alternate-reverse

偶数回の反復は指定された方向と逆に、奇数回の反復は指定通りに再生されます。

4.9.1. 指向性進行度の計算

指向性進行度は、単純反復進行度から以下の手順で計算されます:

  1. 単純反復進行度未解決の場合、未解決を返します。

  2. 以下のリストから最初に一致した条件に基づいて、current directionを計算します:

    再生方向normalの場合

    current directionはforwardsとします。

    再生方向reverseの場合

    current directionはreverseとします。

    それ以外の場合
    1. d現在の反復とします。

    2. 再生方向alternate-reverseの場合、dを1増やします。

    3. d % 2 == 0であればcurrent directionはforwards、それ以外ならreverseとします。 dが無限大の場合はcurrent directionはforwardsとします。

  3. current directionがforwardsなら単純反復進行度を返します。

    それ以外の場合は 1.0 - 単純反復進行度 を返します。

4.10. 時刻変換

アニメーション効果の進行速度を制御したいことは多くあります。 例えば、アニメーションの速度をイージングすることで、動きに勢いを持たせ、より自然な効果が得られます。 CSS Easing Functions Module [CSS-EASING-1] は、この目的のためのタイミング関数を定義しています。

アニメーション効果には 1つのタイミング関数が関連付けられています。 デフォルトのタイミング関数線形タイミング関数です。

4.10.1. 変換済み進行度の計算

変換済み進行度は、指向性進行度から以下の手順で計算します:

  1. 指向性進行度未解決の場合、 未解決を返します。

  2. before flagの値を次のように計算します:

    1. § 4.9.1 指向性進行度の計算で定義された手順に従い、current directionを決定します。

    2. current directionforwardsの場合、 going forwardsはtrue、それ以外はfalseとします。

    3. アニメーション効果がbeforeフェーズかつgoing forwardsがtrue、 またはアニメーション効果がafterフェーズかつgoing forwardsがfalseのとき、 before flagをセットします。

  3. アニメーション効果タイミング関数に、指向性進行度入力進行度値として、before flagbefore flagとして渡した評価結果を返します。

4.11. 反復進行度

反復進行度は、アニメーション効果変換済み進行度そのものです。

5. アニメーションモデル

この節は非規範的です

いくつかのアニメーション効果について、Web Animationsのアニメーションモデルタイミングモデルから得られた反復進行度現在の反復の値を使って 対応する出力を計算します。

そのアニメーション効果ごとの出力は、効果スタックで他の出力と組み合わせて ターゲットプロパティに適用されます(§ 5.4 効果の合成参照)。

5.1. 概要

アニメーション効果は、タイミング出力の変化に応じて影響を与えるゼロ個以上の関連プロパティを持ちます。これらのプロパティは効果のターゲットプロパティと呼ばれます。

反復進行度現在の反復基底値が与えられると、アニメーション効果は、 各アニメーション可能ターゲットプロパティについて、 そのプロパティに適したアニメーション型の手順を適用して 効果値を生成します。

5.2. プロパティのアニメーション

特に指定がない限り、すべてのCSSプロパティはアニメーション可能です。 プロパティ値の合成方法は、各プロパティの定義テーブルにあるアニメーション型行によって定義されます:

アニメーション不可
このプロパティはアニメーション不可です。 アニメーションキーフレームにリストされても処理されず、 トランジションにも影響を受けません。

注: プロパティがアニメーションから除外される理由は、アニメーションすると過度に複雑になる場合が多いためです。 例えば、アニメーションパラメータを定義するプロパティはアニメーション不可ですが、 これは複雑な再帰動作を生むためです。

注: アニメーション効果アニメーション不可なプロパティのみをターゲットにしていても、 アニメーション効果としての通常の動作(イベント発火やアニメーション現行標準終了プロミスの履行遅延など)は保持されます。

離散
このプロパティ値は意味のある合成ができません。 したがって加法不可であり、補間VaからVbへ50%(p=0.5)で切り替わります。 すなわち
V result = V start if p < 0.5 V end if p 0.5
算出値ごと
対応する個々の算出値成分を、 その値型に応じた手順(補間・加算・累積)で合成します (CSS Values 4 § 3 値の合成:補間、加算、累積参照)。 成分数や型が一致しない場合、 または任意の成分値が離散アニメーションであり、値が一致しない場合は、 プロパティ値は離散として合成されます。
繰り返し可能リスト
算出値ごとと同様ですが、 2つのリストのアイテム数が異なる場合は、最小公倍数まで繰り返してから合成します。 各アイテムは算出値ごとで合成されます。 合成できない値のペアや、任意の成分値が離散アニメーションの場合は、 プロパティ値は離散として合成されます。

注: 繰り返し可能リストの概念により、リストが概念的に指定長まで繰り返される場合 (background-originbackground-imageリストの長さまで繰り返される) または無限に繰り返される場合でも、任意の値間でスムーズに遷移でき、 算出値が正しく結果を表し(継承も正しく行われる可能性があります)、となります。

(本文参照)
上記以外の特殊な補間動作を持つプロパティについては、個別にアニメーション動作が明示的に指定されます。

アニメーション型がプロパティ定義にまだ含まれていないプロパティのアニメーション型は、付録A:既存プロパティのアニメーション型で定義されています。

5.2.1. カスタムプロパティ

カスタムプロパティが、registerProperty()メソッドによって現在のグローバルオブジェクトに登録されている場合、 アニメーション型は、プロパティの算出値ごとであり、 プロパティの構文定義で使用される型から導出されます。 プロパティの指定された構文に対応する算出値型が存在しない場合 (例えば、構文がユニバーサル構文定義の場合)や、 カスタムプロパティが登録されていない場合は、 アニメーション型離散となります。

5.3. キーフレーム効果

キーフレーム効果とは、タイミングモデルの出力を利用して、要素や疑似要素::before::afterなど[select])のCSSプロパティを更新するアニメーション効果の一種であり、 これらは効果ターゲットと呼びます。

効果ターゲットは、 Elementであるターゲット要素と、疑似要素セレクターであるターゲット疑似セレクターから構成されます。 効果ターゲットElementであれば、 ターゲット要素はその要素で、 ターゲット疑似セレクターnullとなります。 効果ターゲット疑似要素であれば、 ターゲット要素はその発生要素であり、 ターゲット疑似セレクターはその疑似要素を特定するために必要なものとなります。

この方法で指定されたすべての効果ターゲット(例えば::part()疑似要素や非対応疑似要素など)が算出プロパティ値を持つとは限らないことに注意してください。

5.3.1. キーフレーム

効果値キーフレーム効果について、 分数オフセット位置に配置された一連のプロパティ値間を補間することで計算されます。 各オフセットでインデックス付けされたプロパティ値の集合をキーフレームと呼びます。

キーフレームのオフセットは[0, 1]の範囲にある値、もしくは特別な値nullです。 キーフレームのリストはキーフレーム効果ごとに オフセット順にゆるくソートされている必要があります。これは、nullでないキーフレームのオフセットを持つ各キーフレームについて、そのオフセットが直前のnullでないキーフレームのオフセット以上でなければならないことを意味します。

キーフレームが重複したり非対応値を持つ場合の動作は、§ 5.3.4 キーフレーム効果の効果値で定義されています。

各キーフレームには、指定されたキーフレームとリスト内ののキーフレーム間の期間に適用されるタイミング関数が関連付けられています。 リスト内の最後のキーフレームに指定されたタイミング関数は決して適用されません。

キーフレームは、キーフレーム固有合成操作を持つ場合があり、設定されていればそのキーフレームで指定されたすべての値に適用されます。 操作の種類と意味は、キーフレーム効果全体に関連付けられる合成操作と同じであり、§ 5.4.4 効果合成で定義されています。 キーフレーム固有合成操作が未設定の場合は、そのキーフレームに指定された値には合成操作が用いられます。

5.3.2. プロパティ値の算出

プロパティproperty、値valueElement elementが与えられたとき、プロパティ値を算出するには: propertyの定義テーブルの「算出値」行に従ってvalueを解決し、依存関係を解決するためのコンテキストとしてelement算出値を使用し、その結果を返します。

注: element上の算出値は、このアルゴリズムで影響を受けません。

このアルゴリズムは、キーフレームで指定されたプロパティ値が順序依存性を確立できることを意味します。 プロパティ値を算出する場合、valueが持つ依存関係の算出値先に計算されなければなりません。

var animation = elem.animate([{ fontSize: '10px', width: '10em' },
                              { fontSize: '20px', width: '20em' }], 1000);
animation.currentTime = 500;
console.log(getComputedStyle(elem).fontSize); // Should be 15px
console.log(getComputedStyle(elem).width); // Should be 225px

この例では、10emプロパティ値を算出するには、 算出値としてfont-sizeターゲット要素上で知る必要があります。これは効果値としてfont-sizeに決定され、そのためにはfont-sizeのプロパティ値も算出しなければなりません。 よって、プロパティ値の算出には順序制約が伴います。

5.3.3. 算出キーフレームの計算

キーフレーム効果効果値を計算する前に、 そのキーフレーム上のプロパティ値は算出され、nullのキーフレームのオフセットには使用するオフセットが算出されます。この解決結果が算出キーフレームです。

適切な値が割り当てられたnullのキーフレームのオフセットを含むキーフレームの集合の算出キーフレームのオフセットは、算出キーフレームオフセットと呼びます。

算出キーフレームオフセットを生成するため、キーフレームの列keyframesを受け取る欠損キーフレームオフセットの算出手順を定義し、以下の手順を実行します:

  1. keyframes内の各キーフレームについて、 そのキーフレーム算出キーフレームオフセットを、もとのキーフレームのオフセット値と同じにします。

  2. keyframesに複数のキーフレームがあり、最初のキーフレーム算出キーフレームオフセットがnullの場合、 最初の算出キーフレームオフセットを0に設定します。

  3. 最後のキーフレーム算出キーフレームオフセットがnullの場合、その算出キーフレームオフセットを1に設定します。

  4. 各ペアのキーフレームABについて:

    ABの間にある各キーフレーム算出キーフレームオフセットを以下のように計算します:

    1. offsetkを、算出キーフレームオフセットkの値とします。

    2. nを、ABを含む間のキーフレーム数から1を引いた値とします。

    3. keyframeAの直後ならindexは1、というように、AB間のキーフレーム列におけるkeyframeの位置をindexとします。

    4. keyframe算出キーフレームオフセットoffsetA + (offsetBoffsetA) × index / nとします。

算出キーフレームは以下の手順で生成します。 この手順は、算出プロパティ値が計算可能なキーフレーム効果効果ターゲットにのみ実施されることに注意してください。

  1. computed keyframesを空のキーフレームのリストとします。

  2. このキーフレーム効果に指定されたキーフレームのリストの各keyframeについて、以下の手順を実行します:

    1. 新しい空のキーフレームcomputed keyframecomputed keyframesに追加します。

    2. keyframeで指定された各プロパティについて:

      例えば、keyframeborder-widthプロパティ値が"12pt"の場合、ユーザーエージェントは、ロングハンドプロパティであるborder-bottom-widthborder-left-widthborder-right-widthborder-top-widthそれぞれについて"16px"の算出値を算出できます。 その結果、computed keyframeにはborder-widthの値は含まれず、 代わりに各ロングハンドプロパティとその値"16px"が含まれることとなります。

      ショートハンドプロパティの展開や論理プロパティの物理プロパティへの置換で競合が起きた場合は、以下のルールを順に適用し、解決します:

      1. ロングハンドプロパティはショートハンドプロパティより優先します(例:border-top-colorborder-topより優先)。

      2. ロングハンド成分が少ないショートハンドプロパティは多いものより優先します(例:border-topborder-colorより優先)。

      3. 物理プロパティは論理プロパティより優先します。

      4. ロングハンド成分数が同じショートハンドプロパティでは、IDL名(CSSプロパティからIDL属性へのアルゴリズム[CSSOM])のUnicodeコードポイント順で早いものが優先されます。

  3. 欠損キーフレームオフセットの算出手順をcomputed keyframesに適用します。

  4. computed keyframesを返します。

5.3.4. キーフレーム効果の効果値

キーフレーム効果ターゲットプロパティとして参照される単一プロパティの効果値は、指定されたiteration progresscurrent iterationunderlying valueに対して次の手順で計算されます。

  1. iteration progress未解決なら、この手順を中止します。

  2. target propertyを、効果値を計算するためのロングハンドプロパティとします。

  3. target propertyアニメーション型アニメーション不可なら、この手順を中止します。効果は適用できません。

  4. キーフレーム効果効果ターゲットがない場合、 または効果ターゲットで算出プロパティ値が計算できない場合、この手順を中止します。

  5. 合成の中立値を、基底値add合成操作で合成したときに基底値を生成する値と定義します。

  6. property-specific keyframesを、このキーフレーム効果に対する算出キーフレーム集合として取得します。

  7. property-specific keyframesから、target propertyのプロパティ値がないキーフレームを除外します。

  8. property-specific keyframesが空なら、underlying valueを返します。

  9. property-specific keyframes内にキーフレーム算出キーフレームオフセットが0のものがなければ、 キーフレームを新規作成し、算出キーフレームオフセットを0、プロパティ値を合成の中立値合成操作addとして、property-specific keyframesの先頭に追加します。

  10. 同様に、property-specific keyframes内にキーフレーム算出キーフレームオフセットが1のものがなければ、 キーフレームを新規作成し、算出キーフレームオフセットを1、プロパティ値を合成の中立値合成操作addとして、property-specific keyframesの末尾に追加します。

  11. interval endpointsを空のキーフレーム列とします。

  12. 以下の最初に一致した条件に従い、interval endpointsを決定します:

    iteration progress < 0 かつ キーフレーム算出キーフレームオフセット0が複数ある場合

    property-specific keyframesの最初のキーフレームinterval endpointsに追加します。

    iteration progress ≥ 1 かつ キーフレーム算出キーフレームオフセット1が複数ある場合

    property-specific keyframesの最後のキーフレームinterval endpointsに追加します。

    それ以外の場合
    1. interval endpointsに、iteration progress以下かつ1未満の算出キーフレームオフセットを持つproperty-specific keyframesの最後のキーフレームを追加します。該当がなければ(例えばiteration progressが負の場合)、算出キーフレームオフセットが0の最後のkeyframeを追加します。

    2. 前のステップで追加したkeyframeの次のproperty-specific keyframesinterval endpointsに追加します。

  13. interval endpoints内の各keyframeについて:

    1. keyframe合成操作replace以外、またはkeyframe合成操作がなく、このキーフレーム効果合成操作replace以外の場合、以下を実行します:

      1. 使用するcomposite operationkeyframe合成操作、なければこのキーフレーム効果合成操作とします。

      2. value to combinekeyframeで指定されたtarget propertyのプロパティ値とします。

      3. target propertyのプロパティ値を、underlying valueVa)とvalue to combineVb)をtarget propertyアニメーション型に対応するcomposite operation to use手順で合成した値に置き換えます。

  14. interval endpointsにキーフレームが1つだけなら、そのkeyframetarget propertyのプロパティ値を返します。

  15. start offsetinterval endpointsの最初のキーフレームの算出キーフレームオフセットとします。

  16. end offsetinterval endpointsの最後のキーフレームの算出キーフレームオフセットとします。

  17. interval distance(iteration progress - start offset) / (end offset - start offset)で評価した結果とします。

  18. transformed distanceを、interval endpointsの最初のキーフレームに関連付けられたタイミング関数interval distanceを入力進行度として渡して評価した結果とします。

  19. interval endpointsの2つのキーフレームで指定されたtarget propertyの値を、最初の値をVstart、2つ目をVendとし、transformed distanceを補間パラメータpとして、補間手順target propertyアニメーション型で定義)を適用した結果を返します。

この手順は、効果に指定されたキーフレームリストについて以下を前提としています:

これらの条件を満たすのはモデル利用者の責任です(例えば宣言的マークアップやプログラミングインターフェースなど)。

本仕様で定義されるプログラミングインターフェースの場合、これらの条件は算出キーフレーム生成手順によって満たされ、この手順への入力となります。

注: この手順ではキーフレームの重複を許容します。 重複箇所では出力値はそのオフセットで定義された最後のキーフレームの値にジャンプします。 0や1で重複したキーフレームがある場合、iteration progress値が0未満または1以上の場合の出力値は、keyframesの最初のキーフレームまたは最後のキーフレームの値となります。

算出キーフレームは「ライブ」であることに注意: ユーザーエージェントは、効果値が計算されるたびに常に算出キーフレームが再生成されるかのように振る舞わなければなりません。

例えば、font-sizeプロパティが10pxから20pxへ移行中の場合、キーフレームで1emと指定すると、キーフレーム算出時にはfont-sizeの遷移で生成される[10px, 20px]範囲の算出値が解決に使われます。

特定のタイミング関数が存在する場合、アニメーション効果への入力iteration progressは[0, 1]の範囲に限定されません。 しかし現状では、キーフレームオフセットは[0, 1]に限定され、範囲外の入力iteration progress値には単純にプロパティ値が外挿されます。

この制限を撤廃する案も検討しました。範囲外のiteration progress値で非線形なプロパティ値変化を指定したい場合が有用なケースがあるためです。 例:緑から黄へ補間するアニメーションで、オーバーシュートするタイミング関数によって一時的に黄を越えて赤まで補間し、その後黄へ戻る。

この効果はキーフレームやタイミング関数の修正で達成可能ですが、そのアプローチはタイミングとアニメーション効果の分離というモデルを崩すように思われます。

どのようにこの効果を実現すべきかは未定ですが、キーフレームオフセットを[0, 1]の外に許容すると、0や1のキーフレーム自動生成仕様と不整合になる可能性があります。

section 4 (Keyframe offsets outside [0, 1]) of minuted discussion from Tokyo 2013 F2F

<https://github.com/w3c/csswg-drafts/issues/2081>

5.4. 効果の合成

この節は非規範的です

キーフレーム効果効果値を計算した後、それらはアニメーション効果ターゲットプロパティに適用されます。

複数のin effectキーフレーム効果が同じプロパティをターゲットにすることがあるため、複数のキーフレーム効果の結果を合成する必要があります。 このプロセスは合成と呼ばれ、各ターゲットプロパティごとに効果スタックを確立することに基づいています。

合成されたキーフレーム効果の結果は、ターゲットプロパティに指定された他の値と合成されます。

下図はその構成を示します:

Overview of the application of effect values to their target properties
効果値ターゲットプロパティへの適用概要。
同じプロパティをターゲットにするキーフレーム効果の結果は効果スタックで合成されます。
合成結果はCSSカスケードに適切な位置で挿入されます。

この操作の前半(同じプロパティをターゲットにする効果値の合成)については、 どのようにキーフレーム効果同士を合成するか、 およびどの順序でそれらを適用するか(つまり相対的な合成順序)を決定する必要があります。

どのように効果値を合成するかは、対応するキーフレーム効果合成操作によって決まります。

各アニメーションプロパティの合成順序は、効果スタックで決定されます。

5.4.1. アニメーションクラス

本仕様は、他の仕様がこのモデル上にマークアップやプログラミングインターフェースを定義する際に用いる共通アニメーションモデルを提供します。あるアニメーションを生成した特定のマークアップやプログラムインターフェースが、そのアニメーションクラスを定義します。

さらなる仕様では、異なるアニメーションクラス間や特定のクラス内で、合成順序に対する特殊な挙動を定義できます。

この節は非規範的です

例えば、classが"CSS animation"のアニメーションは、 "CSS transition"のクラスより高い合成順序を持ち、クラス未指定の他のアニメーションより低い順序を持つと定義されています。

"CSS animation"オブジェクトの集合内では、animation-nameプロパティなどの要素に基づいて専門的な合成順序が定義されています。

5.4.2. 効果スタック

キーフレーム効果がターゲットとするプロパティターゲットプロパティごとに効果スタックが関連付けられます。 効果スタックは、キーフレーム効果の相対合成順序を確立します。

任意の2つのキーフレーム効果AB合成順序は、効果スタック内で以下のプロパティ比較により決定されます:

  1. アニメーション効果の関連アニメーションを、アニメーションで、アニメーション効果関連付けられているものとします。

  2. ABを、以下の条件を順に適用し順序が確定するまでソートします:

    1. AB関連アニメーションクラスが異なる場合、対応クラス間で定義されたインタークラス合成順序でソートします。

    2. まだ順序が確定しなければ、共通クラス内で定義されたクラス固有の合成順序でソートします。

    3. まだ順序が確定しなければ、関連アニメーショングローバルアニメーションリスト内の位置でソートします。

より早くソートされるアニメーション効果は、より低い合成順序を持ちます。

5.4.3. 効果スタックの結果の計算

効果スタックの最終値を計算するには、スタック内の各キーフレーム効果効果値を合成順序で合成します。

効果スタックの評価プロセスの各ステップは、入力として基底値を受け取ります。

スタック内の各キーフレーム効果について、キーフレーム効果から適切な効果値を取得し、基底値と合成して新しい値を作ります。 この値は、次のキーフレーム効果との合成時の基底値となります。

効果スタックの最終値(合成値と呼ぶ)は、スタックの最後(最も高い合成順序)のキーフレーム効果効果値とその時点の基底値を合成した結果です。

5.4.4. 効果の合成

効果値基底値の合成に使われる具体的な操作は、効果値を生成したキーフレーム効果合成操作によって決まります。

本仕様では、次の3つの合成操作を定義します:

replace

効果値基底値を合成した結果は、単純に効果値です。

add

効果値加算して基底値に合成します。 アニメーション型によっては、加算操作が可換でない場合があり、そのときの順序は 基底値 + 効果値です。

accumulate

効果値累積して基底値に合成します。 アニメーション型によっては、累積操作が可換でない場合があり、そのときの順序は基底値、次に効果値です。

5.4.5. 合成結果の適用

合成値ターゲットプロパティに適用するには、指定値をCSSカスケードに追加します。

この指定値がカスケードに追加されるレベルは、効果スタック内で最も高い合成順序の効果が関連付けられているアニメーションクラスによって決まります。 デフォルトでは、指定値はカスケードの「アニメーション宣言」レベルに追加されます([css-cascade-3])。

この節は非規範的です

例えば、最も高い合成順序の効果が"CSS transition"クラスのアニメーションに関連付けられている場合、合成値はカスケードの「トランジション宣言」レベルに追加されます。

CSSのターゲットプロパティに対して計算された合成値は、次の手順で適用されます。

  1. プロパティのbase valueを、アニメーションがない場合にそのプロパティの算出値を計算した結果値とします。

  2. プロパティの効果スタックを確立します(§ 5.4.2 効果スタック参照)。

  3. プロパティのbase valueを初期基底値として効果スタック合成値を計算します(§ 5.4.3 効果スタックの結果の計算参照)。

  4. 確立されたターゲットプロパティの効果スタックの先頭の効果に関連付けられているアニメーションクラスで定義されたレベルに合成値をCSSカスケードに挿入します。

5.5. アニメーションの置換

この節は非規範的です

本仕様で定義されるプログラミングインターフェースを使用すると、要素のアニメーションスタイルに無限に新しいアニメーションを繰り返し追加することができます。

例えば、以下のコードを考えてみましょう:

elem.addEventListener('mousemove', evt => {
  circle.animate(
    { transform: `translate(${evt.clientX}px, ${evt.clientY}px)` },
    { duration: 500, fill: 'forwards' }
  );
});

これはマウスが動くたびに新しいforwards fillアニメーションを生成し、すぐに何百、何千ものforwards fillアニメーションが作られます。

ユーザーエージェントがすべてのアニメーションを保持しなければならない場合、アニメーションリストが際限なく増加し、メモリリークを引き起こします。

この節では、上書きされたアニメーションが明示的な保持要求がない限り自動的に削除されるメカニズムを定義します。

5.5.1. 置換状態

アニメーションは、次の値のいずれかを持つ置換状態を保持します:

アニメーション置換状態の初期値はactiveです。

アニメーション置換状態removedの場合、そのアニメーション効果ターゲットプロパティ効果スタックに含まれません。

5.5.2. 置換されたアニメーションの削除

すべての次の条件を満たす場合、アニメーション置換可能です:

Document doc置換されたアニメーションの削除を求められた場合、すべてのアニメーションanimationについて、下記の条件を満たすものに対して:

以下の手順を実行します:

  1. animation置換状態removedに設定します。

  2. イベントを生成し、AnimationPlaybackEvent removeEventとします。

  3. removeEventtype属性をremoveに設定します。

  4. removeEventcurrentTime属性を、animation現在時刻に設定します。

  5. removeEventtimelineTime属性を、animationが関連付けられているタイムラインの現在時刻に設定します。

  6. animationタイミング用ドキュメントを持つ場合は、removeEventをそのタイミング用ドキュメント保留アニメーションイベントキューに、ターゲットanimationとともに追加します。 イベント予定時刻には、animationが関連付けられているタイムラインの現在時刻タイムライン時刻を原点相対時刻へ変換手順を適用した結果を使用します。

    それ以外の場合は、タスクをキューし、removeEventをanimationでdispatchします。 このタスクのタスクソースはDOM操作タスクソースです。

5.6. アニメーションの副作用

少なくとも1つのアニメーション効果によってターゲットとされ、かつcurrentまたはin effectであり、 そのアニメーション置換状態removedないすべてのプロパティについて、 ユーザーエージェントはwill-changeプロパティ([css-will-change-1])が効果ターゲット上でそのプロパティを含んでいるかのように振る舞わなければなりません。

この節は非規範的です

上記要件の結果として、たとえばアニメーションが要素のtransformプロパティをターゲットにする場合、 スタッキングコンテキスト効果ターゲットに作成されます。 これはアニメーションbeforeフェーズactiveフェーズ、 または塗りモードが"forwards"または"both"の場合はafterフェーズである間、有効です。

6. プログラミングインターフェース

この節は非規範的です

上記の抽象モデルに加え、Web Animationsはこのモデルへのプログラミングインターフェースも定義します。 このインターフェースは宣言的手段で生成されたアニメーションの検査・拡張や、手続き的手法が適している場合に直接アニメーションを生成するために使用できます。

6.1. プログラミングインターフェースにおける時間値

時間値はプログラミングインターフェースでは double型で表されます。未解決の時間値は null値で表現されます。

6.2. AnimationTimelineインターフェース

タイムラインは、Web Animations APIではAnimationTimeline インターフェースで表現されます。

[Exposed=Window]
interface AnimationTimeline {
    readonly attribute double? currentTime;
};
currentTime, double, 読み取り専用, null許容

このタイムラインの現在時刻を返します。 タイムラインが非アクティブの場合はnullを返します。

6.3. DocumentTimelineインターフェース

ドキュメントタイムラインデフォルトドキュメントタイムラインを含む)は、Web Animations APIではDocumentTimeline インターフェースで表現されます。

dictionary DocumentTimelineOptions {
  DOMHighResTimeStamp originTime = 0;
};

[Exposed=Window]
interface DocumentTimeline : AnimationTimeline {
  constructor(optional DocumentTimelineOptions options = {});
};
originTime, DOMHighResTimeStamp, デフォルト値0

タイムラインの原点時刻を、時刻原点からの実数ミリ秒で指定します。

DocumentTimeline (options)

新しいDocumentTimelineを作成します。 タイムラインが関連付けられるDocumentは、 Documentであり、 関連付けられたWindow現在のグローバルオブジェクトとなります。

options

新しく作成されるタイムラインの構成パラメータです。 本現行標準ではoriginTime メンバーのみ定義しますが、他の規格で拡張される場合があります。

6.4. Animationインターフェース

アニメーションは Web Animations APIではAnimation インターフェースで表現されます。

[Exposed=Window]
interface Animation : EventTarget {
    constructor(optional AnimationEffect? effect = null,
                optional AnimationTimeline? timeline);
             attribute DOMString                id;
             attribute AnimationEffect?         effect;
             attribute AnimationTimeline?       timeline;
             attribute double?                  startTime;
             attribute double?                  currentTime;
             attribute double                   playbackRate;
    readonly attribute AnimationPlayState       playState;
    readonly attribute AnimationReplaceState    replaceState;
    readonly attribute boolean                  pending;
    readonly attribute Promise<Animation>       ready;
    readonly attribute Promise<Animation>       finished;
             attribute EventHandler             onfinish;
             attribute EventHandler             oncancel;
             attribute EventHandler             onremove;
    undefined cancel();
    undefined finish();
    undefined play();
    undefined pause();
    undefined updatePlaybackRate(double playbackRate);
    undefined reverse();
    undefined persist();
    [CEReactions]
    undefined commitStyles();
};
Animation (effect, timeline)

以下の手順で新しいAnimation オブジェクトを作成します。

  1. animationを新しいAnimation オブジェクトとします。

  2. animationに対し、アニメーションのタイムラインを設定する手順を実行し、timelinenew timelineとして渡します。timeline引数がない場合は、DocumentデフォルトドキュメントタイムラインWindow現在のグローバルオブジェクトに関連付けられている)を渡します。

  3. animationに対し、アニメーションの関連効果を設定する手順を実行し、sourcenew effectとして渡します。

effect

オプション値。nullでなければ、新しく作成されるアニメーションに割り当てる関連効果を指定します。

timeline

オプション値。指定すれば新しく作成されるアニメーションに関連付けるタイムラインを指定します。 省略時は、DocumentデフォルトドキュメントタイムラインWindow現在のグローバルオブジェクトに関連付けられている)を使用します。

id, DOMString

アニメーションを識別するための文字列。

effect, AnimationEffect、null許容

このアニメーションの関連効果。 この属性を設定すると、アニメーションの関連効果を設定する手順に従いオブジェクトの関連効果が更新されます。

timeline, AnimationTimeline、null許容

このアニメーションに関連付けられたタイムライン。 この属性を設定すると、アニメーションのタイムラインを設定する手順に従いオブジェクトのタイムラインが更新されます。

startTime, double、null許容

このアニメーションの開始時刻を返します。 この属性を設定すると、開始時刻を設定する手順に従いオブジェクトの開始時刻を新しい値で更新します。

currentTime, double、null許容

このアニメーションの現在時刻。 この属性を設定すると、現在時刻を設定する手順に従いオブジェクトの現在時刻を新しい値に更新します。

playbackRate, double

このアニメーションの再生速度。 この属性を設定すると、再生速度を設定する手順に従いオブジェクトの再生速度を新しい値に更新します。

この属性を設定すると、再生速度の同期更新が行われ、別プロセスやスレッドで再生中のアニメーションの再生状態との同期は試みません。 そのため、再生中のアニメーションに対しplaybackRate を設定するとジャンプすることがあります。

再生中のアニメーションの再生速度を滑らかに変更するには、非同期のupdatePlaybackRate() メソッドを使ってください。

playState, AnimationPlayState、読み取り専用

このアニメーションの再生状態

replaceState, AnimationReplaceState、読み取り専用

このアニメーションの置換状態

pending, boolean、読み取り専用

このアニメーションが保留再生タスクまたは保留一時停止タスクを持つ場合はtrueを返します。

ready, 型 Promise<Animation>、読み取り専用

このオブジェクトの現行標準readyプロミスを返します。

finished, 型 Promise<Animation>、読み取り専用

このオブジェクトの現行標準終了プロミスを返します。

onfinish, EventHandler

finishイベントのイベントハンドラ。

oncancel, EventHandler

cancelイベントのイベントハンドラ。

onremove, EventHandler

removeイベントのイベントハンドラ。

void cancel()

このアニメーションによるすべての効果をクリアし、再生を中止します。アニメーションのキャンセル手順を実行します。

void finish()

アニメーションを現在の方向で関連効果の終了点までシークします。アニメーションの終了手順を実行します。

DOMException 型 InvalidStateError

このアニメーションの再生速度が0の場合、 または再生速度が0より大きく、関連効果の終了点が無限大の場合に発生します。

void play()

アニメーションの再生を開始または再開します。アニメーションの再生手順を実行し、auto-rewindフラグにtrueを渡します。

void pause()

このアニメーションの再生を一時停止します。アニメーションの一時停止手順を実行します。

void updatePlaybackRate(playbackRate)

このアニメーションの再生速度を非同期で更新します。再生速度のシームレスな更新手順を実行し、playbackRatenew playback rateとして渡します。

playbackRate

更新後の再生速度を指定する有限実数。

void reverse()

このアニメーションの再生速度を反転し、アニメーションの逆再生手順を実行して再生します。 play()と同様、このメソッドはアニメーションを一時停止状態から解除し、すでに逆方向で終了している場合は関連効果の開始点までシークします。

void persist()

このアニメーションの置換状態persistedに設定します。

void commitStyles()

このアニメーションのアニメーション効果が生成した効果値を、それぞれの効果ターゲットのインラインスタイルに書き込みます。算出スタイルのコミット手順を実行します。

このメソッドは、このインターフェースの多くの他のメソッドとは異なり、スタイル変更イベントを発火します(§ 6.13 モデルのライブ性参照)。

算出スタイルのコミット手順は、アニメーションがremovedであっても効果値を含むため、 このメソッドはアニメーションが置換された後も(§ 5.5.2 置換されたアニメーションの削除参照)アニメーションの効果のみを残したい場合に有用です。

コミットされる値は算出値であり、ライブアニメーションが生成する値のようにCSS変数の変化やem単位の再計算など、コンテキスト変化には反映されません。

置換後も塗りアニメーションの結果を完全に残したい場合(§ 5.5 アニメーションの置換参照)は、persist() メソッドを使えます。ただし、その場合アニメーションはリソースを引き続き消費します。

算出スタイルをコミットするには、アニメーションanimationについて:

  1. targetsを、animation関連付けられているすべてのアニメーション効果効果ターゲットセットとする。

  2. targetについて:

    1. targetstyle属性を持つことができる要素でない場合(例:疑似要素や、style属性が定義されていない文書形式の要素)、throwし、「NoModificationAllowedErrorDOMExceptionを発生させ、これらの手順を中止する。

    2. 保留中のスタイル変更を適用した後、target描画されていない場合、throwし、「InvalidStateErrorDOMExceptionを発生させ、これらの手順を中止する。

      描画されているの定義は、display: contentsとの関係でまだ議論中です。 この手順の目的では、display: contentsであっても、他にレイアウトボックスが関連付けられる(接続済みで、display: noneのサブツリーでない)場合は描画されているとみなします。

    3. inline styleを、targetCSS宣言ブロック(style属性に対応)取得結果とします。 targetstyle属性を持たない場合は、inline styleを新しい空のCSS宣言ブロックオーナーノードtarget)とします。

    4. targeted propertiesを、animation関連付けられているすべてのアニメーション効果のうち、target効果ターゲットとするものの、物理ロングハンドプロパティのターゲットプロパティセットとする。

    5. 各プロパティpropertyについて:

      1. partialEffectStacktarget上のproperty効果スタックのコピーとします。

      2. animation置換状態removedなら、animation関連付けられているすべてのアニメーション効果のうち、target効果ターゲットとし、propertyターゲットプロパティに含むものをpartialEffectStackに追加します。

      3. partialEffectStackから、animationより高い合成順序を持つアニメーション関連付けられているアニメーション効果を削除します。

      4. effect valueを、partialEffectStackについてpropertyの結果を計算し(targetの算出スタイルを使用)、その結果とします(§ 5.4.3 効果スタックの結果の計算参照)。

      5. CSS宣言を設定するで、propertyeffect valueinline styleに設定します。

    6. style属性を更新するinline styleを更新します。

6.4.1. AnimationPlayState列挙型

enum AnimationPlayState { "idle", "running", "paused", "finished" };
idle

アイドル再生状態に対応します。

running

再生中状態に対応します。

paused

一時停止状態に対応します。

finished

終了状態に対応します。

6.4.2. AnimationReplaceState列挙型

enum AnimationReplaceState { "active", "removed", "persisted" };
active

アクティブ置換状態に対応します。

removed

削除済み置換状態に対応します。

persisted

保持置換状態に対応します。

6.5. AnimationEffectインターフェース

アニメーション効果は Web Animations APIでは抽象AnimationEffect インターフェースで表現されます。

[Exposed=Window]
interface AnimationEffect {
    EffectTiming         getTiming();
    ComputedEffectTiming getComputedTiming();
    undefined            updateTiming(optional OptionalEffectTiming timing = {});
};
将来的には any onupdate (double? progress, double currentIteration, Animatable? target, any underlyingValue) を公開し、アニメーション効果がタイミングモデルとは独立して駆動できるようにする可能性があります。
getTiming()

このアニメーション効果に指定されたタイミングプロパティを返します。

返されるEffectTiming オブジェクトのメンバーとタイミングモデルのプロパティの対応は、 EffectTiming インターフェースを参照してください。

getComputedTiming()

このアニメーション効果の計算済みタイミングプロパティを返します。

getTiming()getComputedTiming()で返されるオブジェクトの属性には共通するものもありますが、値は以下のように異なります:

  • duration - getTiming()は文字列autoを返す場合がありますが、getComputedTiming()は、反復期間の計算値に対応する数値を返さなければなりません。詳細はdurationメンバーの説明を参照。

    この現行標準では、auto値は単にゼロに置き換えられることを意味します。

  • fill - 同様に、getTiming()は文字列autoを返す場合がありますが、getComputedTiming()は、タイミング計算に使われる具体的なFillModeを返さなければなりません。詳細はfillメンバーの説明を参照。

    この現行標準では、auto値は単にnoneFillModeに置き換えられます。

注: 他のタイミングメンバーも将来的にautoのような値が拡張される可能性があります。タイミング計算を行う際は、許容値の範囲や型が変更された場合の互換性を避けるため、可能な限りgetComputedTiming()を利用することが推奨されます。

返される値の違いに加え、 getTiming()と比較して、 getComputedTiming()は、ComputedEffectTiming辞書で定義される追加のタイミング情報も返します。

updateTiming(timing)

このアニメーション効果の指定タイミングプロパティを更新します。 timingパラメータをinputとして、アニメーション効果のタイミングプロパティを更新する手順を実行します。

optional OptionalEffectTiming timing

更新するタイミングプロパティ。 timing存在しないメンバーに対応するタイミングプロパティは変更されません

remove()メソッドは、効果を親グループやアニメーションから除去するために使える。現行標準レベル1に残し、単にアニメーションからアニメーション効果を除去するものとして定義すべきか? [Issue #2082]

6.5.1. EffectTimingおよびOptionalEffectTiming辞書

EffectTiming 辞書は、AnimationEffect のタイミングプロパティを表します。

OptionalEffectTiming 辞書は、EffectTiming 辞書のバリエーションで、一部のメンバーが存在しないことを許容します。 これはupdateTiming() メソッドで、AnimationEffect インターフェースのタイミングプロパティをデルタ更新する際に使用されます。 アニメーション効果のタイミングプロパティの差分更新に用います。

dictionary EffectTiming {
    double                             delay = 0;
    double                             endDelay = 0;
    FillMode                           fill = "auto";
    double                             iterationStart = 0.0;
    unrestricted double                iterations = 1.0;
    (unrestricted double or DOMString) duration = "auto";
    PlaybackDirection                  direction = "normal";
    DOMString                          easing = "linear";
};

dictionary OptionalEffectTiming {
    double                             delay;
    double                             endDelay;
    FillMode                           fill;
    double                             iterationStart;
    unrestricted double                iterations;
    (unrestricted double or DOMString) duration;
    PlaybackDirection                  direction;
    DOMString                          easing;
};
delay, double、デフォルト値 0

開始遅延(start delay)。関連付けられたアニメーション開始時刻からアクティブ区間の開始までのミリ秒数です。

endDelay, double、デフォルト値 0

終了遅延(end delay)。アニメーション効果アクティブ区間の終了から終了時刻までのミリ秒数です。

fill, FillMode、デフォルト値 "auto"

塗りモード(fill mode)。アニメーション効果アクティブ区間外でどのように振る舞うか定義します。

タイミング計算時、特別な文字列値autoはタイミングモデルが認識する以下の塗りモードに展開されます:

塗りモードが適用されるアニメーション効果キーフレーム効果の場合

塗りモードとしてnoneを使います。

それ以外の場合

塗りモードとしてbothを使います。

§ 4.6 塗りの挙動で述べられている通り、作者が無限に塗り続けるアニメーションの使用は推奨しません。
iterationStart, double、デフォルト値 0.0

アニメーション効果反復開始プロパティ。0以上の有限実数で、アニメーション効果がどの反復インデックスからどの進行度で始まるかを表します。

例えば0.5なら、アニメーション効果は最初の反復の途中から始まります。1.2なら2回目の反復の20%から始まることになります。

iterations の値はiterationStart加算される扱いとなり、 iterationStartが"0.5"でiterationsが"2"の場合、2回繰り返しますが開始・終了ともに反復区間の途中からとなります。

iterationStart が1以上の値は、反復合成操作accumulateの場合、または現在の反復インデックスが重要な場合にのみ有用です。

iterations, unrestricted double、デフォルト値 1.0

アニメーション効果反復回数プロパティ。0以上の実数(正の無限大も含む)で、アニメーション効果を何回繰り返すかを表します。

+Infinityを設定すると、アニメーション効果は無限に繰り返されます(効果の持続時間が0の場合はすぐに終了します)。

duration, (unrestricted double or DOMString)、デフォルト値 "auto"

反復期間。0以上の実数(正の無限大も含む)で、アニメーション効果の1回の反復に要する時間を表します。

この現行標準では、文字列値autoはタイミングモデルの計算では0として扱われ、duration メンバーをgetComputedTiming()で取得した場合も0になります。 作者がautoを指定した場合、duration メンバーをgetTiming()で取得した場合はautoを返す必要があります。

これは将来の互換性措置であり、将来の現行標準ではグループ効果によってauto値が子効果の持続時間も含めて展開されることが予想されます。

direction, PlaybackDirection、デフォルト値 "normal"

アニメーション効果再生方向。再生が前方・後方・交互いずれになるかを定義します。

easing, DOMString、デフォルト値 "linear"

タイミング関数(easing function)。時間をスケールしてイージング効果を生成します。

文字列の構文は<easing-function> 生成規則([CSS-EASING-1])で定義されています。

6.5.2. FillMode列挙型

enum FillMode { "none", "forwards", "backwards", "both", "auto" };
none

塗りなし。

forwards

前方塗り。

backwards

後方塗り。

both

前方・後方両方塗り。

auto

塗りなし。 今後の現行標準レベルで他種類のアニメーション効果に対して異なる動作になる場合があります。

6.5.3. PlaybackDirection列挙型

enum PlaybackDirection { "normal", "reverse", "alternate", "alternate-reverse" };
normal

すべての反復は指定通りに再生されます。

reverse

すべての反復は指定された順序と逆方向に再生されます。

alternate

偶数回の反復は指定通り、奇数回の反復は逆方向に再生されます。

alternate-reverse

偶数回の反復は逆方向、奇数回の反復は指定通りに再生されます。

6.5.4. AnimationEffectのタイミングの更新

アニメーション効果のタイミングプロパティを更新するには、effectに対して、 EffectTiming またはOptionalEffectTiming オブジェクトinputを使い、以下の手順を実行します:

  1. inputiterationStart メンバーが存在し、0未満の場合は、TypeErrorをthrowして、この手順を中止します。

    注: TypeErrorを使う理由は、将来的にWebIDLの[EnforceRange]アノテーションが浮動小数点値にも適用できるようになった場合に、挙動を合わせるためです。

  2. inputiterations メンバーが存在し、 かつ0未満またはNaNの場合は、TypeErrorをthrowして、この手順を中止します。

  3. inputduration メンバーが存在し、 かつ0未満またはNaNの場合は、TypeErrorをthrowして、この手順を中止します。

  4. inputeasing メンバーが存在し、かつ<easing-function> 生成規則でパースできない場合は、TypeErrorをthrowして、この手順を中止します。

  5. input存在する各メンバーを、以下の対応でeffectのタイミングプロパティに割り当てます:

6.5.5. ComputedEffectTiming辞書

タイミングモデルで計算されたタイミングプロパティはComputedEffectTiming 辞書オブジェクトで公開されます。

dictionary ComputedEffectTiming : EffectTiming {
    unrestricted double  endTime;
    unrestricted double  activeDuration;
    double?              localTime;
    double?              progress;
    unrestricted double? currentIteration;
};
endTime, unrestricted double

アニメーション効果終了時刻。ゼロローカル時刻(つまりこのアニメーション効果アニメーションに関連付けられている場合はアニメーション開始時刻)からのミリ秒で表されます。 これはアニメーション効果のアクティブ区間の終了+終了遅延に対応します。

activeDuration, unrestricted double

このアニメーション効果アクティブ持続時間

localTime, double、null許容

このアニメーション効果ローカル時刻

このアニメーション効果アニメーションに関連付けられていない場合はnullとなります。

progress, double、null許容

このアニメーション効果の現在の反復進行度

currentIteration, unrestricted double、null許容

現在の反復インデックス。最初の反復はゼロから始まります。

通常は正の整数ですが、持続時間ゼロかつ無限回繰り返すアニメーションの場合は値が正のInfinityになります。

未解決時刻と同様、未解決の反復nullで表されます。

6.6. KeyframeEffectインターフェース

キーフレーム効果KeyframeEffect インターフェースで表現されます。

[Exposed=Window]
interface KeyframeEffect : AnimationEffect {
    constructor(Element? target,
                object? keyframes,
                optional (unrestricted double or KeyframeEffectOptions) options = {});
    constructor(KeyframeEffect source);
    attribute Element?           target;
    attribute CSSOMString?       pseudoElement;
    attribute CompositeOperation composite;
    sequence<object> getKeyframes();
    undefined        setKeyframes(object? keyframes);
};
KeyframeEffect (target, keyframes, options)

以下の手順で新しいKeyframeEffect オブジェクトを作成します:

  1. 新しいKeyframeEffect オブジェクトeffectを作成します。

  2. effectターゲット要素targetに設定します。

  3. ターゲット疑似セレクタを、以下の最初に一致する条件の結果で設定します。

    もしoptionsKeyframeEffectOptions オブジェクトで、pseudoElement プロパティを持つ場合

    ターゲット疑似セレクタpseudoElement プロパティの値で設定します。

    このプロパティを設定する際は、インターフェースのpseudoElement セッターで定義されたエラーハンドリングが適用されます。 セッターで例外が必要な場合、この手順も同じ例外をthrowし、それ以降の手順を中止します。

    それ以外の場合

    ターゲット疑似セレクタnullに設定します。

  4. timing inputを、以下の最初に一致する条件の結果とします。

    もしoptionsKeyframeEffectOptions オブジェクトの場合

    timing inputoptionsとします。

    それ以外(optionsdoubleの場合)

    timing inputを、すべてのメンバーがデフォルト値で設定された新しいEffectTiming オブジェクトで、durationoptionsに設定します。

  5. effectアニメーション効果のタイミングプロパティを更新する手順をtiming inputで呼び出します。

    その手順で例外が発生した場合は、その例外を伝播させてこの手順を中止します。

  6. optionsKeyframeEffectOptions オブジェクトの場合、effectcomposite プロパティにoptionsの対応する値を設定します。

    このプロパティを設定する際は、KeyframeEffect インターフェース上の対応するセッターのエラーハンドリングが適用されます。 optionsで指定された値に対してセッターが例外を必要とする場合は、この手順も同じ例外をthrowし、それ以降の手順を中止します。

  7. keyframesを入力としてsetKeyframes() 手順を実行し、キーフレーム集合を初期化します。

Element? target

ターゲット要素。 特定の要素を対象としないアニメーションの場合はnullを指定できます。

object? keyframes

使用するキーフレーム集合。 この引数のフォーマットと処理は§ 6.6.3 キーフレーム引数の処理で定義されています。

optional KeyframeEffectOptions options

エフェクトの反復期間を指定する数値、またはエフェクトのタイミングや挙動を指定するプロパティ集合。

このコンストラクタの使用例は§ 6.6.1 新しいKeyframeEffectオブジェクトの作成で示されています。

KeyframeEffect (source)

以下の手順で、source と同じプロパティを持つ新しいKeyframeEffect オブジェクトを作成します:

  1. 新しいKeyframeEffect オブジェクトeffectを作成します。

  2. effectの下記プロパティをsourceの対応する値で設定します:

    注: KeyframeEffect(target, keyframes, options) コンストラクタと異なり、例外を再throwする必要はありません。sourceに指定されたタイミングプロパティは有効だとみなされるためです。

KeyframeEffect source

新しいキーフレーム効果を定義するプロパティをコピーする元のキーフレーム効果

target, Element、null許容

このオブジェクトによってアニメーションされるターゲット要素Elementなら効果ターゲット、疑似要素なら発生元要素)。 音声APIでサウンド生成など、特定要素を対象としないアニメーションの場合はnullとなります。

pseudoElement, CSSOMString、null許容

ターゲット疑似セレクタ効果ターゲットがない場合や、効果ターゲットが要素(疑似要素でない)の場合はnull。 効果ターゲットが疑似要素の場合、この値は疑似要素セレクタ(例:::before)となります。

設定時は、アニメーション効果ターゲット疑似セレクタに指定値を設定しますが、以下の例外を適用します:

composite, CompositeOperation

このキーフレーム効果効果スタックと合成する際に使用する合成操作CompositeOperation列挙型値で指定されます。

設定時は、このアニメーション効果合成操作プロパティに指定値を設定します。

sequence<object> getKeyframes()

この効果を構成するキーフレームとその算出キーフレームオフセットを返します。

この節は非規範的です

このメソッドの結果は以下の形式のオブジェクト列です:

dictionary ComputedKeyframe {
    // ... プロパティ値のペア ...
    // 例:DOMString propertyName
    double?                  offset = null;
    double                   computedOffset;
    DOMString                easing = "linear";
    CompositeOperationOrAuto composite = "auto";
};

各メンバーの意味と値は以下の通りです:

offset

キーフレームオフセットキーフレームの0.0以上1.0以下の数値、またはnull

キーフレームが隣接キーフレーム間で自動的に間隔調整される場合はnullとなります。

computedOffset

このキーフレーム算出キーフレームオフセット欠損キーフレームオフセットの算出手順で計算されます。

offsetとは異なり、computedOffsetは常にnullになりません。

easing

このキーフレームから次のキーフレームまでの進行度を変換するためのタイミング関数

composite

このキーフレームで指定された値を基底値と合成する際に使用するキーフレーム固有の合成操作

キーフレーム効果で指定された合成操作が使用される場合、このメンバーはautoとなります。

キーフレームは部分的にオープンな辞書型でWebIDLで表現できないため、このメソッドの返却値生成手順は以下のように記述されます:

  1. resultを空のオブジェクト列とする。

  2. keyframesを以下のいずれかとする:

    1. このキーフレーム効果CSSAnimationに関連付けられ、キーフレームsetKeyframes()の呼び出しで置き換えられていない場合、キーフレーム効果算出キーフレーム

    2. それ以外の場合、このキーフレーム効果キーフレーム欠損キーフレームオフセットの算出手順を適用した結果。

    注: CSSアニメーション用には算出キーフレームを返します。CSSで指定されたキーフレームはすべて辞書で表現できるわけではないためです。

  3. keyframes内の各keyframeについて以下を行う:

    1. 以下の定義で辞書オブジェクトoutput keyframeを初期化:

      dictionary BaseComputedKeyframe {
           double?                  offset = null;
           double                   computedOffset;
           DOMString                easing = "linear";
           CompositeOperationOrAuto composite = "auto";
      };
      
    2. output keyframeoffset, computedOffset, easing, compositekeyframeキーフレームオフセット算出キーフレームオフセット、 キーフレーム固有のタイミング関数キーフレーム固有の合成操作で設定します。

    3. keyframeの各アニメーションプロパティ値のペアdeclarationについて以下を行う:

      1. property nameを、declarationのプロパティ名にアニメーションプロパティ名からIDL属性名への変換アルゴリズムを適用した結果とする。

      2. IDL valueを、declarationのプロパティ値をCSS値のシリアライズアルゴリズムに渡して得られる結果とする。

      3. valueを、IDL valueECMAScriptのString値へ変換した結果とする。

      4. output keyframeに対しproperty namevalue書き込み可能・列挙可能・設定可能としてfalseで定義する。

    4. output keyframeresultに追加する。

  4. resultを返す。

void setKeyframes(object? keyframes)

この効果を構成するキーフレーム集合を置き換えます。

object? keyframes

キーフレーム集合の書式と処理は§ 6.6.3 キーフレーム引数の処理で定義されています。

この効果のキーフレーム集合は、キーフレーム引数の処理手順の結果で置き換えられます。 その手順で例外がthrowされた場合は、効果のキーフレームは変更されません。

6.6.1. 新しいKeyframeEffectオブジェクトの作成

この節は非規範的です

KeyframeEffect コンストラクタは、新しいKeyframeEffect オブジェクトを作成するための様々なアプローチを提供します。

最も単純な例として、KeyframeEffect オブジェクトでelemの"left"プロパティを3秒かけて100pxに変更する場合、以下のように作成できます:

var effect = new KeyframeEffect(elem, { left: '100px' }, 3000);

第2引数(キーフレームのリスト)は、複数のプロパティを指定することもできます。(§ 6.6.3 キーフレーム引数の処理参照)

// 複数のプロパティを同時に指定
var effectA = new KeyframeEffect(elem, { left: '100px', top: '300px' }, 3000);

// 複数のキーフレームを指定
var effectB = new KeyframeEffect(elem, [ { left: '100px' }, { left: '300px' } ], 3000);

第3引数(アニメーションのタイミング)は、上記のようにミリ秒単位の反復期間を表す数値でもよいですが、開始遅延などさらにタイミングプロパティを指定する場合は、以下のようにEffectTimingオブジェクトを使うことができます:

var effect =
  new KeyframeEffect(elem, { left: '100px' }, { duration: 3000, delay: 2000 });

durationが指定されていない場合は、0が使用されます。 プロパティを補間せずに単に設定するだけのアニメーションも以下のように作成できます:

var effect =
  new KeyframeEffect(elem, { visibility: 'hidden' }, { fill: 'forwards' });

§ 4.6 塗りの挙動で述べられているように、このような無限塗りのアニメーションの使用は推奨されません。

作成したKeyframeEffect は、Animation に追加して再生できます。 ただし、単純な効果であればElement.animateショートカットの方が便利で、これらの手順を自動で行ってくれます。例えば:

elem.animate({ left: '100px' }, 3000);

6.6.2. プロパティ名とIDL名

アニメーションプロパティ名からIDL属性名への変換 アルゴリズム(property用)は以下の通りです:

  1. propertyに従う場合、 propertyを返す。

  2. propertyがCSSのfloat プロパティの場合、 文字列"cssFloat"を返す。

  3. propertyがCSSのoffset プロパティの場合、 文字列"cssOffset"を返す。

  4. それ以外の場合、propertyCSSプロパティからIDL属性への変換アルゴリズム([CSSOM])を適用した結果を返す。

IDL属性名からアニメーションプロパティ名への変換 アルゴリズム(attribute用)は以下の通りです:

  1. attributeに従う場合、 attributeを返す。

  2. attributeが文字列"cssFloat"の場合、CSSのfloatプロパティを表すアニメーションプロパティを返す。

  3. attributeが文字列"cssOffset"の場合、CSSのoffsetプロパティを表すアニメーションプロパティを返す。

  4. それ以外の場合、attributeIDL属性からCSSプロパティへの変換アルゴリズム([CSSOM])を適用した結果を返す。

6.6.3. keyframes引数の処理

この節は非規範的です

以下のメソッドはすべて、引数としてキーフレーム集合を受け付けます:

この引数は下記2つの形式のいずれかで指定できます。例:

// 下記2つの式は同じ結果になります:
elem.animate([ { color: 'blue' },
               { color: 'green' },
               { color: 'red' },
               { color: 'yellow' } ], 2000);
elem.animate({ color: [ 'blue', 'green', 'red', 'yellow' ] }, 2000);

// 複数プロパティアニメーションの場合も、下記2つの式は等価です:
elem.animate([ { color: 'blue', left: '0px' },
               { color: 'green', left: '-20px' },
               { color: 'red', left: '100px' },
               { color: 'yellow', left: '50px'} ], 2000);
elem.animate({ color: [ 'blue', 'green', 'red', 'yellow' ],
               left: [ '0px', '-20px', '100px', '50px' ] }, 2000);

// ちなみに、下記3つの式はすべて等価です:
elem.animate([ { color: 'red' } ], 1000);
elem.animate({ color: [ 'red' ] }, 1000);
elem.animate({ color: 'red' }, 1000);

1つ目(配列形式)はキーフレームの配列で、各キーフレームは各アニメーションプロパティにつき最大1つの値を指定できます。 2つ目(オブジェクト形式)は各アニメーションプロパティに1つまたは値の配列を指定できます。

配列形式が正規形であり、getKeyframes() メソッドで返される形式です。

キーフレームオフセットはどちらの形式でも指定可能です。例:

// オフセットを指定しない場合、自動的に最初のキーフレームは0、中間は0.65、最後は1となります。
//
elem.animate([ { color: 'blue' },
               { color: 'green', offset: 0.5 },
               { color: 'red' },
               { color: 'yellow', offset: 0.8 },
               { color: 'pink' } ], 2000);

// 下記も同じ結果になります。最後の値は指定不要で、自動的に'null'扱いとなり、上記と同様に自動割り当てされます。
elem.animate({ color: [ 'blue', 'green', 'red', 'yellow', 'pink' ],
               offset: [ null, 0.5, null, 0.8 ] }, 2000);

同様に、タイミング関数キーフレーム固有の合成操作もどちらの形式でも指定できます。配列形式では各キーフレームごとに異なる値を指定でき、オブジェクト形式では値リストが必要に応じて繰り返され、各キーフレームに値が割り当てられます。

// タイミング関数はキーフレーム間に適用されるため、最後のキーフレームに指定しても無視されます。
elem.animate([ { color: 'blue', easing: 'ease-in' },
               { color: 'green', easing: 'ease-out' },
               { color: 'yellow' } ], 2000);

// 下記も同じ結果になります。
elem.animate({ color: [ 'blue', 'green', 'yellow' ],
               easing: [ 'ease-in', 'ease-out' ] }, 2000);

// 繰り返し動作を使えば、全キーフレームに同じ値を割り当てるのも簡単です:
elem.animate({ color: [ 'blue', 'green', 'yellow' ],
               easing: 'ease-in-out' }, 2000);

どちらの形式でもeasingプロパティはキーフレーム固有のタイミング関数を設定することに注意してください。 この設定は、KeyframeEffectOptions またはKeyframeAnimationOptions オブジェクトを使ってanimate() メソッド(Animatable インターフェースミックスイン)で指定する、タイミング関数とは独立しています。全体の反復期間に適用されるタイミング関数は別です。

次の例では、2つの記述は異なる結果になります。

// ここでは 'ease-in-out' が各色値の間に適用されます。
elem.animate({ color: [ 'blue', 'green', 'yellow' ],
               easing: 'ease-in-out' }, 2000);

// 一方、こちらは 'ease-in-out' がアニメーション全体('blue'から'yellow'まで)に適用されます。
elem.animate({ color: [ 'blue', 'green', 'yellow' ] },
             { duration: 2000, easing: 'ease-in-out' });

keyframes引数の型は部分的にオープンな辞書型に依存するため、WebIDLでは表現できません。

概念的には、この引数の型は以下のWebIDL風定義に等しいものです:

dictionary Keyframe {
    // ... プロパティ値のペア ...
    // 例:DOMString propertyName
    double?                   offset = null;
    DOMString                 easing = "linear";
    CompositeOperationOrAuto  composite = "auto";
};

dictionary PropertyIndexedKeyframes {
    // ... プロパティ値や値リストのペア ...
    // 例:(DOMString or sequence&lt;DOMString&gt;) propertyName
    (double? or sequence<double?>)                         offset = [];
    (DOMString or sequence<DOMString>)                     easing = [];
    (CompositeOperationOrAuto or sequence<CompositeOperationOrAuto>) composite = [];
};

typedef (sequence<Keyframe> or PropertyIndexedKeyframes) KeyframeArgument;

各引数の意味と許容値は以下の通りです:

offset

キーフレームオフセットキーフレームの0.0~1.0の数値またはnull

nullは、キーフレームが隣接キーフレーム間で自動的に間隔調整されることを示します。

範囲[0.0, 1.0]外のoffset指定はTypeErrorをthrowします。

offsetを指定するキーフレームは昇順で並べなければなりません。ただし隣接・同値のoffsetは許容されます。

easing

タイミング関数。このキーフレームから次のキーフレームまでの進行度を変換します。

この文字列の構文・エラーハンドリングはeasing 属性(EffectTiming インターフェース)と同一です。

composite

キーフレーム固有の合成操作。このキーフレームで指定した値を基底値と合成します。

autoの場合、合成操作キーフレーム効果で指定されたものが使われます。

この型はWebIDLで表現できないため、処理は後述のプローズで定義されています。

各メソッドでkeyframes引数を受け取る場合、keyframes引数の処理手順を入力に実行し、その結果を保持します。

まず2つの補助的定義を示します。

completion recordの確認result)は、resultがECMAScript操作のcompletion recordである場合、以下の手順と同等です:

  1. resultabrupt completionなら、resultの[[value]]フィールドに含まれる例外をthrowしてこの手順を中止します。

    [[type]]がbreakcontinuereturnの場合はどうすべき?あり得る?

  2. resultresultの[[value]]フィールドの値で置き換えます。

キーフレーム類似オブジェクトの処理手順は、2つの引数を取ります:

そして、以下の手順でallow listsがfalseならプロパティ名→DOMString値のマップ、trueならプロパティ名→DOMString値列のマップを返します:

  1. keyframe inputECMAScript値から辞書型への変換手順([WEBIDL])に渡して実行します。辞書型はallow listsの値で次のように決まります:

    trueのとき

    以下の辞書型:

    dictionary BasePropertyIndexedKeyframe {
        (double? or sequence<double?>)                         offset = [];
        (DOMString or sequence<DOMString>)                     easing = [];
        (CompositeOperationOrAuto or sequence<CompositeOperationOrAuto>) composite = [];
    };
    
    falseのとき

    以下の辞書型:

    dictionary BaseKeyframe {
        double?                  offset = null;
        DOMString                easing = "linear";
        CompositeOperationOrAuto composite = "auto";
    };
    

    この手順の結果をkeyframe outputとして保持します。

  2. animatable propertiesリストを以下の手順で作成します:

    1. animatable propertiesを、実装でアニメーション可能なプロパティ名(ロングハンドを持つショートハンドも含む)リストとする。

    2. animatable properties内の各プロパティ名をアニメーションプロパティ名からIDL属性名への変換アルゴリズムでIDL属性名に変換する。

  3. input propertiesを、keyframe inputに対してEnumerableOwnNames操作で取得する。

  4. animation properties新リストを作成し、input propertiesanimatable properties両方に含まれるプロパティ、またはinput propertiesにありに従うものを含める。

  5. animation propertiesをUnicodeコードポイント順で昇順ソートする。

  6. animation properties内の各property nameについて:

    1. raw valueを、keyframe inputに対して[[Get]]で取得する。

    2. raw valuecompletion recordの確認を行う。

    3. raw valueをDOMStringまたはDOMString列property valuesへ変換:

      allow listsがtrueの場合

      property valuesraw valueからIDL型(DOMString or sequence<DOMString>)ECMAScript値からIDL値への変換手順([WEBIDL])で変換する。

      単一DOMStringの場合、値1件のDOMString列に置き換える。

      それ以外

      property valuesraw valueからDOMStringにECMAScript値からDOMStringへの変換手順([WEBIDL])で変換する。

    4. normalized property nameを、property nameIDL属性名からアニメーションプロパティ名への変換アルゴリズム適用結果とする。

    5. keyframe outputnormalized property nameのプロパティでproperty valuesを値として追加する。

  7. keyframe outputを返す。

keyframes引数の処理手順は、nullableなECMAScriptオブジェクトobjectを入力に、以下でキーフレーム列を返します:

  1. objectがnullなら、空のキーフレーム列を返す。

  2. processed keyframesを空のキーフレーム列とする。

  3. methodGetMethod(object, @@iterator)で取得する。

  4. methodcompletion recordの確認を行う。

  5. 以下の最初に一致する条件に対応する手順を実行する:

    methodがundefinedでない場合
    1. iterGetIterator(object, method)で取得。

    2. itercompletion recordの確認を行う。

    3. 繰り返し:

      1. nextIteratorStep(iter)で取得。

      2. nextcompletion recordの確認を行う。

      3. nextがfalseならこのループを中止する。

      4. nextItemIteratorValue(next)で取得。

      5. nextItemcompletion recordの確認を行う。

      6. Type(nextItem)がUndefined, Null, Object以外なら、TypeErrorをthrowして以降を中止する。

      7. キーフレーム類似オブジェクトの処理手順をnextItemに対しallow lists = falseで実行し、その結果をprocessed keyframesに追加する。

    それ以外
    1. property-indexed keyframeキーフレーム類似オブジェクトの処理手順でobjectallow lists = trueで実行した結果とする。

    2. property-indexed keyframeの各メンバーmについて:

      1. キーをproperty nameとする。

      2. property nameが"composite"、"easing"、"offset"ならこのループの残りをスキップし次へ。

      3. 値をproperty valuesとする。

      4. property keyframesを空のキーフレーム列とする。

      5. property values内の各値vについて:

        1. kキーフレームで、キーフレームオフセットがnullなものとして新規作成。

        2. property namevのプロパティ値ペアをkに追加。

        3. kproperty keyframesに追加。

      6. 欠損キーフレームオフセットの算出手順をproperty keyframesに適用。

      7. property keyframes内のキーフレームprocessed keyframesに追加。

    3. processed keyframesを各キーフレーム算出キーフレームオフセットで昇順ソート。

    4. processed keyframesで隣接するキーフレーム算出キーフレームオフセットが等しい場合は統合。

    5. offsetsを、property-indexed keyframeの"offset"メンバー型により次のように設定:

      sequence<double?>の場合

      "offset"そのもの。

      double?の場合

      長さ1のシーケンスで、値は"offset"のみ(« offset »)。

    6. offsetsの各値を、processed keyframesで対応する位置のキーフレームオフセットに割り当てる。どちらかの末尾まで。

    7. easingsを、property-indexed keyframeの"easing"メンバー型により次のように設定:

      sequence<DOMString>の場合

      "easing"そのもの。

      DOMStringの場合

      長さ1のシーケンスで、値は"easing"のみ(« "easing" »)。

    8. easingsが空なら、長さ1で値"linear"(« "linear" »)にする。

    9. easingsprocessed keyframesより少なければ、先頭から繰り返して同数にする。

      例えば、processed keyframesが5件、easingsが« "ease-in", "ease-out" »なら、easingsは« "ease-in", "ease-out", "ease-in", "ease-out", "ease-in" »になります。
    10. easingsprocessed keyframesより多ければ、余剰分をunused easingsとして保持。

    11. easingsの各値を、対応する位置のキーフレームの"easing"プロパティに割り当てる。

    12. property-indexed keyframeの"composite"メンバーが空でない場合:

      1. composite modesを"composite"メンバーからCompositeOperationOrAuto値のシーケンスとして作成。単一値なら長さ1でその値のみ。

      2. composite modesprocessed keyframesより少なければ、先頭から繰り返して同数にする。

      3. auto以外の値を、対応する位置のキーフレーム固有の合成操作に割り当てる。

  6. processed keyframesオフセットでゆるくソートされていなければ、TypeErrorthrowして以降を中止する。

  7. processed keyframes内でキーフレームキーフレームオフセットが非nullかつ0未満または1超過があれば、TypeErrorthrowして以降を中止する。

  8. processed keyframes内の各frameについて:

    1. 各プロパティ値ペアについて、プロパティで定められた構文で値をパースする。

      構文的に無効ならペアを破棄。診断機能を持つユーザーエージェントは適切な警告を出すことが推奨される。

    2. frameタイミング関数を、frameの"easing"プロパティをCSS構文(easingメンバー、EffectTiming辞書で定義)でパースした結果とする。

      パース失敗ならTypeErrorthrowしてこの手順を中止する。

      注: 上記2手順でCSSパーサーを使うため、CSSコメントやエスケープは許容されるが、パース成功時は値に保持されない。

      注: "easing"プロパティのパース失敗時は、objectから全プロパティを読み終えた後に必ずTypeErrorをthrowすること。そうしないと挙動がobservableになり、将来WebIDLで部分的にオープンな辞書型がサポートされた場合と一致しなくなる。

  9. unused easings内の各値を、easingメンバー(EffectTimingインターフェース)で定義されたCSS構文でパースし、失敗したらTypeErrorthrowしてこの手順を中止する。

    この最終ステップは、次のすべてのケースで一貫した挙動(TypeErrorがthrowされる)を保証するために必要です:

    elem.animate({ easing: 'invalid' });
    elem.animate({ easing: ['invalid'] });
    elem.animate([{ easing: 'invalid' }]);
    

6.6.4. KeyframeEffectOptions辞書

KeyframeEffect(target, keyframes, options) コンストラクタに追加パラメータとして KeyframeEffectOptions オブジェクトを渡すことができます。

dictionary KeyframeEffectOptions : EffectTiming {
    CompositeOperation composite = "replace";
    CSSOMString?       pseudoElement = null;
};
composite, CompositeOperation、デフォルト値 "replace"

このアニメーションを効果スタックと合成する際に使用する合成操作CompositeOperation列挙型値で指定されます。 autoキーフレーム固有の合成操作を指定した全てのキーフレームに適用されます。

pseudoElement, CSSOMString、null許容、デフォルト値null

指定する疑似要素セレクタ(有効な値またはnull)。ターゲット要素が与えられている場合の効果ターゲットを指定します。

6.7. CompositeOperationおよびCompositeOperationOrAuto列挙型

キーフレーム効果の合成動作の値はCompositeOperation列挙型で表されます。

enum CompositeOperation { "replace", "add", "accumulate" };
replace

replace合成操作に対応し、アニメーション効果基底値を上書きします。

add

add合成操作に対応し、アニメーション効果加算基底値と合成されます。

accumulate

accumulate合成操作に対応し、アニメーション効果累積基底値と合成されます。

キーフレームの合成動作で使える値はCompositeOperation 列挙型値に加え、autoが追加されます。

enum CompositeOperationOrAuto { "replace", "add", "accumulate", "auto" };
auto

関連付けられたキーフレーム効果合成操作を使用することを示します。

6.8. Animatableインターフェースミックスイン

KeyframeEffect オブジェクトのターゲットとなる可能性があるオブジェクトは、 Animatable インターフェースミックスインを実装します。

interface mixin Animatable {
    Animation           animate(object? keyframes,
                                optional (unrestricted double or KeyframeAnimationOptions) options = {});
    sequence<Animation> getAnimations(optional GetAnimationsOptions options = {});
};

dictionary KeyframeAnimationOptions : KeyframeEffectOptions {
    DOMString id = "";
    AnimationTimeline? timeline;
};

dictionary GetAnimationsOptions {
    boolean subtree = false;
};
Animation animate(keyframes, options)

以下の手順を実行します:

  1. targetをこのメソッドが呼び出されたオブジェクトとする。

  2. target関連Realmで、新しいKeyframeEffect オブジェクトeffectを、KeyframeEffect(target, keyframes, options)コンストラクタと同じ手順で、targettarget引数、keyframesoptionsを渡して構築する。

    この手順で例外が発生した場合は、その例外を伝播させてこの手順を中止する。

  3. optionsKeyframeAnimationOptions オブジェクトの場合、timelineoptionstimelineメンバーか、なければこのメソッドを呼び出した要素のデフォルトドキュメントタイムラインノードドキュメント)とする。

  4. target関連Realmで、新しいAnimation オブジェクトanimationを、Animation()コンストラクタと同じ手順でeffecttimelineを渡して構築する。

  5. optionsKeyframeAnimationOptions オブジェクトの場合、optionsidメンバーの値をanimationid属性に代入する。

  6. animationに対してauto-rewindフラグtrueでアニメーションの再生手順を実行する。

  7. animationを返す。

この節は非規範的です

下記のコード断片:

var animation = elem.animate({ opacity: 0 }, 2000);

は概ね下記と等価です:

var effect = new KeyframeEffect(elem, { opacity: 0 }, 2000);
var animation = new Animation(effect, elem.ownerDocument.timeline);
animation.play();
keyframes

使用するキーフレーム。 この値はKeyframeEffect(target, keyframes, options)コンストラクタのkeyframes引数に渡され、その解釈はそのコンストラクタの定義通りです。

options

作成されるKeyframeEffect およびAnimation のタイミング・アニメーションオプションです。

sequence<Animation> getAnimations(options)

このオブジェクトの関連アニメーションの集合を返します。また、 options パラメータが渡され、 subtree がtrueに設定されている場合は、 このオブジェクトに対するサブツリーの関連アニメーションの集合を返します。

返却リストは、§ 5.4.2 効果スタックで説明される合成順に、効果に関連付けられたアニメーションでソートされます。

このメソッド呼び出しはスタイル変更イベントをターゲット要素に発火します。 そのため、返却リストはアニメーション関連のスタイルプロパティの未処理変更など、保留中のスタイル変更適用後の状態を反映します。

options

getAnimations() で返されるアニメーション集合を制御するパラメータ。

id, DOMString、デフォルト値""

生成されるAnimationid属性に代入する文字列。

timeline, AnimationTimeline、null許容

オプション値。指定すれば新しく作成されるアニメーションに関連付けるタイムラインを指定します。

subtree, boolean、デフォルト値false

trueの場合、getAnimations() を呼び出したオブジェクトのターゲット要素子孫となるアニメーション効果に関連付けられたアニメーションも結果に含めます。

6.9. Documentインターフェースへの拡張

以下の拡張は、Documentインターフェース([DOM]で定義)に追加されます。

partial interface Document {
    readonly attribute DocumentTimeline timeline;
};
timeline, DocumentTimeline、読み取り専用

DocumentTimelineオブジェクト。デフォルトドキュメントタイムラインを表します。

6.10. DocumentOrShadowRootインターフェースミックスインへの拡張

以下の拡張は、DocumentOrShadowRootインターフェースミックスイン([DOM]で定義)に追加されます。

partial interface mixin DocumentOrShadowRoot {
    sequence<Animation> getAnimations();
};
sequence<Animation> getAnimations()

このメソッドを呼び出したドキュメントまたはシャドウルートに対するサブツリーの関連アニメーション集合を返します。

返却リストは、§ 5.4.2 効果スタックで説明される合成順に、効果に関連付けられたアニメーションでソートされます。

このメソッド呼び出しはドキュメントに対しスタイル変更イベントを発火します。 そのため、返却リストはアニメーション関連スタイルプロパティの未処理変更など、保留中のスタイル変更適用後の状態を反映します。

6.11. Elementインターフェースへの拡張

DOM要素はアニメーションのターゲットとなる可能性があるため、Elementインターフェース([DOM])は次のように拡張されます:

Element includes Animatable;

これにより、次のような使い方が可能になります。

elem.animate({ color: 'red' }, 2000);

6.12. AnimationPlaybackEventインターフェース

アニメーション再生イベントは、AnimationPlaybackEvent インターフェースで表現されます。

[Exposed=Window]
interface AnimationPlaybackEvent : Event {
    constructor(DOMString type, optional AnimationPlaybackEventInit eventInitDict = {});
    readonly attribute double? currentTime;
    readonly attribute double? timelineTime;
};
dictionary AnimationPlaybackEventInit : EventInit {
    double? currentTime = null;
    double? timelineTime = null;
};
AnimationPlaybackEvent(type, eventInitDict)

AnimationPlaybackEventオブジェクトを、イベントの構築現行標準で定義された手順に従い構築します([DOM])。

currentTime, double、読み取り専用、null許容

イベントがキューに入った瞬間に、そのイベントを生成したアニメーション現在時刻。 イベント生成時にアニメーションアイドル状態ならnullとなります。

timelineTime, double、読み取り専用、null許容

イベントがキューに入った瞬間、そのイベントを生成したアニメーションが関連付けられているタイムライン時刻値。 イベント生成時にアニメーションアクティブでないタイムラインに関連付けられていた場合はnullとなります。

currentTime, double、null許容、デフォルト値null

currentTime属性の説明を参照。

timelineTime, double、null許容、デフォルト値null

timelineTime属性の説明を参照。

6.13. モデルのライブネス

モデルのいずれかの部分に変更が加えられると、タイミングモデル全体が更新され、それに依存するスタイルも更新されます。

特に記載がない限り、 この現行標準のプログラミングインターフェース節で定義されたインターフェースの メソッド・コンストラクタの呼び出しや、 メンバーの取得・設定を行っても、 スタイル変更イベントは発生しません。

注: この現行標準を拡張する他の現行標準は、スタイル変更イベントの要件を、イベントが発生するような状況を導入して精緻化することが期待されます。 例えば、 この現行標準のインターフェースがCSSマークアップで定義された アニメーションを表す場合、 多くのメソッドが指定されたスタイルへの変更を反映するために スタイル変更イベントを発生させる必要があります。

この節は非規範的です

上記要件および現行標準の他の規範的要件に基づき、以下の不変条件が観察できます:

Web Animationsモデルに加えた変更は即座に反映される

例えば、KeyframeEffect が関連付けられたAnimation をプログラミングインターフェース経由でシーク(§ 4.4.4 アニメーションの現在時刻の設定参照)した場合、 アニメーションのstartTimeを取得するとモデルの更新状態が即座に反映されます。

// 初期状態では animation.effect.getComputedTiming().localTime は 3000
animation.currentTime += 2000;
alert(animation.effect.getComputedTiming().localTime); // "5000" が表示される
アニメーションで影響を受けるプロパティの算出スタイルを取得すると、最新のアニメーション状態が返る

例えば、要素の使用スタイルを 新しいAnimation を適用後すぐに取得した場合、 新しいアニメーションの結果も値に反映されます。

// opacity を即座に 0 に設定
elem.animate({ opacity: 0 }, { fill: 'forwards' });
alert(window.getComputedStyle(elem).opacity); // "0" が表示される
同じタスク内の変更は同期され、変更セット全体がまとめて描画される

モデルへの変更が即座に反映されることと、ECMAScriptのrun-to-completionセマンティクスが組み合わさって、 例えばスタイルの変更だけが単独で描画され、アニメーションが適用されないような状況は決して起こらないはずです。

// Element.animate 非対応ブラウザのためのフェードアウトのフォールバック
//
elem.style.opacity = '0';
elem.animate([ { opacity: 1 }, { opacity: 0 } ], 500);

注: ただし上記例では、ユーザーエージェントによっては上記変更が全く反映されていないフレームを描画する場合があります。 これは例えば、描画が別プロセスで行われ、上記タスク完了直後にスケジュールされていて、変更がプロセスに伝達される前にレンダリングされる場合に起こり得ます。

currentTime属性で取得されるドキュメントタイムラインの値は、タスク内で変化しない

タイムラインが、アニメーション更新とイベント送信手順の実行ごとに 現在時刻を更新する要件があるため、 同じスクリプトブロック内で長いコードを実行する間にcurrentTimeを2回取得しても、 下記例のように同じ値が返ります。

var a = document.timeline.currentTime;
// ... 多くのコード ...
var b = document.timeline.currentTime;
alert(b - a); // "0" が表示される
requestAnimationFrameコールバックに渡される時刻は document.timeline.currentTime と等しい

HTMLのイベントループ処理モデルで、 アニメーション更新とイベント送信手順が アニメーションフレームコールバックの実行前に 実行されること、そしてそのコールバックに渡される時刻は両手順とも同じnowタイムスタンプが使われることから、 デフォルトドキュメントタイムライン現在時刻requestAnimationFrameに渡される時刻と一致するはずです。

window.requestAnimationFrame(function(now) {
  // "0" が表示される
  alert(now - document.timeline.currentTime);
});
このプログラミングインターフェースのメソッド呼び出しは通常トランジションを発生させない

次の例を考えます:

// トランジション開始点のセットアップ
div.style.opacity = '1';
getComputedStyle(div).opacity;

// トランジション終了点のセットアップ
div.style.transition = 'opacity 1s';
div.style.opacity = '0';

// アニメーションを発火
div.animate({ opacity: [0.5, 1] }, 500);

// トランジション終了待ち -- 下記は決して呼ばれない!
div.addEventListener('transitionend', () => {
  console.log('transitionend');
});

この場合、animate() を呼び出してもスタイル変更イベントは発生しません。 その結果、保留中のスタイル変更は新しいアニメーションによるスタイル変更と同時に処理されます。 アニメーションスタイルが 変更前スタイル変更後スタイルを上書きするため、 トランジションは生成されず、 transitionendイベントのイベントハンドラは決して呼ばれません。

7. メディアフラグメントとの統合

Media Fragments現行標準[MEDIA-FRAGS]は、メディアリソースの時間的範囲を指定する手段を定義しています。 メディアフラグメントの適用は、指定されたリソースのMIMEタイプに依存します。 SVG MIMEタイプのリソース[SVG11]では、時間パラメータの適用は Animation Elements現行標準で定義されています。

注: メディアフラグメントはリソースのMIMEタイプに基づいて動作するよう定義されています。 そのため、Web Animationsコンテンツが使用されるすべての場面で時間的指定がサポートされるとは限りません。

8. ページ表示との連携

HTMLはユーザーエージェントがユーザーエージェント定義の状態セッション履歴エントリと共に保存できることを許可しており、ユーザーがページ間を移動する際に ページの以前の状態(スクロール位置など[HTML])を復元できます。

参照ドキュメントがアンロード・遷移された際にメディア要素を一時停止・再開するユーザーエージェントは、 Web Animationsコンテンツを含むドキュメントにも一貫した扱いを適用することが推奨されます。 もし提供される場合、この動作は、壁時計時間を追跡するタイムラインすべての時刻値を調整することで達成すべきです。

これは、 時刻値navigationStart 基準で、 requestAnimationFramedocument.timeline.currentTime と同じ時刻を使うことと矛盾しないか? [Issue #2083]

9. 実装要件

9.1. 時刻値の精度

時刻値の内部表現は実装依存ですが、ユーザーエージェントは入力時刻値をマイクロ秒精度で表現できることが推奨されます。これにより、ミリ秒を名目上表す時刻値0.001と0.0を区別できるようになります。

9.2. 適合性基準

この現行標準はアニメーションの抽象モデルを定義しているため、スクリプティング非対応のユーザーエージェントには、テスト可能な表面がないため適合性基準はありません。

ただし、スクリプティング非対応のユーザーエージェントがこの現行標準に基づく追加技術を実装する場合は、本現行標準で定義された内容が追加技術の適合性基準の一部となります。

適合するスクリプト対応Web Animationsユーザーエージェントとは、§ 6 プログラミングインターフェースで定義されたAPIを実装するユーザーエージェントです。

10. 謝辞

Steve Block、Michael Giuffrida、Ryan Seys、Eric Willigersの本現行標準への貢献に感謝します。

また、提案されたスムーズタイミング関数の数式について助言をいただいたMichiel "Pomax" Kamermansにも感謝します(この機能は後続の現行標準に延期されています)。

放送用アニメーション制作のプロセスと技術を編集者に親切に紹介してくださり、寛大なご協力とご辛抱をいただいたSouthern Star Animationの皆様に深く感謝いたします。

11. 前回公開以降の変更点

以下は2022年9月8日ワーキングドラフト以降の変更点です:

changelogで詳細履歴を確認できます。

付録A:既存プロパティのアニメーション型

通常、プロパティのアニメーション型は定義とともに記載されています。 しかし、古い仕様や成熟度の高い仕様で定義されたプロパティには アニメーション型情報が記載されていない場合があります。 そのようなプロパティは、以下の例外を除き、すべて算出値によるアニメーション型とみなします。

font-weightのアニメーション

font-weightプロパティ値(レベル4以前)は次のように合成されます:

注: この定義は[CSS-FONTS-4]で廃止されており、font-weight値が100の倍数である必要はなくなりました。 その場合、アニメーション型は単に算出値によるとなります。

visibilityのアニメーション

visibilityプロパティについて、visibleは離散的なステップで補間されます。 0~1の間のpの値はvisibleにマップされ、その他の値はより近い端点にマップされます。 どちらの値もvisibleでない場合は離散アニメーションとなります。

box-shadowおよびtext-shadowのアニメーション

box-shadowtext-shadowプロパティのアニメーションは、合成の手順に従い、影リストの合成として以下のように処理されます:

リスト内の各シャドウ(noneは長さ0のリストとして扱う)は、算出値によるの挙動で各成分ごとに補間されます。 ただし、両方の入力シャドウがinsetか両方ともinsetでない場合は、補間後のシャドウもその属性を一致させなければなりません。 入力シャドウのペアのいずれかが一方のみinsetの場合は、影リスト全体が離散アニメーションとなります。 シャドウリストの長さが異なる場合は、短い方のリストの末尾に 色がtransparent、全長が0、inset属性(または非inset)が長い方に合わせられたシャドウをパディングします。

2つの影リスト VaVb加算は、リストの連結として定義され、VresultVa拡張したものにVbを追加したものになります。

2つの影リスト累積は上記補間ルールに従い、各成分ごとに型に応じて加算を行うか、inset属性が一致しない場合は離散アニメーションにフォールバックします。

適合性

文書の規約

適合性要件は、記述的な主張とRFC 2119用語の組み合わせで表現されます。主要な語句「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」は、この文書の規範的部分ではRFC 2119に記載された通りに解釈されます。 ただし、可読性のため本現行標準ではこれらの語はすべて大文字では表記されません。

この現行標準のすべてのテキストは、明示的に非規範的と示されたセクション、例、および注記を除き規範的です。[RFC2119]

この現行標準の例は、「例えば」という語で導入されるか、class="example"で規範的テキストから区別されて示されます。例えば:

これは情報提供的な例です。

情報提供的な注記は「注」と始まり、class="note"で規範的テキストから区別されて示されます。例えば:

注: これは情報提供的な注記です。

助言は特別な注意を促すために規範的なセクションとしてスタイルされ、他の規範的テキストから<strong class="advisement">で区別されます。例えば: UAは必ずアクセシブルな代替手段を提供しなければなりません。

適合性クラス

この現行標準への適合性は、以下の3つの適合性クラスで定義されます:

スタイルシート
CSS スタイルシート
レンダラー
UA(ユーザーエージェント)。スタイルシートの意味を解釈し、それを使用する文書を描画します。
オーサリングツール
UA(ユーザーエージェント)。スタイルシートを書き出します。

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

レンダラーが本現行標準に適合するためには、スタイルシートを適切な仕様に従って解釈することに加え、本現行標準で定義されたすべての機能を正しくパースし、文書をそれに従ってレンダリングする必要があります。ただし、UAがデバイスの制約により文書を正しく描画できない場合でも、UAが非適合とみなされることはありません。(例えば、UAはモノクロモニターで色を描画する必要はありません。)

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

部分的な実装

作者が将来互換性のあるCSSパース規則を利用してフォールバック値を割り当てられるよう、CSSレンダラーは、利用可能なレベルのサポートがない@ルール、プロパティ、プロパティ値、キーワード、その他の構文構成要素を無効として(必要に応じて無視)扱わなければなりません。特に、ユーザーエージェントは、サポートされていない値のみを選択的に無視し、サポートされている値のみを複数値プロパティ宣言で適用してはなりません。いずれかの値が無効(=サポートされない値)とみなされる場合、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-ANIMATIONS-1]
David Baron 他. CSS Animations Level 1. 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-ANIMATIONS-2]
David Baron、Brian Birtles. CSS Animations Level 2. 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-2/
[CSS-BACKGROUNDS-3]
Bert Bos、Elika Etemad、Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-3]
Elika Etemad、Tab Atkins Jr.. CSS Cascading and Inheritance Level 3. 2021年2月11日. REC. URL: https://www.w3.org/TR/css-cascade-3/
[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]
Tab Atkins Jr.、Chris Lilley、Lea Verou. CSS Color Module Level 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[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-EASING-1]
Brian Birtles、Dean Jackson、Matt Rakow. CSS Easing Functions Level 1. 2023年2月13日. CR. URL: https://www.w3.org/TR/css-easing-1/
[CSS-FONTS-4]
John Daggett、Myles Maxfield、Chris Lilley. CSS Fonts Module Level 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-LOGICAL-1]
Rossen Atanassov、Elika Etemad. CSS Logical Properties and Values Level 1. 2018年8月27日. WD. URL: https://www.w3.org/TR/css-logical-1/
[CSS-PROPERTIES-VALUES-API-1]
Tab Atkins Jr. 他. CSS Properties and Values API Level 1. 2020年10月13日. WD. URL: https://www.w3.org/TR/css-properties-values-api-1/
[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/
[CSS-STYLE-ATTR]
Tantek Çelik、Elika Etemad。 CSSスタイル属性。2013年11月7日。REC。URL: https://www.w3.org/TR/css-style-attr/
[CSS-TEXT-DECOR-4]
Elika Etemad、石井宏治。 CSSテキストデコレーションモジュール レベル4。2022年5月4日。WD。URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-TRANSFORMS-1]
Simon Fraser 他。 CSS変形モジュール レベル1。2019年2月14日。CR。URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TRANSITIONS-1]
David Baron 他。 CSSトランジション。2018年10月11日。WD。URL: https://www.w3.org/TR/css-transitions-1/
[CSS-TRANSITIONS-2]
CSSトランジションレベル2 URL: https://drafts.csswg.org/css-transitions-2/
[CSS-VALUES-4]
Tab Atkins Jr.、Elika Etemad。 CSS値と単位モジュール レベル4。2023年4月6日。WD。URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.。 CSSカスタムプロパティ(カスケーディング変数)モジュール レベル1。2022年6月16日。CR。URL: https://www.w3.org/TR/css-variables-1/
[CSS-WILL-CHANGE-1]
Tab Atkins Jr.。 CSS Will Changeモジュール レベル1。2022年5月5日。CR。URL: https://www.w3.org/TR/css-will-change-1/
[CSS-WRITING-MODES-3]
Elika Etemad、石井宏治。 CSS書字モードモジュール レベル3。2019年12月10日。REC。URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad、石井宏治。 CSS書字モードモジュール レベル4。2019年7月30日。CR。URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos 他。 カスケーディングスタイルシート レベル2改訂1 (CSS 2.1) 現行標準。2011年6月7日。REC。URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos。 カスケーディングスタイルシート レベル2改訂2 (CSS 2.2) 現行標準。2016年4月12日。WD。URL: https://www.w3.org/TR/CSS22/
[CSSOM]
Daniel Glazman、Emilio Cobos Álvarez。 CSSオブジェクトモデル(CSSOM)。2021年8月26日。WD。URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren。 DOM現行標準。現行標準。URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語現行標準。URL: https://tc39.es/ecma262/multipage/
[HR-TIME]
Yoav Weiss。 高精度時刻(High Resolution Time)。2023年4月25日。WD。URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren 他。 HTML現行標準。現行標準。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren、Domenic Denicola。 Infra現行標準。現行標準。URL: https://infra.spec.whatwg.org/
[MEDIA-FRAGS]
Raphaël Troncy 他。 Media Fragments URI 1.0 (基本)。2012年9月25日。REC。URL: https://www.w3.org/TR/media-frags/
[MOTION-1]
Dirk Schulze 他。 モーションパスモジュール レベル1。2018年12月18日。WD。URL: https://www.w3.org/TR/motion-1/
[RFC2119]
S. Bradner。 RFC内の要件レベルを示すキーワード。1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik 他。 セレクター レベル3。2018年11月6日。REC。URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad、Tab Atkins Jr.。 セレクター レベル4。2022年11月11日。WD。URL: https://www.w3.org/TR/selectors-4/
[SVG11]
Erik Dahlström 他。 スケーラブル・ベクター・グラフィックス (SVG) 1.1(第2版)。2011年8月16日。REC。URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds 他。 スケーラブル・ベクター・グラフィックス (SVG) 2。2018年10月4日。CR。URL: https://www.w3.org/TR/SVG2/
[WEB-ANIMATIONS-2]
Brian Birtles、Robert Flack。 Web Animations レベル2。2023年2月21日。WD。URL: https://www.w3.org/TR/web-animations-2/
[WEBIDL]
Edgar Chen、Timothy Gu。 Web IDL現行標準。現行標準。URL: https://webidl.spec.whatwg.org/

参考情報文献

[SMIL-ANIMATION]
Patrick Schmitz、Aaron Cohen。 SMILアニメーション。2001年9月4日。REC。URL: https://www.w3.org/TR/smil-animation/

IDL索引

[Exposed=Window]
interface AnimationTimeline {
    readonly attribute double? currentTime;
};

dictionary DocumentTimelineOptions {
  DOMHighResTimeStamp originTime = 0;
};

[Exposed=Window]
interface DocumentTimeline : AnimationTimeline {
  constructor(optional DocumentTimelineOptions options = {});
};

[Exposed=Window]
interface Animation : EventTarget {
    constructor(optional AnimationEffect? effect = null,
                optional AnimationTimeline? timeline);
             attribute DOMString                id;
             attribute AnimationEffect?         effect;
             attribute AnimationTimeline?       timeline;
             attribute double?                  startTime;
             attribute double?                  currentTime;
             attribute double                   playbackRate;
    readonly attribute AnimationPlayState       playState;
    readonly attribute AnimationReplaceState    replaceState;
    readonly attribute boolean                  pending;
    readonly attribute Promise<Animation>       ready;
    readonly attribute Promise<Animation>       finished;
             attribute EventHandler             onfinish;
             attribute EventHandler             oncancel;
             attribute EventHandler             onremove;
    undefined cancel();
    undefined finish();
    undefined play();
    undefined pause();
    undefined updatePlaybackRate(double playbackRate);
    undefined reverse();
    undefined persist();
    [CEReactions]
    undefined commitStyles();
};

enum AnimationPlayState { "idle", "running", "paused", "finished" };

enum AnimationReplaceState { "active", "removed", "persisted" };

[Exposed=Window]
interface AnimationEffect {
    EffectTiming         getTiming();
    ComputedEffectTiming getComputedTiming();
    undefined            updateTiming(optional OptionalEffectTiming timing = {});
};

dictionary EffectTiming {
    double                             delay = 0;
    double                             endDelay = 0;
    FillMode                           fill = "auto";
    double                             iterationStart = 0.0;
    unrestricted double                iterations = 1.0;
    (unrestricted double or DOMString) duration = "auto";
    PlaybackDirection                  direction = "normal";
    DOMString                          easing = "linear";
};

dictionary OptionalEffectTiming {
    double                             delay;
    double                             endDelay;
    FillMode                           fill;
    double                             iterationStart;
    unrestricted double                iterations;
    (unrestricted double or DOMString) duration;
    PlaybackDirection                  direction;
    DOMString                          easing;
};

enum FillMode { "none", "forwards", "backwards", "both", "auto" };

enum PlaybackDirection { "normal", "reverse", "alternate", "alternate-reverse" };

dictionary ComputedEffectTiming : EffectTiming {
    unrestricted double  endTime;
    unrestricted double  activeDuration;
    double?              localTime;
    double?              progress;
    unrestricted double? currentIteration;
};

[Exposed=Window]
interface KeyframeEffect : AnimationEffect {
    constructor(Element? target,
                object? keyframes,
                optional (unrestricted double or KeyframeEffectOptions) options = {});
    constructor(KeyframeEffect source);
    attribute Element?           target;
    attribute CSSOMString?       pseudoElement;
    attribute CompositeOperation composite;
    sequence<object> getKeyframes();
    undefined        setKeyframes(object? keyframes);
};

dictionary BaseComputedKeyframe {
     double?                  offset = null;
     double                   computedOffset;
     DOMString                easing = "linear";
     CompositeOperationOrAuto composite = "auto";
};

dictionary BasePropertyIndexedKeyframe {
    (double? or sequence<double?>)                         offset = [];
    (DOMString or sequence<DOMString>)                     easing = [];
    (CompositeOperationOrAuto or sequence<CompositeOperationOrAuto>) composite = [];
};

dictionary BaseKeyframe {
    double?                  offset = null;
    DOMString                easing = "linear";
    CompositeOperationOrAuto composite = "auto";
};

dictionary KeyframeEffectOptions : EffectTiming {
    CompositeOperation composite = "replace";
    CSSOMString?       pseudoElement = null;
};

enum CompositeOperation { "replace", "add", "accumulate" };

enum CompositeOperationOrAuto { "replace", "add", "accumulate", "auto" };

interface mixin Animatable {
    Animation           animate(object? keyframes,
                                optional (unrestricted double or KeyframeAnimationOptions) options = {});
    sequence<Animation> getAnimations(optional GetAnimationsOptions options = {});
};

dictionary KeyframeAnimationOptions : KeyframeEffectOptions {
    DOMString id = "";
    AnimationTimeline? timeline;
};

dictionary GetAnimationsOptions {
    boolean subtree = false;
};

partial interface Document {
    readonly attribute DocumentTimeline timeline;
};

partial interface mixin DocumentOrShadowRoot {
    sequence<Animation> getAnimations();
};

Element includes Animatable;

[Exposed=Window]
interface AnimationPlaybackEvent : Event {
    constructor(DOMString type, optional AnimationPlaybackEventInit eventInitDict = {});
    readonly attribute double? currentTime;
    readonly attribute double? timelineTime;
};
dictionary AnimationPlaybackEventInit : EventInit {
    double? currentTime = null;
    double? timelineTime = null;
};

課題索引

「origin time」より良い用語が必要です— 「time origin」とあまりにも似ています。 [Issue #2079]
特定のタイミング関数が存在すると、アニメーション効果への入力反復進行度は[0, 1]の範囲に制限されません。 しかし現状では、キーフレームオフセットは範囲[0, 1]に制限されており、プロパティ値はこの範囲外の入力反復進行度に対して単純に外挿されます。

この制限を撤廃することも検討しましたが、一部ケースでは[0, 1]の範囲外の反復進行度で非線形なプロパティ値変化を指定できることが有用です。 例えば、緑から黄色への補間アニメーションで、オーバーシュートタイミング関数により一時的に黄色を「越えて」赤に補間した後、再び黄色に戻るような場合です。

この効果はキーフレームやタイミング関数の修正で実現できますが、この方法ではタイミングの関心事とアニメーション効果の分離というモデルの原則を損なってしまうように思えます。

この効果をどう実現すべきかは明確ではありませんが、キーフレームオフセットを[0, 1]の範囲外で許可すると、現在規定されている「オフセット0と1のキーフレームが必要に応じて合成される」動作との一貫性が失われる可能性があります。

詳しくは 2013年東京F2Fの議事録の4節(Keyframe offsets outside [0, 1])を参照してください。

<https://github.com/w3c/csswg-drafts/issues/2081>

being rendered [HTML] の定義は、display: contentsに関してはまだ議論中です。 この手順のため、display: contentsを持ち、通常はレイアウトボックスが関連付けられる要素(すなわちconnectedかつ display: noneサブツリーには属さない)はbeing renderedとみなします。

remove()メソッドは、効果を親グループまたはアニメーションのいずれからも削除できます。レベル1でこの仕様を維持し、単純にアニメーション効果をそのアニメーションから削除するものとして定義すべきでしょうか? [Issue #2082]
[[type]]がbreakcontinuereturnの場合はどうすべき?あり得る?
時刻値navigationStart基準で、requestAnimationFramedocument.timeline.currentTimeと同じ時刻を使うことと矛盾しないか? [Issue #2083]