Web アニメーション

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 を通じてテキストを 修正する
Animation at Work Slack の「waapi」チャンネルに参加
IRC: W3C の IRC 上の #webanimations

概要

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

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

この文書の位置付け

この節では、この文書の公開時点における位置付けについて説明する。 現在の W3C 公開文書の一覧 およびこの技術報告書の最新改訂版は、 https://www.w3.org/TR/ にある W3C 技術報告書索引で確認できる。

この文書は、 CSS ワーキンググループによって作業草案として 勧告 トラックを使用して公開された。 作業草案としての公開は、 W3C およびそのメンバーによる承認を意味しない。

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

フィードバックは、 GitHub で課題を提出すること(推奨)により送信し、 タイトルには次のように仕様コード “web-animations” を含めること: “[web-animations] …コメントの概要…”。 すべての課題およびコメントはアーカイブされる。 代わりに、フィードバックを(アーカイブされた)公開メーリングリスト 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 Animations モデルの概要

この節は非規範的である

概観すると、Web Animations モデルは、大部分が 独立した2つの部分、すなわちタイミングモデルアニメーション モデルから構成される。それぞれの役割は次のとおりである:

タイミングモデル

ある時点を受け取り、それをアニメーションの単一の反復内における 比例距離である反復 進行度に変換する。 アニメーションによっては反復するたびに変化するため、 反復インデックスも記録される。

アニメーションモデル

タイミングモデルによって生成された反復進行度の値と反復インデックスを受け取り、 それらを対象プロパティに適用する 一連の値へ変換する。

この流れは図示すると次のように表せる:

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

たとえば、次のようなアニメーションを考える:

最初の3つの点はタイミングモデルに適用される。 6秒の時点では、アニメーションが 2回目の反復の中間まで進んでいると計算され、結果として 0.5 が生成される。 次にアニメーションモデルがその情報を使用して幅を計算する。

この仕様では、まずタイミングモデルを扱い、その後 アニメーションモデルへ進む。

4. タイミングモデル

この節では、Web Animations タイミングモデルの動作について説明し、定義する。

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

この節は非規範的である

Web Animations のタイミングモデルを特徴付ける機能は2つある。それはステートレスであり、 階層的である。

4.1.1. ステートレス

Web Animations のタイミングモデルは、入力時刻を受け取り、 出力となる反復進行度を生成することで動作する。 出力は入力時刻のみに基づき、 以前の入力から独立しているため、このモデルはステートレスであると説明できる。 これにより、このモデルには次の特性がある:

フレームレートに依存しない

出力は以前の入力から独立しているため、 モデルが更新される頻度はその進行に影響しない。 入力時刻が現実世界の時間の進行に比例している限り、 アニメーションは、それを実行するデバイスの能力にかかわらず、 同一の速度で進行する。

方向に依存しない

入力の順序は重要ではないため、このモデルには 方向性がない。 つまり、特別な処理を必要とせずに、 任意の時点へモデルを更新できる。

定数時間でのシーク

各入力はその前の入力から独立しているため、 はるか未来へのシークであっても、 シーク操作に必要な処理は少なくとも潜在的には一定時間で済む。

タイミングモデルのステートレスな動作には、 いくつかの例外がある。

第一に、モデルのプログラミングインターフェイスで定義される多数のメソッドは、 アニメーションの一時停止などの再生制御を提供する。 これらのメソッドは呼び出された時刻に基づいて定義されるため、 状態を持つ。 これらのメソッドは主として利便性のために提供され、 中核となるタイミングモデルの一部ではなく、その上位層として実装される。

同様に、アニメーションの終了動作により、 アニメーションのメディア(関連付けられた効果)の終了時刻を動的に変更すると、 変更が発生する時点によって異なる結果が生じる可能性がある。 この動作は多少望ましくないものではあるが、 直感的で HTML と一貫していると判断されている。 その結果、このモデルを真にステートレスと説明できるのは、そのタイミングプロパティに動的な変更がない場合に限られる。

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

4.1.2. 階層的

タイミングモデルのもう1つの特徴は、時間が継承されることである。 時間はタイムラインから始まり、いくつかの段階を経て、 各アニメーション効果へ流れていく。 各段階では、時間を前後に移動したり、拡大縮小したり、 反転、一時停止、反復したりできる。

タイミングノードの階層
タイミングノードの階層。 ツリー内の各ノードは、その親ノードから時間を導出する。

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

4.2. 時間値

タイミングは、タイミングノード間の時間関係の階層に基づく。 親ノードは、子ノードに対して 時間値の形式でタイミング情報を提供する。

時間値は、名目上、 ある時点からのミリ秒数を表す実数である。 時間値と実時間のミリ秒との関連は、 値が時間階層を通過する際に適用される任意の数の変換によって 不明瞭になる場合がある。

将来、スクロール位置 または UI ジェスチャーに基づくタイムラインが存在する可能性があり、その場合、時間値と ミリ秒との関連はさらに弱くなる。

時間値は、たとえば タイミングノードが 時間値を生成できる状態にない場合には、 未解決であることもある。

4.3. タイムライン

タイムラインは、同期を目的として 時間値の供給源を提供する。

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

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

タイムラインは、その報告された 現在 時刻が、以前に報告された 現在時刻以上である場合、 単調 増加である。

特定の種類の タイムラインでは、 時間 値 time について、 タイムライン時刻を オリジン相対時刻に変換する手順を定義でき、それにより実時間ベースのタイムラインによって生成された 時間 値を比較できる。

タイムラインは、 文書に関連付けられている場合がある。

Document doc について、タイムスタンプ nowアニメーションを更新してイベントを送信するよう求められた場合、 次の手順を実行する:

  1. now をタイムスタンプとして渡し、 doc関連付けられているすべての タイムラインの 現在時刻を更新する。

    タイミングモデルの階層的な性質により、タイムライン現在時刻を更新することには、 次の処理も含まれる:

  2. doc について置換されたアニメーションを削除する

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

    注: これは、前の手順でタイムラインを更新する一環として Promise オブジェクトを解決または拒否した結果としてキューに入れられた マイクロタスクが、アニメーションイベントを配送する前にコールバックを実行することを保証するためである。

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

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

  6. events to dispatch 内の アニメーションイベントを、次のように安定ソートする:

    1. イベントをその 予定イベント時刻でソートし、 より早く発生するよう予定されていたイベントが、 より遅く発生するよう予定されたイベントより前に並ぶようにし、 予定イベント時刻が 未解決であるイベントは、 解決済みの予定イベント時刻を持つイベントより前に並ぶようにする。

    2. 同じ 予定イベント時刻を持つイベントの中では、 その 合成順序によってソートする。

    注: イベントをソートする目的は、 能力が異なり、その結果フレームレートも異なるデバイス上でも、 可能な限りイベントが一貫した順序で配送されることを保証することである。

    注: ソートを安定ソートとする要件は、 同じ予定イベント時刻でイベントがキューに入れられる場合があるためである。たとえば、持続時間がゼロの CSS アニメーションは、animationstart イベントと animationend イベントの両方を配送する場合があり、 これらのイベントの順序は維持されるべきである。

  7. 前の手順で確立された順序を使用して、events to dispatch 内の各イベントを、それぞれ対応する対象に配送する

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

4.3.1. 文書タイムライン

文書タイムラインは、 文書に関連付けられている タイムラインの一種であり、その 現在時刻は、 アニメーションを 更新してイベントを送信する手順が実行されるたびに提供される now タイムスタンプからの固定オフセットとして計算される。 この固定オフセットは、文書タイムラインの オリジン時刻と呼ばれる。

"origin time" より適切な 用語があるはずである— "time origin" とあまりにも似ている。 [Issue #2079]

関連付けられた文書の 時刻起点が確立される前は、 文書タイムライン非アクティブである。

文書 タイムラインアクティブになった後は、単調 増加となる。

Document に関連付けられており、その Documentアクティブな文書ではない 文書タイムラインも、 非アクティブであると見なされる。

文書タイムライン timeline について、 タイムライン 時刻 timeline time をオリジン相対時刻に変換するには、 timeline timetimelineオリジン 時刻の合計を返す。timeline が非アクティブである場合は、未解決時間値を返す。

4.3.2. 既定の文書タイムライン

Document には、既定の文書タイムラインと呼ばれる 文書 タイムラインがある。 既定の文書タイムラインは各文書に固有であり、 document.open() [HTML] の呼び出しを含め、文書の存続期間全体にわたって存続する。

既定の文書タイムラインオリジン時刻はゼロである。

この節は非規範的である

文書 タイムラインに提供される now タイムスタンプ値にはスケーリングが適用されないため、 それが生成する 時間 値は実時間のミリ秒に比例する。

さらに、既定の文書 タイムライン時間 値は、時刻起点からのオフセットがゼロであるため、 document.timeline.currentTime は概ね Performance.now() [HR-TIME] に対応する。ただし、 document.timeline.currentTimeアニメーションを更新してイベントを送信する手順の 呼び出しと呼び出しの間では変化しない。

4.4. アニメーション

この節は非規範的である

タイムラインの子は アニメーションと呼ばれる。 アニメーションは、時間に基づく何らかの動作の静的な記述である アニメーション効果を受け取り、それを タイムラインに 結び付けることで実行する。 アニメーションはまた、一時停止、 シーク、および速度制御を提供することにより、アニメーション効果とその タイムラインとの接続を実行時に制御できるようにする。 アニメーションと アニメーション 効果との関係は、 DVD プレーヤーと DVD の関係に類似している。

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

アニメーションタイミング用文書は、 その タイムライン関連付けられている Document である。 アニメーションがタイムラインに関連付けられていない場合、またはそのタイムラインが 文書に関連付けられていない場合、そのアニメーションには タイミング用文書はない。

アニメーション開始時刻は、その 関連付けられた効果の 再生開始が予定されている時点における、その タイムライン時間値である。 アニメーションの開始時刻は、初期状態では 未解決である。

アニメーションはさらに、 一時停止などの状況で、アニメーションの出力 時間値、すなわちその 現在時刻を固定するために使用される 保持時刻という 時間値も保持する。 保持時刻は、 初期状態では 未解決である。

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

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

アニメーション animation のタイムラインを、null であってもよい new timeline設定する手順は、 次のとおりである:

  1. old timeline を、存在する場合は animation の現在の タイムラインとする。

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

  3. animationタイムラインnew timeline とする。

  4. animation開始 時刻解決済みである場合、animation保持時刻未解決にする。

    注: この手順により、 animation完了再生状態が 「固定」されることなく、更新された 現在時刻に基づいて再評価されることが保証される。

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

4.4.2. アニメーションに関連付けられた効果の設定

アニメーション animation に関連付けられた効果を、null であってもよい new effect設定する手順は、次のとおりである:

  1. old effect を、存在する場合は animation の現在の 関連付けられた効果とする。

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

  3. animation保留中の一時停止タスクがある場合、 animation準備完了になり次第実行されるよう、そのタスクを再スケジュールする。

  4. animation保留中の再生タスクがある場合、animationnew effect を再生する準備が整い次第実行されるよう、そのタスクを再スケジュールする。

  5. new effectnull ではなく、 new effect が別の アニメーション previous animation関連付けられた効果である場合、 previous animation に対して new effect として null を渡し、 アニメーションに 関連付けられた効果を設定する手順(この手順)を実行する。

  6. animation関連付けられた効果new effect とする。

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

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. animation現在の ready promiseanimation解決する

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

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

アニメーション animation開始 時刻を設定する手順は、new start time に対して 次のとおりである:

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

  2. timeline time未解決であり、new start time解決済みである場合、 animation保持時刻未解決にする。

    これにより、アクティブなタイムラインがない場合には、 開始時刻またはアニメーションの 現在時刻いずれか一方しか設定できない、 という不変条件が維持される。

  3. previous current time を、animation現在時刻とする。

    注: これは、前の手順による変更を適用した後の 現在時刻であり、 その変更によって現在時刻が 未解決になる場合がある。

  4. animation保留中の再生速度を適用する

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

  6. animation保持時刻を、次のうち最初に一致する 条件に基づいて更新する。

    new start time解決済みである場合、

    animation再生速度がゼロでない場合、 animation保持時刻未解決にする。

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

    previous current time未解決であっても、 animation保持時刻previous current time に設定する。

  7. animation保留中の再生タスクまたは 保留中の一時停止 タスクがある場合、そのタスクをキャンセルし、 animation現在の ready promiseanimation解決する

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

4.4.6. 関連付けられた効果の待機

この節は非規範的である

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

このようなアニメーションのタイミングを、アニメーションが 起動された瞬間から測ると、必要なセットアップ時間に対応して、 アニメーションの1フレーム目と2フレーム目の間に大きな飛びが生じる可能性がある。

この問題を回避するため、Web Animations では通常、 アニメーションの最初のフレームが完成した時点から アニメーションのタイミングを開始する。 これは、アニメーション上の 未解決開始時刻として表され、 アニメーションが 準備完了になると解決済みになる。 コンテンツは、開始 時刻解決済み時間値に設定することで、この動作を使用しないようにできる。

アニメーションは、次の条件が両方とも真となる最初の時点で 準備完了となる:

4.4.7. 現在の ready promise

アニメーションには、 現在の ready promiseがある。 現在の ready promiseは、初期状態では、アニメーション自身を値として 新しい解決済み Promise を作成する手順を使用して作成され、 アニメーションの 関連する Realmで作成された、解決済みの Promise である。

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

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

たとえば、次のコード断片では、現在の ready promiseが解決されるとき、 アニメーションの状態は 実行中となる。 これは、保留中の 再生タスクがまだキューに入っている間に play 操作が発生し、その結果 現在の ready promiseが再利用されるためである。

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

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

フラグ auto-rewind が与えられたときに、アニメーション animation再生する手順は、 次のとおりである:

  1. aborted pause を、animation保留中の一時停止 タスクがある場合は true、そうでない場合は false となる真偽値フラグとする。

  2. has pending ready promise を、初期値が false の 真偽値フラグとする。

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

  4. auto-rewind フラグが true である場合、存在するなら、 次のうち最初に一致する条件に対応する手順を実行する:

    animation実効再生速度 ≥ 0 であり、 animation現在時刻次のいずれかである場合:

    seek time をゼロに設定する。

    animation実効再生速度 < 0 であり、 animation現在時刻次のいずれかである場合:

    関連付けられた効果の終端が正の無限大である場合、

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

    それ以外の場合、

    seek timeanimation関連付けられた効果の終端に設定する。

  5. 次の3つの条件がすべて満たされる場合:

    seek time をゼロに設定する。

    注: 上記の手順により、 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 promiseを、 animation関連する Realm内の 新しい promiseとする。

  12. animation準備完了になり次第実行されるタスクをスケジュールする。 そのタスクは次の手順を実行しなければならない:

    1. animation開始時刻または 保持 時刻の少なくとも一方が 解決済みであることを表明する。

    2. ready time を、animation準備完了になった瞬間に、 animation に関連付けられていた タイムライン時間値とする。

    3. 存在する場合、次のうち最初に一致する条件に対応する手順を実行する:

      animation保持時刻解決済みである場合、
      1. animation保留中の 再生速度を適用する

      2. new start time を、 animation について ready time - 保持時刻 / 再生速度 を評価した結果とする。 再生速度がゼロである場合、new start time を単に ready time とする。

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

      4. animation再生速度が 0 でない場合、 animation保持 時刻未解決にする。

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

      2. animation保留中の 再生速度を適用する

      3. animation再生速度がゼロである場合、 animation保持 時刻current time to match とする。

      4. new start time を、 animation について ready time - current time to match / 再生速度 を評価した結果とする。 再生速度がゼロである場合、new start time を単に ready time とする。

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

    4. animation現在の ready promiseanimation解決する

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

      上記2つの手順の順序が重要であることに注意。 これにより、長さがゼロの 関連付けられた 効果を持つアニメーションは、その 現在の ready promiseを、現在の finished promiseより先に解決する。

    上記のタスクがスケジュールされているが、まだ実行されていない間、 animation保留中の 再生タスクを持つと説明される。 ただし、タスクの実行中は、animation保留中の再生 タスク持たない

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

    上記の 保留中の再生タスクを非同期に実行するという要件により、 次のようなコードが実装間で一貫して動作することが保証される:

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

    上記のコードで、保留中の再生タスクが同期的に実行された場合、 現在の ready promiseは拒否されないことになる。

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

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

アニメーション未解決開始時刻を持つ場合、 その 現在 時刻は停止する。

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

アニメーション animation一時停止する手順は、 次のとおりである:

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

  2. animation再生 状態一時停止中である場合、 これらの手順を中止する。

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

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

  5. animation現在時刻未解決である場合、 次のうち最初に一致する条件に従って手順を実行する:

    animation再生速度が ≥ 0 である場合、

    seek time をゼロに設定する。

    それ以外の場合、
    animation関連付けられた効果の終端が正の 無限大である場合、

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

    それ以外の場合、

    seek timeanimation関連付けられた効果の 終端に設定する。

  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 promiseを、 animation関連する Realm内の 新しい promiseに設定する。

  10. 次の条件が両方とも真になる、可能な限り早い時点で実行されるタスクをスケジュールする:

    そのタスクは次の手順を実行しなければならない:

    1. ready time を、ユーザーエージェントが animation関連付けられた効果の再生を停止するために必要な 処理を完了した瞬間に animation に関連付けられていた タイムラインの時間値とする。

    2. animation開始時刻解決済みであり、その 保持 時刻が解決済みではない場合、 animation保持時刻を、 (ready time - 開始時刻) × 再生速度 を評価した結果とする。

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

    3. animation保留中の再生速度を適用する

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

    5. animation現在の ready promiseanimation解決する

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

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

    保留中の再生タスクと同様に、ユーザーエージェントは 保留中の 一時停止タスクを非同期に実行しなければならない。ただし、それは次の マイクロタスクチェックポイントと同じくらい早くてもよい。

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

4.4.10. 終端への到達

この節は非規範的である

DVD プレーヤーやカセットプレーヤーは通常、媒体の終端に到達するまで 再生を続け、終端に到達すると停止する。 そのようなプレーヤーが逆方向に再生できる場合、 通常は媒体の先頭に到達すると再生を停止する。 この動作を模倣し、HTML の メディア要素 [HTML] との一貫性を提供するため、 Web Animations のアニメーションの 現在時刻は、 その 関連付けられた効果終了 時刻を超えて順方向に再生されたり、時刻ゼロより前へ逆方向に再生されたりしない。

再生範囲の自然な境界に到達したアニメーションは、 完了したと言う。

現在時刻を制限する効果を図示すると、次のようになる。

アニメーションの現在時刻を制限する効果。
開始時刻が 1s、長さが 3s の 関連付けられた効果、正の 再生 速度を持つ アニメーションについて、 現在時刻を制限する効果。 アニメーションの現在時刻が関連付けられた効果の終端に到達した後、 3s に制限される。

ただし、アニメーション現在時刻を、 関連付けられた効果の終端より後の時刻へ シークすることは可能である。 その場合、現在時刻は進行しないが、 アニメーションはシークされた時刻で一時停止されたかのように動作する。

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

上記のシナリオと同様の動作は、 アニメーションの 関連付けられた効果の長さが変化したときにも生じる場合がある。

同様に、再生 速度が負の場合、現在時刻は時刻ゼロより前には進まない。

4.4.11. 現在の finished promise

各アニメーションには 現在の finished promiseがある。 現在の finished promiseは、初期状態では保留中の Promise オブジェクトである。

このオブジェクトは、アニメーションが 完了再生状態を離れるたびに、 新しい promiseに置き換えられる。

4.4.12. 完了状態の更新

正の 再生速度を持つアニメーションでは、 現在 時刻は、関連付けられた効果の終端に達するまで増加し続ける。

アニメーションの 関連付けられた効果の 終端は、アニメーションの 関連付けられた効果終了 時刻に等しい。 アニメーションに 関連付けられた効果がない場合、 関連付けられた効果の 終端はゼロである。

負の 再生速度を持つアニメーションでは、 現在 時刻はゼロに達するまで減少し続ける。

この境界に到達した(または越えた)実行中のアニメーションで、 解決済み開始時刻を持つものは、 完了したと言う。

この境界を越えることは、アニメーションオブジェクトが変更されるたびに、 以下で定義される アニメーションの完了 状態を更新する手順を使用して確認される。この手順は、アニメーションを 更新してイベントを送信する手順の一部としても実行される。どちらの場合も、以下で定義する did seek フラグは false に設定される。

各アニメーションについて、ユーザーエージェントは、初期状態では 未解決である 以前の現在 時刻という 時間値を保持する。

通常の再生中は、 アニメーション現在 時刻は上述の境界に制限されるが、 アニメーションの 現在時刻を設定する手順を使用して、 アニメーションの現在時刻をそれらの境界外の時刻へシークすることが可能である。

animation について、 did seek フラグ(現在 時刻を設定する後に更新が実行されているかどうかを示す)と、 synchronously notify フラグ(完了イベントのキューイングと finished promise の解決が、該当する場合に直ちに起こることを期待するコンテキストで 更新が呼び出されたことを示す)が与えられた場合に、 アニメーションの完了状態を更新する手順は、 次のとおりである:

  1. unconstrained current time を、 did seek が false の場合に 保持 時刻未解決の時間値で置き換えて、 現在時刻を計算した結果とする。 did seek が true の場合、unconstrained current time現在時刻に等しい。

    注: これは、方向が変化する可能性のあるタイムラインに対応するために必要である。 この定義がなければ、一度完了したアニメーションは、 そのタイムラインが反対方向へ進行した場合でも完了したままとなる。

  2. 次の3つすべての条件が真である場合、

    存在する場合、animation について次のうち最初に一致する条件に基づき、 animation保持時刻を更新する:

    再生速度 > 0 かつ unconstrained current time関連付けられた効果の 終端以上である場合、

    did seek が true の場合、保持時刻unconstrained current time の値とする。

    did seek が false の場合、保持時刻以前の現在時刻関連付けられた効果の終端のうち最大の値とする。 以前の現在時刻未解決である場合、 保持時刻関連付けられた 効果の終端とする。

    再生速度 < 0 かつ unconstrained current time が 0 以下である場合、

    did seek が true の場合、保持時刻unconstrained current time の値とする。

    did seek が false の場合、保持時刻以前の現在時刻とゼロのうち最小の値とする。 以前の現在時刻未解決である場合、 保持時刻をゼロとする。

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

    次の手順を実行する:

    1. did seek が true かつ 保持時刻解決済みである場合、 animation開始時刻を、 timeline time - (保持時刻 / 再生速度) を評価した結果に等しいものとする。ここで timeline time は、 animation に関連付けられた タイムラインの 現在の 時間値である。

    2. 保持時刻未解決とする。

  3. animation以前の現在時刻を、その 現在時刻を計算した結果とする。

  4. animation再生 状態完了である場合、current finished state を true とする。 それ以外の場合は false とする。

  5. current finished state が true であり、 現在の finished promiseがまだ解決されていない場合、次の手順を実行する:

    1. 完了通知手順を、次の手順を指すものとする:

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

      2. animation現在の finished promiseオブジェクトを animation解決する

      3. AnimationPlaybackEvent finishEvent作成する

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

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

      6. finishEventtimelineTime 属性を、animation が関連付けられている タイムライン現在時刻に設定する。 animation がタイムラインに関連付けられていない場合、またはタイムラインが 非アクティブである場合、 timelineTimenull とする。

      7. animationタイミング用文書がある場合、 finishEvent を、その タイミング用文書保留中のアニメーション イベントキューに、その対象 animation とともに追加する。 予定イベント時刻には、 animation関連付けられた効果の終端を オリジン相対時刻に変換した結果を使用する。

        それ以外の場合、animationfinishEvent配送するためのタスクを キューに入れる。 このタスクのタスクソースは、DOM 操作タスク ソースである。

    2. synchronously notify が true である場合、 この animation について 完了通知手順を実行するためにキューに入れられた マイクロタスクをすべてキャンセルし、完了 通知 手順を直ちに実行する。

      それ以外の場合、synchronously notify が false なら、 animation について 完了通知手順を実行するためのマイクロタスクが まだキューに入っていない場合に限り、その手順を実行するための マイクロタスクを キューに入れる

  6. current finished state が false であり、animation現在の finished promiseがすでに解決済みである場合、 animation現在の finished promiseを、animation関連する Realm内の 新しい promiseに設定する。

通常、アニメーションの完了状態に関する通知は 非同期に行われる。これにより、イベントを発火したり promise を解決したりすることなく、 アニメーションが一時的に 完了 再生状態に入ることができる。

たとえば、次のコード断片では、animation は一時的に 完了状態に入る。完了状態の通知が同期的に発生した場合、 このコードによって finish イベントがキューに入れられ、 現在の finished promiseが解決される。しかし、 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.currentTime = 0;

アニメーションを完了する手順と同様に、 アニメーションをキャンセルする手順も、 cancel イベントをキューに入れ、 現在の finished promiseおよび 現在の ready promise同期的に拒否することに注意。

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

アニメーションは、以下で定義する animation について アニメーションを完了する手順を使用することで、 現在の再生方向における自然な終端まで進めることができる:

  1. animation実効再生速度がゼロである場合、 または animation実効再生 速度 > 0 かつ 関連付けられた効果の終端が無限大である場合、 "InvalidStateError" DOMException投げ、 これらの手順を中止する。

  2. animation保留中の再生速度を適用する

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

    再生速度 > 0 の場合、

    limit関連付けられた効果の終端とする。

    それ以外の場合、

    limit をゼロとする。

  4. 現在時刻を limitサイレントに設定する

  5. animation開始時刻未解決であり、animation に関連付けられた アクティブタイムラインがある場合、 開始時刻timeline time - (limit / 再生速度) を評価した結果とする。ここで timeline time は、関連付けられた タイムラインの現在の 時間 値である。

  6. 保留中の一時停止タスクがあり、開始時刻解決済みである場合、

    1. 保持時刻未解決とする。

      通常、保持時刻はすでに未解決である。 ただし、アニメーションが以前 アイドルであった場合を除く。
    2. 保留中の一時停止タスクをキャンセルする。

    3. animation現在の ready promiseanimation解決する

  7. 保留中の再生タスクがあり、開始時刻解決済みである場合、そのタスクをキャンセルし、 animation現在の ready promiseanimation解決する

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

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

アニメーションはキャンセルでき、それにより 現在時刻未解決となり、 関連付けられた効果によって生じた効果がすべて取り除かれる。

animation について アニメーションを キャンセルする手順は、 次のとおりである:

  1. animation再生状態アイドルではない場合、次の手順を実行する:

    1. animation に対して アニメーションの保留中の タスクをリセットする手順を実行する。

    2. 現在の finished promiseを、"AbortError" という名前の DOMException で拒否する

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

    4. 現在の finished promiseを、 animation関連する Realm内の 新しい promiseとする。

    5. AnimationPlaybackEvent cancelEvent作成する

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

    7. cancelEventcurrentTimenull に設定する。

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

    9. cancelEventtimelineTimetimeline time に設定する。timeline time未解決である場合、 null に設定する。

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

      それ以外の場合、animationcancelEvent配送するためのタスクを キューに入れる。 このタスクのタスクソースは、DOM 操作タスク ソースである。

  2. animation保持時刻未解決にする。

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

animation について アニメーションの保留中のタスクをリセットする手順は、 次のとおりである:

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

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

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

  4. animation保留中の再生速度を適用する

  5. animation現在の ready promiseを、"AbortError" という名前の DOMException で 拒否する

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

  7. animation現在の ready promiseを、 animation関連する Realmにおいて、 値 animation を持つ 新しい解決済み Promise オブジェクトを作成した結果とする。

4.4.15. 速度制御

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

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

アニメーションの 再生 速度をゼロに設定すると、実質的にアニメーションが一時停止する (ただし、再生状態が必ずしも 一時停止中になるわけではない)。

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

アニメーション animation再生速度を設定する手順は、 new playback rate に対して次のとおりである:

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

  2. previous time を、再生速度を変更する前の animation現在時刻の値とする。

  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開始時刻を、 animation について 関連付けられた効果の終端 - 開始時刻 を評価した結果に設定する。

    注: これは、非単調タイムライン上で アニメーションの開始時刻と終了時刻を実質的に反転し、 反対方向から見た開始時刻の相対オフセットを維持する。

4.4.15.2. アニメーションの再生速度の シームレスな更新

別のプロセスまたはスレッドで実行されている進行中のアニメーションでは、 アニメーションを実行するプロセスまたはスレッドが、更新を実行する プロセスまたはスレッドと現在同期していない場合、 再生速度を 設定する手順によってアニメーションが飛ぶことがある。

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

アニメーション保留中の再生速度は、初期状態では設定されていない。

animation実効 再生速度は、 保留中の 再生速度が設定されている場合はその値であり、 そうでなければアニメーションの 再生速度である。

アニメーション animation保留中の 再生 速度を適用する場合、次の手順を実行する:

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

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

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

アニメーション animation現在時刻を維持したまま、 new playback rate再生速度をシームレスに更新する手順は次のとおりである:

  1. previous play state を、animation再生状態とする。

    注: animation実効再生速度を更新する前に再生状態を記録する必要がある。 これは、次のロジックで、 animation現在 完了している場合に、 保留中の再生速度を適用した後も完了状態のままであるかどうかに 関係なく、その 保留中の再生速度を 直ちに適用したいためである。

  2. animation保留中の再生速度new playback rate とする。

  3. 次のうち最初に一致する条件に対応する手順を実行する:

    animation保留中の再生タスクまたは 保留中の一時停止タスクがある場合、

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

    注: 種類の異なる保留中のタスクは、 実行時に 保留中の 再生速度を適用するため、この場合、それ以上の処理は必要ない。

    previous play stateアイドルまたは 一時停止中であるか、 animation現在時刻未解決である場合、

    animation保留中の再生速度を適用する

    注: 上記の2番目の条件は、 未解決の現在時刻を持ち、 保留中の再生タスクを持たない 実行中のアニメーションがある場合に、 下記でそれを再生しようとしないようにするために必要である。

    previous play state完了である場合、
    1. unconstrained current time を、 保持時刻未解決の時間値で置き換えて、 animation現在時刻を計算した結果とする。

    2. animation開始時刻を、 次の式を評価した結果とする:

      timeline time - (unconstrained current time / 保留中の再生速度)

      ここで timeline time は、 animation に関連付けられた タイムラインの現在の 時間値である。

      保留中の再生速度がゼロである場合、 animation開始時刻timeline time とする。

    3. animation保留中の再生 速度を適用する

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

    それ以外の場合、

    auto-rewind フラグを false に設定して、 animation について アニメーションを再生する手順を実行する。

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

アニメーション animation逆再生する手順は次のとおりである:

  1. animation に関連付けられた タイムラインがないか、 関連付けられた タイムライン非アクティブである場合、 "InvalidStateError" DOMException投げ、 これらの手順を中止する。

  2. original pending playback rateanimation保留中の再生 速度とする。

  3. animation保留中の再生速度を、その 実効再生速度の加法逆元(すなわち -実効再生速度)とする。

  4. auto-rewind フラグを true に設定して、 animation について アニメーションを再生する手順を実行する。

    アニメーションを再生する手順が例外を投げた場合、 animation保留中の再生速度original pending playback rate に設定し、その例外を伝播する。

4.4.17. 再生状態

アニメーションは、 次の 再生状態の いずれかにあると説明でき、それぞれについて非規範的な説明も示す:

アイドル

アニメーションの 現在時刻未解決であり、 アニメーションの 開始時刻未解決で、保留中のタスクはない。 この状態では、アニメーションは効果を持たない。

実行中

アニメーションには、各 アニメーション フレームで変化する解決済みの 現在時刻がある (再生速度がゼロではなく、 タイムラインアクティブであり、 単調増加である場合)。

一時停止中

アニメーションは停止されており、現在時刻はもはや変化しない。

完了

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

ある時点における アニメーション animation再生状態は、 次のうち最初に一致する条件に対応する状態である:

次の条件がすべて真である:

アイドル

次の条件のいずれかが真である:

一時停止中

animation について、現在時刻解決済みであり、 次の条件のいずれかが真である:

完了

それ以外の場合、

実行中

一時停止中の 再生状態は、実質的に 完了再生状態より「優先される」ことに注意。

ただし、自然な再生範囲の外側で一時停止されているアニメーションは、 以下のように 開始時刻を設定することで、 再起動せずに 一時停止中のアニメーションから 完了したアニメーションへ変換できる:

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. アニメーションイベントの並べ替え

キューに入れられたイベントの並べ替えを支援するため、次の定義を設ける。

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

  1. time未解決である場合、time を返す。

  2. time が無限大である場合、未解決時間値を返す。

  3. animation再生速度がゼロである場合、 未解決時間値を返す。

  4. animation開始時刻未解決である場合、 未解決時間値を返す。

  5. 次の計算結果を返す: time × (1 / playback rate) + start time(ここで playback rate および start time は、それぞれ animation再生速度および 開始時刻である)。

タイムライン timeline時間値と同じ尺度で表される 時間値 time について、 タイムライン時刻を オリジン相対時刻に変換するには、次の手順を実行する:

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

  2. timeline time未解決である場合、 time を返す。

  3. animationタイムラインに関連付けられていない場合、 未解決の時間値を返す。

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

  5. animation に関連付けられたタイムラインについてタイムライン時刻をオリジン相対時刻に変換する手順が存在しない場合、 未解決時間値を返す。

  6. animation に関連付けられたタイムラインについて定義された手順を使用して、 timeline time をオリジン相対時刻に変換した結果を返す。

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

アニメーションは再生されると、 アニメーション再生イベントを通じて、その状態の変化を報告する。

アニメーション 再生イベントはタイミングモデルの特性である。そのため、 アニメーション関連付けられた効果が存在しない場合や、 観察可能な結果を持たない場合でも配送される。

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

アニメーションが 完了再生状態に入るたびにキューに入れられる。

cancel

アニメーションが別の状態から アイドル再生状態に入るたびにキューに入れられる。 初期状態がアイドルである新しい アニメーションを作成しても、 新しい cancel イベントは生成されない

remove

アニメーションが自動的に削除されるたびにキューに入れられる。 § 5.5 アニメーションの置換を参照。

4.5. アニメーション効果

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

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

アニメーション関連付けられた効果は、設定されている場合、 アニメーション効果の一種である。 アニメーション関連付けられた効果は、そのアニメーションに 関連付けられていると言う。 任意の時点で、アニメーション効果は最大1つの アニメーションにのみ 関連付けることができる。

アニメーション効果 effect は、effectアニメーションに 関連付けられており、そのアニメーションがさらに timeline に関連付けられている場合、 timeline関連付けられている

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

この仕様では、単一の種類の アニメーション効果、すなわち キーフレーム効果を定義する。 この仕様の後続レベルでは、さらに別の種類の アニメーション効果を定義する。

すべての種類の アニメーション 効果は、以下の節で説明する多数の共通 プロパティを定義する。

4.5.3. アクティブ区間

アニメーション効果が実行されるようスケジュールされている期間を、 その アクティブ 区間と呼ぶ。 各 アニメーション効果は、このような区間を1つだけ持つ。

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

区間の上限は アクティブ 持続時間によって決定される。

開始時刻開始 遅延、および アクティブ 持続時間の関係を以下に示す。

アクティブ区間の端点に対する開始遅延の効果の例
アクティブ 区間の端点に対する 開始遅延の効果の例。
(a) 遅延のないアニメーション効果。 開始時刻アクティブ区間の開始は一致する。
(b) 正の遅延を持つアニメーション 効果。アクティブ 区間の開始は遅延分だけ後ろにずれる。
(c) 負の遅延を持つアニメーション効果。 アクティブ区間の開始は 遅延分だけ前にずれる。

終了遅延も指定できるが、 主としてアニメーションを順序付ける場合にのみ有用である。

アニメーション効果は、 効果がその効果を生成するようスケジュールされている期間である アクティブ区間を定義する。 ただし、アクティブ 区間の外側にも適用される フィルモードは例外である。

アクティブ 区間の下限は 開始遅延によって定義される。

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

アクティブ 区間の長さを アクティブ 持続時間と呼び、その計算は § 4.8.2 アクティブ持続時間の計算で定義される。

開始遅延と同様に、アニメーション効果には 終了遅延もあり、 主として別の アニメーション効果終了時刻に基づいて アニメーションを順序付ける場合に使用する。 これは通常、この仕様の後続レベルで導入されるシーケンス効果と組み合わせた場合にのみ有用だが、 SVG における min 属性 ([SVG11]、第19章)を表現する目的で ここに含まれている。

アニメーション効果終了時刻は、 max(開始遅延 + アクティブ 持続時間 + 終了遅延, 0) を評価した結果である。

4.5.4. ローカル時刻

任意の時点における アニメーション効果ローカル時刻は、 次のうち最初に一致する条件に基づく:

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

ローカル時刻は アニメーション現在時刻である。

それ以外の場合、

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

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

この節は非規範的である

任意の時点で、アニメーション効果は、3つの可能な フェーズのいずれかにある。 アニメーション効果未解決ローカル 時刻を持つ場合、いずれのフェーズにも属さない。

各フェーズを以下に示す。

アニメーション効果を記述するために使用される各種フェーズと状態の例。
アニメーション 効果を記述するために使用される各種フェーズと状態の例。

フェーズは次のとおりである:

前フェーズ

アニメーション 効果ローカル 時刻が、効果の アクティブ 区間および 終了 時刻より前にあるか、または負の 開始遅延が有効な範囲内にある。

アクティブフェーズ

アニメーション 効果ローカル 時刻が、効果の アクティブ 区間の内側にあり、かつ負の 開始遅延 または負の 終了遅延の範囲外にある。

後フェーズ

アニメーション 効果ローカル 時刻が、効果の アクティブ 区間より後、または(負の 終了遅延により)それより先に来る場合は 終了時刻より後にあるが、 負の 開始遅延が有効な範囲内にはない

これらのフェーズに加えて、アニメーション効果は、 複数の重複する状態のいずれかにあるとも記述できる。 これらの状態は単一の アニメーションフレームの期間だけ確立され、 主としてモデルの状態を持つ部分を記述するための便宜的なものである。

これらの状態とモデル内での用途を次に要約する:

再生中

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

現在

再生 中であるか、またはその アニメーションの現在の 再生速度に基づき将来 再生中になり得る アニメーション効果に対応する。

効果中

解決済みの アクティブ時刻を持つ アニメーション効果に対応する。 これは、アニメーション効果アクティブフェーズにある場合、または アクティブフェーズの外側であっても、 効果の フィル モード§ 4.6 フィル動作を参照)によって アクティブ時刻が解決済みとなる時刻に発生する。 効果中アニメーション効果だけが、 その対象に結果を適用する。

これら各状態の規範的な定義を以下に示す。

アニメーション効果のフェーズを決定するには、 次の定義が必要である:

アニメーション 方向

効果が アニメーションに 関連付けられておりかつ関連付けられた アニメーション再生速度がゼロ未満である場合は "backwards"。 それ以外の場合、アニメーション方向は "forwards" である。

before-active 境界時刻

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

active-after 境界時刻

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

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

  1. ローカル時刻before-active 境界時刻未満である、または

  2. アニメーション 方向が "backwards" であり、ローカル 時刻before-active 境界時刻に等しい。

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

  1. ローカル時刻active-after 境界 時刻より大きい、または

  2. アニメーション 方向が "forwards" であり、ローカル 時刻active-after 境界時刻に等しい。

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

さらに、アニメーション効果が上記のどのフェーズにもない場合を、 アイドルフェーズにあると呼ぶと便利なことが多い。

アニメーション効果は、 次の条件がすべて満たされる場合、 再生中である:

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

  2. アニメーション 効果が、完了していないアニメーションに 関連付けられている

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

アニメーション効果は、§ 4.8.3.1 アクティブ時刻の計算の 手順に従って計算されたその アクティブ 時刻未解決ではない場合、 効果 中である。

4.5.6. 関連するアニメーション

アニメーション関連付けられた アニメーション効果に基づいて、 そのアニメーションが 関連するものと定義できる。

アニメーションは、 次の場合 関連する:

要素または疑似要素 target に対する 関連する アニメーションは、効果ターゲットtarget である アニメーション効果を少なくとも1つ含む、 すべての アニメーションの集合である。

要素、疑似要素、文書、または シャドウ ルートtarget—の サブツリーに対する関連するアニメーションは、 効果ターゲットtarget包含的子孫target文書または シャドウ ルートである場合は 子孫)、 またはそのような子孫の 疑似要素である アニメーション効果を少なくとも1つ含む、 すべての アニメーションの集合である。

4.6. フィル動作

アニメーション 効果再生中でないときの効果は、 その フィルモードによって決定される。

指定可能な フィルモードは次のとおり:

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

著者には、効果が無期限に適用されるアニメーションを生成するために フィルモードを使用しないことが推奨される。 フィルモードは、CSS アニメーション [CSS-ANIMATIONS-1] によって定義される animation-fill-mode プロパティを表現するために導入された。 しかし、これはアニメーション状態が無期限に蓄積される状況を生じさせるため、 § 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) フィルモード "none"。 アニメーション効果はアクティブフェーズの外側では効果を持たない。
(b) フィルモード "forwards"。 アクティブフェーズが終了した後も、 反復進行度の値はフィル値を維持し続ける。
(c) フィルモード "backwards"。アニメーション効果は アクティブフェーズが開始するまでフィル値を生成する。
(d) フィルモード "both"。アクティブフェーズの前後の両方で アニメーション効果がフィル値を生成する。

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

4.7. 反復

4.7.1. 反復区間

アニメーション効果を固定回数または無期限に 反復するよう指定できる。 この反復は アクティブ区間内側で発生する。 1回の反復が行われる時間範囲を 反復 区間と呼ぶ。

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

1回の反復の長さを 反復 持続時間と呼ぶ。 アニメーション効果の初期 反復 持続時間はゼロである。

この節は非規範的である

反復持続時間アクティブ 持続時間を比較すると、次のようになる:

反復持続時間

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

アクティブ持続時間

反復を含め、アニメーション効果全体が完了するまでにかかる時間。 これは 反復持続時間より長い場合も短い場合もある。

反復持続時間アクティブ 持続時間の関係を以下に示す。

反復持続時間とアクティブ時刻の比較。
反復回数が 2.5 であるアニメーション効果について、反復持続時間アクティブ 持続時間を比較したもの。 最後の反復の 反復持続時間自体は 変化せず、単に アクティブ持続時間によって途中で打ち切られることに注意。

4.7.2. 反復の制御

アニメーション効果が反復する回数を、その 反復回数と呼ぶ。 反復回数は、 0 以上の実数である。 反復回数は、アニメーション効果が無期限に反復することを表すため、 正の無限大とすることもできる。

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

これらのパラメーターの動作は、§ 4.8 アニメーション効果の中核計算の計算で定義される。

この節は非規範的である

反復 回数および 反復開始パラメーターの効果を以下に示す。

反復回数および反復開始パラメーターの効果
反復回数および 反復開始パラメーターの効果。
最初の例では 反復回数は 2.5 であり、 3回目の反復はその 反復 区間の途中で半分に打ち切られる。
2番目の例は同じだが、反復開始が 0.5 である。 これにより アニメーション効果は 最初の反復の中間から開始する。

反復 回数パラメーターとは異なり、反復 開始パラメーターは アクティブ 持続時間の長さに影響しない。

反復開始が1以上の値は一般に、 反復合成 操作accumulate である アニメーション効果と組み合わせて使用しない限り、 有用ではないことに注意。

4.7.3. 反復時間空間

この節は非規範的である

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

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

反復するアニメーションは、アニメーションが反復するたびに 新しい時間空間、すなわち反復時間空間を確立すると説明できる。

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

Web Animations モデル内では、アクティブ 時刻も参照する。これはアクティブ区間の開始を基準とする時刻である。 ただし、この時間空間はモデル内部のものであり、 プログラミングインターフェイスやマークアップには公開されない。

これらの時間空間を以下に示す。

ローカル時刻、アクティブ時刻、および反復時刻の比較。
反復持続時間が 1s、反復回数が 2.5 であるアニメーションについて、ローカル時刻、アクティブ時刻、および反復時刻を比較したもの。

注: 時間空間自体には境界がないが、Web Animations は アクティブ時刻 および 反復 進行度を、図に示すように一定の範囲に制限されるよう定義する。 たとえば、-1秒という時刻はアクティブ時間空間では有効な時刻だが、 § 4.8.3.1 アクティブ時刻の計算で定義される アクティブ時刻を計算する手順は 負の値を返すことはない。

これらの時間空間に加えて、 現在のグローバルオブジェクトDocument既定の文書タイムライン時間 値の時間空間である文書時間空間も参照できる。

4.7.4. 区間タイミング

この節は非規範的である

アニメーション効果が反復するとき、反復境界での動作を定義する必要がある。 このため、そして実際にはすべての区間タイミングについて、 Web Animations は終端を含まないタイミングモデルを使用する。 これは、区間の開始時刻は区間に含まれる一方、 終了時刻は含まれないことを意味する。 区間表記では [begin, end) と記述できる。 このモデルでは区間同士が重ならないため、 区間が反復または順序付けされる場合に自然な動作が得られる。

以下の例では、反復効果についてローカル時刻が 1s のとき、 反復時刻は 0 である。 順序付けされたアニメーションでは、タイムライン時刻が 1s のとき、 アニメーション B の 関連付けられた効果だけが 再生中となり、重複はない。

終端を含まないタイミングの図。
終端を含まないタイミングの図。反復されたアニメーション効果と 順序付けされたアニメーション効果のどちらでも、 区間間の境界で重複はない。

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

反復とフィルが反復時刻に与える効果。
1回の反復後、反復進行度は 0 だが、2回の 反復後(およびそれ以降)は、アニメーション効果がフィルするときに定義された特殊な動作により、 反復進行度は 1 となる。

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

4.8.1. 概要

この節は非規範的である

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

この処理の最初の手順は、 アクティブ 持続時間によって決定される アクティブ区間の境界を計算することである。

この処理を以下に示す。

アクティブ持続時間の計算。
反復持続時間反復回数を乗算することに基づく アクティブ持続時間の計算。

アクティブ持続時間を計算する処理は、 § 4.8.2 アクティブ持続時間の計算で規範的に定義される。

アクティブ持続時間が確立された後、 アニメーション効果ローカル時刻を、その 変換済み進行度反復 進行度)へ変換する処理を以下に示す。

タイミングモデルの計算の概要。
タイミングモデルの計算の概要。
(1) ローカル時刻は、関連付けられた アニメーションから決定される。
(2) ローカル時刻は、開始 遅延を組み込むことによって アクティブ時刻へ変換される。
(3) アクティブ時刻反復 持続時間で除算し、さらに 反復開始プロパティを組み込んで 全体 進行度を生成する。
(4) 全体進行度の時刻は 次に単一の反復内のオフセット、すなわち 単純反復進行度へ変換される。
(5) 単純反復進行度は、 再生方向を組み込むことで 方向付き 進行度へ変換される。
(6) 最後に、タイミング関数が 方向付き 進行度に適用され、変換済み進行度が生成される。

最初の手順である ローカル時刻の計算については、 § 4.5.4 ローカル時刻で説明する。 図の手順2から4については以下の節で説明する。 手順5および6については、それぞれ § 4.9.1 方向付き進行度の計算および § 4.10.1 変換済み進行度の計算で説明する。

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

アクティブ持続時間は、 次のように計算される:

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

反復持続時間または 反復回数のいずれかがゼロである場合、 アクティブ持続時間は ゼロである。

IEEE 754-2008 によれば無限大にゼロを乗算した結果は未定義であるため、 この明確化が必要である。

4.8.3. ローカル時刻の変換

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

アクティブ時刻は、 ローカル時刻開始遅延に基づく。 ただし、これは アニメーション効果が 出力を生成すべき場合にのみ定義されるため、その フィルモードおよび フェーズに次のように依存する。

アニメーション効果が 前 フェーズにある場合、

結果は、次のうち最初に一致する条件に依存する。

フィル モードbackwards または both である場合、

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

それ以外の場合、

未解決時間値を返す。

アニメーション効果が アクティブ フェーズにある場合、

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

アニメーション効果が 後フェーズにある場合、

結果は、次のうち最初に一致する条件に依存する。

フィル モードforwards または both である場合、

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

それ以外の場合、

未解決時間値を返す。

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

未解決時間値を返す。

4.8.3.2. 全体進行度の計算

全体進行度は、 完了した反復の数(部分的な反復を含む)を表し、次のように定義される:

  1. アクティブ時刻未解決である場合、 未解決を返す。

  2. 次のうち最初に一致する条件に基づいて、 overall progress の初期値を計算する。

    反復持続時間がゼロである場合、

    アニメーション効果が 前フェーズにある場合、 overall progress をゼロとし、それ以外の場合は 反復回数に等しいものとする。

    それ以外の場合、

    overall progressアクティブ時刻 / 反復持続時間 を計算した結果とする。

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

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

単純 反復進行度は、現在の反復内の進行を表す割合であり、 再生方向や、効果に適用される タイミング 関数によって時間に導入される変換を無視したもので、次のように計算される:

  1. 全体 進行度未解決である場合、 未解決を返す。

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

  3. 次の条件がすべて真である場合、

    simple iteration progress を 1.0 とする。

    上記の手順は、アニメーションのアクティブ区間が 反復の終端ちょうどで終了する場合、 次の反復の開始ではなく、最後の反復の終端を保持してフィルする動作を実装する。

    最後の条件は、反復回数がゼロであったために そもそもアニメーションの反復を1回も再生しなかった場合に、 この処理が適用されることを防ぐ。

  4. simple iteration progress を返す。

4.8.4. 現在の反復の計算

現在の反復は、 次の手順を使用して計算できる:

  1. アクティブ時刻未解決である場合、 未解決を返す。

  2. アニメーション効果が 後フェーズにあり、かつ 反復回数 が無限大である場合、無限大を返す。

  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 とし、それ以外の場合は current direction を 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. アニメーション効果が 前フェーズにあり、かつ going forwards が true の場合、または アニメーション効果が 後フェーズにあり、かつ going forwards が false の場合に、before flag を設定する。

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

4.11. 反復進行度

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

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

この節は非規範的である

一部の種類の アニメーション効果では、Web Animations のアニメーション モデルは、タイミングモデルによって生成された 反復進行度および 現在の反復の値を受け取り、 対応する出力を計算するために使用する。

そのような各アニメーション効果の出力は、 対象プロパティに適用される前に、効果 スタックを使用して他の効果の出力と結合される (§ 5.4 効果の結合を参照)。

5.1. はじめに

アニメーション効果には、 タイミング出力の変化に応じて影響を与える、 0個以上の関連付けられたプロパティがある。これらのプロパティを 効果の 対象 プロパティと呼ぶ。

反復 進行度現在の反復、および 基底値が与えられた場合、 アニメーション効果は、 プロパティに適した アニメーション型の手順を適用することで、 各 アニメーション可能対象プロパティについて 効果値を生成する。

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

特に指定がない限り、すべての CSS プロパティは アニメーション可能である。 プロパティ値をどのように結合するかは、 各プロパティのプロパティ定義表にある アニメーション型の行で定義される:

アニメーション不可
このプロパティはアニメーション可能ではない。 アニメーションのキーフレームに列挙されても処理されず、 トランジションの影響も受けない。

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

注: アニメーション不可なプロパティだけを対象とする アニメーション効果も、 イベントの発火や、アニメーション現在の finished promiseの履行を遅延させることなど、 通常の アニメーション効果としての動作は引き続き示す。

離散
プロパティの値を意味のある形で結合できないため、 加算可能ではなく補間では 50%(p=0.5)で Va から Vb に切り替わる。 すなわち、
V result = V start if p < 0.5 V end if p 0.5
計算値による
計算 値の対応する個々の成分を、その値型について示された手順を使用して 結合(補間、加算、または累積)する (CSS Values 4 § 3 値の結合: 補間、加算、および累積を参照)。 成分の数または対応する成分の型が一致しない場合、 またはいずれかの成分値が 離散アニメーションを使用し、 対応する2つの値が一致しない場合、 プロパティ値は 離散として結合される。
反復可能リスト
計算 値による場合と同じだが、2つのリストの項目数が異なる場合、 最初に項目数が最小公倍数になるまで各リストを反復する。 その後、各項目を 計算値によって結合する。 値の組を結合できない場合、 またはいずれかの成分値が 離散アニメーションを使用する場合、 プロパティ値は 離散として結合される。

注: 反復可能リストの概念により、 概念上ある長さまで反復されるリスト (たとえば background-originbackground-image リストの長さまで反復される場合)や、 無限に反復されるリストが、 任意の値の間を滑らかに遷移できるようになり、 計算値がその結果を適切に表現 (そして場合によっては適切に継承)できるようになる。

(本文を参照)
一部のプロパティには、上記のケースでは扱われない 固有の補間動作がある。 その場合、そのプロパティのアニメーション動作は明示的に指定される。

まだプロパティ定義に Animation type の行を含んでいない プロパティの アニメーション型は、 付録 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、 値 value、および Element element が与えられたとき: 依存関係を解決するためのコンテキストとして element計算値を使用し、property の定義表の「計算値」の行に従って value を解決し、その 結果を返す。

注: element 上の 計算 値は、このアルゴリズムの影響を受けない。

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

var animation = elem.animate([{ fontSize: '10px', width: '10em' },
                              { fontSize: '20px', width: '20em' }], 1000);
animation.currentTime = 500;
console.log(getComputedStyle(elem).fontSize); // 15px になるはずである
console.log(getComputedStyle(elem).width); // 225px になるはずである

この例で、10emプロパティ値を計算するには、 対象 要素上の font-size計算値を知る必要がある。 その値はさらに font-size効果値によって決定され、 そのためさらに font-size の プロパティ値を計算する必要がある。 したがって、プロパティ値の計算には順序上の制約がある。

5.3.3. 計算済みキーフレームの計算

キーフレーム 効果効果 値を計算する前に、 その キーフレーム上の プロパティ値が 計算され、 null の キーフレーム オフセットを持つキーフレームについて使用するオフセットも計算される。 これらの値を解決した結果が 計算済みキーフレームの集合である。

null の各 キーフレームオフセットについて 適切な値を含む、キーフレームの集合の 計算された キーフレーム オフセット計算済みキーフレームオフセットと呼ぶ。

計算済みキーフレームオフセットを生成するため、 キーフレームのシーケンス keyframes を受け取り、 次の手順を持つ 欠落した キーフレームオフセットを計算する手順を定義する:

  1. keyframes 内の各 キーフレームについて、 キーフレーム計算済みキーフレームオフセットを、その キーフレームオフセットの値に等しいものとする。

  2. keyframes が複数の キーフレームを含み、 keyframes の最初の キーフレーム計算済みキーフレーム オフセットが null である場合、 最初の キーフレーム計算済みキーフレームオフセットを 0 に設定する。

  3. keyframes 内の最後の キーフレーム計算済みキーフレームオフセットが null である場合、 その 計算済みキーフレーム オフセットを 1 に設定する。

  4. 次の条件を満たす キーフレーム AB の各組について:

    AB の間の各 キーフレーム計算済みキーフレームオフセットを 次のように計算する:

    1. offsetk を、 キーフレーム k計算済み キーフレームオフセットとする。

    2. n を、AB の間および それら自身を含むキーフレーム数から 1 を引いた値とする。

    3. index を、AB の間の キーフレームのシーケンス内における keyframe の位置を表すものとし、 A の直後の最初のキーフレームの index を 1 とする。

    4. keyframe計算済みキーフレームオフセットを、 offsetA + (offsetBoffsetA) × index / n に設定する。

計算済みキーフレームは、 次の手順を使用して生成される。 この手順は、計算済みプロパティ値を計算できる 効果ターゲットを持つ キーフレーム効果に対してのみ実行されることに注意。

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

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

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

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

      たとえば、keyframeborder-width プロパティについて "12pt" の値を持つ場合、 ユーザーエージェントは次の各個別指定プロパティについて "16px" の プロパティ値を計算できる: border-bottom-widthborder-left-widthborder-right-width、および border-top-width。 その結果、computed keyframeborder-width プロパティの値を持たず、代わりに 各個別指定プロパティをそれぞれ "16px" の値で含む。

      略式プロパティを展開したとき、または論理プロパティを物理プロパティに置き換えたときに 競合が発生した場合は、競合が解決されるまで、 次の規則を順に適用する:

      1. 個別指定プロパティは略式プロパティを上書きする (例: border-top-colorborder-top を上書きする)。

      2. 含む個別指定プロパティ数が少ない略式プロパティは、 より多くの個別指定プロパティを含むものを上書きする (例: border-topborder-color を上書きする)。

      3. 物理プロパティは論理プロパティを上書きする。

      4. 同数の個別指定成分を持つ略式プロパティでは、 各 IDL 名を構成する Unicode コードポイントによって昇順に並べたときに、 IDL 名(CSS プロパティから IDL 属性へのアルゴリズム [CSSOM] を参照)がより前に現れるプロパティが、 後に現れるものを上書きする。

  3. computed keyframes欠落したキーフレームオフセットを計算する手順を適用する。

  4. computed keyframes を返す。

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

キーフレーム 効果がその 対象プロパティの1つとして参照する単一のプロパティの 効果値は、 与えられた iteration progresscurrent iteration、および underlying value について、次のように計算される。

  1. iteration progress未解決である場合、この手順を中止する。

  2. target property を、効果値を計算する対象となる 個別指定プロパティとする。

  3. target propertyアニメーション型アニメーション不可である場合、 効果を適用できないため、この手順を中止する。

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

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

  6. property-specific keyframes を、この キーフレーム 効果計算済みキーフレームの集合を取得した結果とする。

  7. target property のプロパティ値を持たない キーフレームproperty-specific keyframes から削除する。

  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 であり、 property-specific keyframes 内に 計算済みキーフレームオフセットが 0 の キーフレームが 複数ある場合、

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

    iteration progress ≥ 1 であり、 property-specific keyframes 内に 計算済みキーフレームオフセットが 1 の キーフレームが 複数ある場合、

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

    それ以外の場合、
    1. property-specific keyframes 内で、計算済みキーフレームオフセットiteration progress 以下かつ 1 未満である 最後の キーフレームinterval endpoints に追加する。そのような キーフレームがない場合 (たとえば 反復進行度が負の場合)、 計算済みキーフレームオフセットが 0 の最後の キーフレームを追加する。

    2. 前の手順で追加されたものの次にある property-specific keyframes 内の キーフレームinterval endpoints に追加する。

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

    1. keyframe合成操作を持ち、その操作が replaceではない場合、 または keyframe合成操作がなく、この キーフレーム 効果合成操作replaceではない場合、 次の手順を実行する:

      1. composite operation to usekeyframe合成 操作、またはそれがない場合はこの キーフレーム効果合成操作とする。

      2. value to combine を、keyframe に指定された target property のプロパティ値とする。

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

  14. interval endpoints にキーフレームが1つだけある場合、 そのキーフレーム上の target property のプロパティ値を返す。

  15. start offset を、interval endpoints の最初のキーフレームの 計算済みキーフレームオフセットとする。

  16. end offset を、interval endpoints の最後のキーフレームの 計算済みキーフレームオフセットとする。

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

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

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

この手順は、効果に指定された キーフレームの一覧について、 次のことを前提としていることに注意:

これらの条件を満たすことを保証する責任は、 モデルの利用者(たとえば宣言的マークアップまたはプログラミングインターフェイス)にある。

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

注: この手順では、重複する キーフレームが許可される。 重複位置では、出力値がそのオフセットで最後に定義された キーフレームの値に飛ぶ。 0 または 1 で重複するキーフレームについて、 反復 進行度が 0 未満または 1 以上である場合の出力値は、それぞれ keyframes 内の最初の キーフレームまたは最後の キーフレームの値となる。

計算済み キーフレームは「ライブ」であることに注意: ユーザーエージェントは、効果値が計算されるたびに、 それらが再作成されるかのように動作しなければならない。

たとえば、font-size プロパティで 10px から 20px への進行中のトランジションがある場合、 キーフレーム1em と指定されたプロパティ値は、 キーフレーム計算の際に、 font-size のトランジションによって生成される [10px, 20px] の範囲内の 計算値に対して解決される。

特定のタイミング関数が存在する場合、 アニメーション効果への入力となる反復 進行度は [0, 1] の範囲に制限されない。 しかし現在、キーフレームオフセットは [0, 1] の 範囲に制限されており、この範囲外の入力反復進行度の値については、 プロパティ値が単純に外挿される。

反復進行度が [0, 1] の範囲外にある位置で プロパティ値の非線形な変化を指定できると有用な場合があるため、 この制限を削除することも検討した。 一例として、緑から黄色へ補間するが、 オーバーシュートするタイミング関数によって一時的に黄色を「超えて」 赤へ補間した後、黄色に戻るアニメーションがある。

この効果はキーフレームとタイミング関数を変更することで 実現できるものの、この方法は、 タイミングに関する関心事とアニメーション効果を分離するというモデルの考え方を 損なうように思われる。

この効果をどのように実現すべきかは明確ではないが、 [0, 1] の外側のキーフレームオフセットを許可すると、 必要に応じてオフセット 0 および 1 のキーフレームを合成するという 現在指定されている動作と整合しなくなる可能性があることに注意。

2013年東京 F2F の 議事録付き議論の第4節 ([0, 1] の外側のキーフレームオフセット)を参照。

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

5.4. 効果の結合

この節は非規範的である

キーフレーム効果効果 値を計算した後、それらは アニメーション 効果対象 プロパティに適用される。

複数の 効果 中キーフレーム 効果が同じプロパティを対象にできるため、 複数の キーフレーム効果の結果を結合する必要があることが多い。 この処理を 合成と呼び、 効果中アニメーション効果が対象とする各プロパティについて 効果スタックを 確立することに基づく。

キーフレーム 効果の結果を 合成した後、 その合成結果は 対象プロパティに指定された他の値と結合される。

その構成を以下に示す:

効果値をその対象プロパティへ適用する処理の概要
効果値を その 対象 プロパティへ適用する処理の概要。
同じプロパティを対象とする キーフレーム効果の結果は、 効果スタックを使用して合成される。
この合成結果は次に CSS カスケードの適切な位置へ挿入される。

この処理の最初の部分、すなわち同じ プロパティを対象とする 効果値を結合するためには、 キーフレーム効果を互いにどのように結合するかだけでなく、 それらを適用する順序、すなわち相対的な合成順序も 決定する必要がある。

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

効果値の相対的な合成順序は、 各アニメーション対象プロパティについて確立される 効果スタックによって決定される。

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

この仕様は、このモデル上にマークアップまたはプログラミングインターフェイスを 定義する他の仕様によって使用されることを意図した共通のアニメーションモデルを提供する。 アニメーションを生成した特定のマークアップまたは プログラミングインターフェイスが、その アニメーションクラスを定義する。

後続の仕様では、異なるアニメーションクラス間、または特定のクラス内での 合成順序について、特殊な動作を定義できる。

この節は非規範的である

たとえば、クラスが "CSS animation" であるアニメーションは、クラスが "CSS transition" である アニメーションより高い合成順序を持つが、 特定のクラスを持たないその他のアニメーションよりは低いと定義されている。

"CSS animation" オブジェクトの集合内では、 他の要因とともに animation-name プロパティに基づいて、 特殊な合成順序が定義される。

5.4.2. 効果スタック

効果スタックは、1つ以上の キーフレーム効果によって 対象とされる各プロパティに 関連付けられる。 効果スタックは、 キーフレーム効果の相対的な合成順序を確立する。

キーフレーム効果 A および B の任意の2つについて、 効果スタック内での相対的な 合成順序は、 次のようにそれらのプロパティを比較することで確立される:

  1. アニメーション効果に関連付けられたアニメーションを、 アニメーション効果関連付けられた アニメーションとする。

  2. 順序が決定されるまで、次の条件を順に適用して AB を並べ替える。

    1. AB関連付けられたアニメーションクラスによって異なる場合、 対応するクラスについて定義されたクラス間の合成順序に従って並べ替える。

    2. AB がまだ並べ替えられていない場合、 AB関連付けられたアニメーションに共通する クラスによって定義された、 クラス固有の合成順序に従って並べ替える。

    3. AB がまだ並べ替えられていない場合、 それらの 関連付けられたアニメーショングローバルアニメーションリスト内での位置に従って並べ替える。

より前に並べられる アニメーション効果は、 より低い合成順序を持つ。

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

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

効果スタックを評価する処理の各段階では、 基底値を 入力として受け取る。

スタック内の各 キーフレーム効果について、 キーフレーム 効果から適切な 効果値基底値と結合して、新しい値を生成する。 この結果の値は、スタック内の次の キーフレーム効果を 結合するための 基底値となる。

効果 スタックの最終値は 合成値と呼ばれ、単にスタック内で最後の (最も高い合成順序を持つ) キーフレーム効果効果値を、 その時点での 基底値と結合した結果である。

5.4.4. 効果の合成

効果値基底値と結合するために使用される具体的な操作は、 効果値を生成した キーフレーム効果合成操作によって決定される。

この仕様では、3つの 合成操作を 次のように定義する:

replace

効果値基底値と合成した結果は、 単に 効果値となる。

add

効果値基底 値加算される加算操作が可換ではないように定義されている アニメーション型では、 オペランドの順序は 基底値 + 効果値 となる。

accumulate

効果値基底値累積される累積操作が可換ではないように定義されている アニメーション型では、 オペランドの順序は 基底値の後に 効果値となる。

5.4.5. 合成結果の適用

合成 値対象 プロパティに適用するには、指定値を CSS カスケードに追加する。

この指定値が追加されるカスケードのレベルは、 あるプロパティの 効果スタック内で最も高い合成順序を持つ効果に 関連付けられた アニメーションクラスによって決まる。 既定では、指定値はカスケードの "Animation declarations" レベルに追加される([css-cascade-3])。

この節は非規範的である

たとえば、最も高い合成順序を持つ効果が "CSS transition" クラスのアニメーションに関連付けられている場合、 合成値はカスケードの "Transition declarations" レベルに追加される。

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 フィルのアニメーションが生成され、 すぐに数百、さらには数千もの forwards フィルの アニメーションが生成される。

ユーザーエージェントがそのようなアニメーションをすべて保持する必要がある場合、 アニメーションのリストは際限なく増加し、 メモリリークが発生する。

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

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 が関連付けられている タイムライン現在時刻に、 タイムライン時刻をオリジン相対時刻に変換する手順を 適用した結果を使用する。

    それ以外の場合、animationremoveEvent配送するためのタスクを キューに入れる。 このタスクのタスクソースは DOM 操作タスク ソースである。

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

現在または 効果中であり、 かつ 置換状態removedではない アニメーションに関連付けられた アニメーション効果の少なくとも1つによって対象とされる すべてのプロパティについて、ユーザーエージェントは 効果ターゲットwill-change プロパティ ([css-will-change-1])に、そのプロパティが含まれているかのように 動作しなければならない。

この節は非規範的である

上記の要件の結果として、たとえばアニメーションが要素の transform プロパティを対象とする場合、 アニメーション前フェーズアクティブフェーズ、 または フィルモードが "forwards" または "both" である場合には 後フェーズにある限り、 効果ターゲットのために 積み重ねコンテキストが作成される。

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 は、 現在のグローバルオブジェクトである Window関連付けられた Document である。

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 引数が省略されている場合は、 現在のグローバルオブジェクトである Window関連付けられた Document既定の文書タイムラインを渡す。

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

effect

省略可能な値。null でない場合、新しく作成される アニメーションに割り当てる 関連付けられた 効果を指定する。

timeline

省略可能な値。指定された場合、新しく作成される アニメーションに関連付ける タイムラインを指定する。 省略された場合、現在のグローバルオブジェクトである Window関連付けられた Document既定の文書タイムラインが使用される。

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 promiseを返す。

finished, 型は Promise<Animation>、読み取り専用

このオブジェクトの 現在の finished promiseを返す。

onfinish, 型は EventHandler

finish イベントのイベントハンドラー。

oncancel, 型は EventHandler

cancel イベントのイベントハンドラー。

onremove, 型は EventHandler

remove イベントのイベントハンドラー。

void cancel()

このオブジェクトについて アニメーションをキャンセルする手順を実行することで、 このアニメーションによって生じたすべての効果を消去し、その再生を中止する。

void finish()

このオブジェクトについて アニメーションを完了する手順を実行することで、 現在の方向でアニメーションを 関連付けられた効果の終端までシークする。

InvalidStateError 型の DOMException

このアニメーションの 再生速度がゼロである場合、 またはこのアニメーションの 再生速度が > 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 変数の変更への応答や、計算済みの font-size の変更に基づく em 単位の再計算など、コンテキストの変更を反映しない。

フィル中のアニメーションが置換された後も、その結果を完全な忠実度で保持するには (§ 5.5 アニメーションの置換を参照)、 persist() メソッドを使用できる。 ただし、そうするとアニメーションは引き続き リソースを消費することに注意。

計算済みスタイルをコミットするには、アニメーション animation に対して:

  1. targets を、animation関連付けられた アニメーション効果の すべての 効果ターゲットからなる 集合とする。

  2. targets 内のtargetごとに次を実行する:

    1. targetstyle 属性 [CSS-STYLE-ATTR] を持つことができる要素ではない場合 (たとえば、疑似要素であるか、 style 属性が定義されていない文書形式内の要素である場合)、 "NoModificationAllowedError" DOMException投げ、 これらの手順を中止する。

    2. 保留中のスタイル変更を適用した後、targetレンダリングされていない場合、 "InvalidStateError" DOMException投げ、 これらの手順を中止する。

      レンダリングされている [HTML] の定義における display: contents の扱いについては、現在も議論中である。 この手順の目的上、それ以外であれば 関連付けられたレイアウトボックスを持つ display: contents の要素(すなわち、接続されておりdisplay: none サブツリーの一部ではない要素)は、 レンダリングされているものと仮定する。

    3. inline style を、targetstyle 属性に対応する CSS 宣言ブロックを取得した結果とする。 targetstyle 属性持たない場合、 inline style を、所有者ノードtarget に設定した 新しい空の CSS 宣言ブロックとする。

    4. targeted properties を、target効果ターゲットとする、 animation関連付けられた少なくとも1つの アニメーション 効果対象プロパティである 物理個別指定プロパティの 集合とする。

    5. targeted properties 内の各プロパティ property について:

      1. partialEffectStack を、target 上の property効果スタックのコピーとする。

      2. animation置換状態removed である場合、 animation関連付けられたすべての アニメーション効果のうち、 効果ターゲットtarget であり、property対象プロパティとして含むものを、 partialEffectStack に追加する。

      3. partialEffectStack から、それに関連付けられた アニメーションanimation より高い 合成順序を持つ アニメーション効果を すべて削除する。

      4. effect value を、target の計算済み スタイルを使用して propertypartialEffectStack の結果を計算した結果とする (§ 5.4.3 効果スタックの 結果の計算を参照)。

      5. inline style 内で、propertyeffect value にする CSS 宣言を設定する

    6. inline style について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

active 置換状態に対応する。

removed

removed 置換状態に対応する。

persisted

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() が返すオブジェクトの属性には共通するものがあるが、 それらの値は次の点で異なる場合がある:

  • durationgetTiming() は文字列 auto を返す場合がある一方、getComputedTiming() は、EffectTiming インターフェイスの duration メンバーの説明で定義される 反復持続時間の 計算値に対応する数値を返さなければならない。

    このレベルの仕様では、これは単に auto の値が ゼロに置き換えられることを意味する。

  • fill – 同様に、getTiming() は文字列 auto を返す場合がある一方、getComputedTiming() は、EffectTiming インターフェイスの fill メンバーの説明で定義される、タイミング計算に使用される特定の FillMode を返さなければならない。

    このレベルの仕様では、これは単に auto の値が none FillMode に置き換えられることを意味する。

注: 将来、他のタイミングメンバーも 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 辞書の変種であり、一部のメンバーが存在しないことを許容する。 これは、AnimationEffect インターフェイスの updateTiming() メソッドが、アニメーション効果の タイミングプロパティを差分更新するために使用する。

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

開始遅延。 関連付けられた アニメーション開始時刻から アクティブ 区間の開始までのミリ秒数を表す。

endDelay, 型は double、既定値は 0

終了遅延アニメーション効果アクティブ区間の終了から その 終了時刻までの ミリ秒数を表す。

fill, 型は FillMode、既定値は "auto"

フィルモードアニメーション 効果アクティブ区間外での動作を定義する。

タイミング計算を実行するとき、特殊な文字列値 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 に設定すると、 アニメーション 効果を永続的に反復させることができる (ただし効果の持続時間がゼロである場合は、直ちに完了する)。

duration, 型は (unrestricted double or DOMString)、既定値は "auto"

反復持続時間。 これは0以上の実数(正の無限大を含む)であり、 アニメーション 効果の1回の反復を完了するまでにかかる時間を表す。

このレベルの仕様では、文字列値 auto は、 タイミングモデルの計算、および getComputedTiming() から返される duration メンバーの結果において、値ゼロとして扱われる。 ただし、著者が auto 値を指定した場合、ユーザーエージェントは getTiming() から返される duration メンバーについて auto を返さなければならない。

これは前方互換性のための措置である。将来のレベルのこの仕様では グループ効果が導入され、auto 値が子 効果の持続時間を含むよう展開されることが期待されている。

direction, 型は PlaybackDirection、既定値は "normal"

アニメーション効果再生 方向。 再生が順方向、逆方向、または反復ごとに交互の方向で進行するかを定義する。

easing, 型は DOMString、既定値は "linear"

イージング効果を生成するために時間をスケーリングする タイミング関数

文字列の構文は <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 のタイミングの更新

EffectTiming または OptionalEffectTiming オブジェクト input から、effectアニメーション 効果のタイミングプロパティを更新するには、 次の手順を実行する:

  1. inputiterationStart メンバーが存在し、かつゼロ未満である場合、 TypeError投げ、 この手順を中止する。

    注: RangeError ではなく TypeError を使用する理由は、 将来この注釈を浮動小数点値に使用できるようになった場合に、 WebIDL の [EnforceRange] 注釈の動作を 模倣するためである。

  2. inputiterations メンバーが存在し、 かつゼロ未満であるか値 NaN である場合、 TypeError投げ、 この手順を中止する。

  3. inputduration メンバーが存在し、 かつゼロ未満であるか値 NaN である場合、 TypeError投げ、 この手順を中止する。

  4. inputeasing メンバーが存在するが、<easing-function> 生成規則 [CSS-EASING-1]を使用して 構文解析できない場合、TypeError投げ、この手順を中止する。

  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 セッターについて定義されたエラー処理を適用する。 セッターが例外を投げることを要求する場合、この手順も 同じ例外を投げ、その後のすべての手順を中止しなければならない。

    それ以外の場合、

    対象 疑似セレクターnull に設定する。

  4. timing input を、以下のうち最初に 一致する条件に対応する結果とする。

    optionsKeyframeEffectOptions オブジェクトである場合、

    timing inputoptions とする。

    それ以外の場合(optionsdouble の場合)、

    timing input を、すべてのメンバーを既定値に設定し、 durationoptions に設定した新しい EffectTiming オブジェクトとする。

  5. timing input から effectアニメーション 効果のタイミングプロパティを更新する手順を呼び出す。

    その手順によって例外が投げられた場合、その 例外を伝播し、この手順を中止する。

  6. optionsKeyframeEffectOptions オブジェクトである場合、effectcomposite プロパティに、options の対応する値を 代入する。

    このプロパティを代入するときは、KeyframeEffect インターフェイス上の対応するセッターについて定義されたエラー処理を適用する。 options で指定された値についてセッターが例外を投げることを要求する場合、 この手順も同じ例外を投げ、 その後のすべての手順を中止しなければならない。

  7. keyframes を入力として渡し、setKeyframes() について定義された手順を実行することにより、 キーフレームの集合を初期化する。

Element? target

対象要素。 特定の要素を対象としないアニメーションでは、 これは null であってもよい。

object? keyframes

使用する キーフレームの集合。 この引数の形式と処理は § 6.6.3 keyframes 引数の処理で定義される。

optional KeyframeEffectOptions options

効果の 反復持続時間を指定する数値、 または効果のタイミングと動作を指定するプロパティの集合。

このコンストラクターの使用例は § 6.6.1 新しい KeyframeEffect オブジェクトの作成に示す。

KeyframeEffect (source)

次の手順を使用して、source と同じプロパティを持つ新しい KeyframeEffect オブジェクトを作成する:

  1. 新しい KeyframeEffect オブジェクト effect を作成する。

  2. source の対応する値を使用して、 effect の次のプロパティを設定する:

    注: KeyframeEffect(target, keyframes, options) コンストラクターとは異なり、 source に指定されたタイミングプロパティは 有効であると仮定できるため、例外を再度投げる必要はない。

KeyframeEffect source

新しい キーフレーム効果を定義する プロパティのコピー元となる キーフレーム効果

target, 型は Element、null 許容

このオブジェクトによってアニメーションされる 対象要素効果ターゲットElement である場合はその効果ターゲット、疑似要素である場合はその 起点要素)。 オーディオ API を使用して音を生成するアニメーションなど、 特定の要素を対象としないアニメーションでは、これは null であってもよい。

pseudoElement, 型は CSSOMString、null 許容

対象疑似セレクター。 この効果に 効果 ターゲットがない場合、または 効果ターゲットが要素 (すなわち疑似要素ではない)である場合は null効果ターゲットが 疑似要素である場合、これは疑似要素セレクター(例: ::before)を指定する。

設定時には、次の例外を適用した後、アニメーション 効果対象疑似セレクターを 指定された値に設定する:

  • 指定された値が null ではなく、無効な <pseudo-element-selector> である場合、ユーザーエージェントはエラー名 SyntaxErrorDOMException投げ、 この アニメーション効果対象疑似セレクターを 変更しないままにしなければならない。

    注: この文脈における無効とは、 [SELECTORS-4] で定義される 無効なセレクターの定義に従う。 したがって、構文的に無効な疑似要素と、 ユーザーエージェントが利用可能なレベルでサポートしていない疑似要素の 両方が無効と見なされる。

  • 従来の Selectors Level 2 の単一コロンセレクター (':before'、':after'、':first-letter'、または ':first-line')の いずれかが指定された場合、対象疑似セレクターは、 対応する2コロンセレクター(例: '::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 Animations については 計算済みキーフレームを返す。

  3. keyframes 内の各 keyframe について、次の手順を実行する:

    1. 次の定義を使用して辞書オブジェクト output keyframe を初期化する:

      dictionary BaseComputedKeyframe {
           double?                  offset = null;
           double                   computedOffset;
           DOMString                easing = "linear";
           CompositeOperationOrAuto composite = "auto";
      };
      
    2. output keyframeoffsetcomputedOffseteasing、 および composite メンバーを、それぞれ keyframeキーフレームオフセット計算済みキーフレームオフセット、 キーフレーム固有の タイミング関数、および キーフレーム固有の 合成操作の値に設定する。

    3. keyframe 内の各アニメーションプロパティと値のペア declaration について、次の手順を実行する:

      1. property name を、declaration の プロパティ名に アニメーション プロパティ名から IDL 属性名へアルゴリズムを適用した結果とする。

      2. IDL value を、declarationCSS 値を シリアライズするアルゴリズム [CSSOM] に渡すことにより、 declaration のプロパティ値をシリアライズした結果とする。

      3. value を、IDL value を ECMAScript String 値へ変換した結果とする。

      4. output keyframe 上で [[DefineOwnProperty]] 内部メソッドを、プロパティ名 property name、 Property Descriptor { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true, [[Value]]: value } および Boolean フラグ false. を指定して呼び出す。

    4. output keyframeresult に追加する。

  4. result を返す。

void setKeyframes(object? keyframes)

この効果を構成する キーフレームの集合を置き換える。

object? keyframes

形式と処理が § 6.6.3 keyframes 引数の処理で定義される一連のキーフレーム。

この効果の キーフレームの集合を、 keyframes 引数を処理する手順を 実行した結果で置き換える。 その手順が例外を投げた場合、この効果の キーフレームは変更されない。

6.6.1. 新しい KeyframeEffect オブジェクトの作成

この節は非規範的である

KeyframeEffect コンストラクターは、新しい KeyframeEffect オブジェクトを作成するためのいくつかの方法を提供する。

最も単純な場合、elem の "left" プロパティを3秒かけて 100px に変更する KeyframeEffect オブジェクトは次のように構築できる:

var effect = new KeyframeEffect(elem, { left: '100px' }, 3000);

キーフレームのリストを表す2番目のパラメーターでは、 複数のプロパティを指定できる。(§ 6.6.3 keyframes 引数の処理を参照。)

// 複数のプロパティを一度に指定する
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 });

持続時間が指定されていない場合、値ゼロが使用される。 次のように、補間を一切行わず単にプロパティを設定する アニメーションを作成することもできる:

var effect =
  new KeyframeEffect(elem, { visibility: 'hidden' }, { fill: 'forwards' });

ただし、§ 4.6 フィル動作で説明したように、この方法で 無期限にフィルするアニメーションを使用することは推奨されない。

KeyframeEffect を作成した後、それを Animation に追加し、そのアニメーションを再生することで再生できる。 ただし単純な効果では、これらの手順を自動的に実行するため、 Element.animate ショートカットの方が便利である。 たとえば:

elem.animate({ left: '100px' }, 3000);

6.6.2. プロパティ名と IDL 名

property に対する アニメーションプロパティ名から IDL 属性名へ のアルゴリズムは次のとおり:

  1. property<custom-property-name> 生成規則に従う場合、 property を返す。

  2. property が CSS の float プロパティを参照する場合、 文字列 "cssFloat" を返す。

  3. property が CSS の offset プロパティを参照する場合、 文字列 "cssOffset" を返す。

  4. それ以外の場合、propertyCSS プロパティから IDL 属性へアルゴリズム [CSSOM]を適用した 結果を返す。

attribute に対する IDL 属性名からアニメーションプロパティ名へ のアルゴリズムは次のとおり:

  1. attribute<custom-property-name> 生成規則に従う場合、 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つの値を指定できる。 2番目の形式(オブジェクト形式)はオブジェクトからなり、 各アニメーションプロパティには単一のアニメーション値または アニメーション値の配列を指定できる。

最初の配列形式が標準形式であり、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 オブジェクト(または Animatable インターフェイスミックスインの animate() メソッドを使用する場合は KeyframeAnimationOptions オブジェクト)を使用して指定される、キーフレーム効果反復 持続時間全体に適用される タイミング 関数とは独立している。

次の例では、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] の範囲外のオフセットを指定すると、 TypeError が投げられる。

オフセットを指定するキーフレームは、オフセットの昇順で 提供しなければならない。ただし、隣接する等しいオフセットは許可される。

easing

このキーフレームから系列内の次のキーフレームまでの時間の進行を変換するために使用される タイミング関数

この文字列の構文および構文解析に関連するエラー処理は、 EffectTiming インターフェイスの easing 属性について定義されたものと同一である。

composite

このキーフレームに指定された値を 基底値と結合するために使用される キーフレーム固有の合成 操作

auto の場合、キーフレーム 効果に指定された 合成操作が使用される。

この型は WebIDL で表現できないため、その処理を 以下の文章で定義する。

keyframes 引数を取る各メソッドについて、入力に対して keyframes 引数を処理する手順を実行し、 その手順の結果を保持する。

まず、2つの補助的な定義を定義する。

ECMAScript 操作を呼び出して得られた 完了レコード result について、 result完了レコードを確認するという命令は、 次の手順と同等である:

  1. result突然の完了である場合、 result の [[value]] フィールドに含まれる例外を投げ、この手順を中止する。

    [[type]] が breakcontinue、または return の場合、どうすべきか? そのようなことはあり得るか?

  2. result を、result の [[value]] フィールドに 含まれる値で置き換える。

キーフレーム風オブジェクトを処理する手順は、 次の2つの引数を取る:

そして、allow lists が false の場合はプロパティ名から DOMString 値へのマップを、 それ以外の場合はプロパティ名から DOMString 値のシーケンスへのマップを、 次の手順を使用して返す:

  1. keyframe input を ECMAScript 値とし、 allow lists フラグの値に応じて次の辞書型を使用して、 ECMAScript 値を辞書型へ変換する手順 [WEBIDL] を実行する:

    allow lists が true の場合、

    次の辞書型を使用する:

    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";
    };
    

    この手順の結果を keyframe output として格納する。

  2. animatable properties のリストを次のように構築する:

    1. animatable properties を、実装によってアニメーション可能な プロパティ名(アニメーション可能な個別指定サブプロパティを持つ 略式プロパティを含む)のリストとする。

    2. animatable properties 内の各プロパティ名に アニメーションプロパティ名から IDL 属性名へアルゴリズムを適用し、 等価な IDL 属性へ変換する。

  3. input properties を、keyframe input をオブジェクトとして EnumerableOwnNames 操作を呼び出した結果とする。

  4. 両方の input propertiesanimatable properties に含まれるプロパティ、 または input properties に含まれ、かつ <custom-property-name> 生成規則に従う プロパティすべてからなる、新しいリスト animation properties を作成する。

  5. animation properties を、それぞれのプロパティ名を定義する Unicode コードポイントによって昇順に並べ替える。

  6. animation properties 内の各 property name について、

    1. raw value を、keyframe input 上で property name をプロパティキー、keyframe input を レシーバーとして [[Get]] 内部メソッドを呼び出した結果とする。

    2. raw value完了レコードを確認する

    3. raw value を、次のように DOMString または DOMString のシーケンス property values に変換する:

      allow lists が true の場合、

      property values を、 ECMAScript 値を IDL 値に変換するために定義された手順 [WEBIDL]を使用して、 raw value を IDL 型 (DOMString or sequence<DOMString>) に変換した結果とする。

      property values が単一の DOMString である場合、 property values を、その元の値を唯一の要素とする DOMString のシーケンスで置き換える。

      それ以外の場合、

      property values を、 ECMAScript 値を DOMString に変換する手順 [WEBIDL]を使用して、 raw value を DOMString に変換した結果とする。

    4. normalized property name を、property nameIDL 属性名から アニメーションプロパティ名へアルゴリズムを適用した結果として計算する。

    5. keyframe output に、プロパティ名として normalized property name、プロパティ値として property values を持つ プロパティを追加する。

  7. keyframe output を返す。

keyframes 引数を処理する手順は、null 許容の ECMAScript オブジェクト object を入力として受け取り、 次の手順を使用してキーフレームのシーケンスを返す:

  1. object が null の場合、空のキーフレームシーケンスを返す。

  2. processed keyframesキーフレームの空のシーケンスとする。

  3. methodGetMethod(object, @@iterator) の結果とする。

  4. method完了レコードを確認する

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

    methodundefined ではない場合、
    1. iterGetIterator(object, method) とする。

    2. iter完了レコードを確認する

    3. 次を繰り返す:

      1. nextIteratorStep(iter) とする。

      2. next完了 レコードを確認する

      3. next が false の場合、このループを中止する。

      4. nextItemIteratorValue(next) とする。

      5. nextItem完了 レコードを確認する

      6. Type(nextItem) が Undefined、Null、Object のいずれでもない場合、 TypeError を投げ、 これらの手順を中止する。

      7. nextItemkeyframe input として渡し、allow lists フラグを false に設定して キーフレーム風 オブジェクトを処理する手順を実行した結果を、 processed keyframes に追加する。

    それ以外の場合、
    1. objectkeyframe input として渡し、 allow lists フラグを true に設定して キーフレーム風 オブジェクトを処理する手順を実行した結果を、 property-indexed keyframe とする。

    2. property-indexed keyframe 内の各メンバー m について、次の手順を実行する:

      1. property namem のキーとする。

      2. property name が "composite"、"easing"、または "offset" の場合、このループの残りの手順を省略し、 property-indexed keyframe 内で m の 次のメンバーから続行する。

      3. property valuesm の値とする。

      4. property keyframesキーフレームの空のシーケンスとする。

      5. property values 内の各値 v について、 次の手順を実行する:

        1. k を、null の キーフレームオフセットを持つ 新しい キーフレームとする。

        2. プロパティと値のペア property namevk に追加する。

        3. kproperty keyframes に追加する。

      6. property keyframes欠落した キーフレーム オフセットを計算する手順を適用する。

      7. property keyframes 内の キーフレームprocessed keyframes に追加する。

    3. processed keyframes を、各 キーフレーム計算済み キーフレームオフセットによって昇順に並べ替える。

    4. processed keyframes 内で、等しい 計算済みキーフレームオフセットを持つ 隣接する キーフレームをマージする。

    5. offsets を、property-indexed keyframe の "offset" メンバーの型に基づいて 次のように割り当てられる null 許容double 値の シーケンスとする:

      sequence<double?>,

      "offset" の値をそのまま使用する。

      double?,

      "offset" の値を唯一の項目とする長さ1のシーケンス、 すなわち « offset »、

    6. いずれかのシーケンスの末尾に到達するまで、 offsets 内の各値を processed keyframes 内の 対応する位置にある キーフレームキーフレーム オフセットに割り当てる。

    7. easings を、property-indexed keyframe の "easing" メンバーの型に基づいて次のように割り当てられる DOMString 値のシーケンスとする:

      sequence<DOMString>,

      "easing" の値をそのまま使用する。

      DOMString,

      "easing" の値を唯一の項目とする長さ1のシーケンス、 すなわち « easing »、

    8. easings が空のシーケンスである場合、 単一の値 "linear" を含む長さ1のシーケンス、 すなわち « "linear" » とする。

    9. easings の項目数が processed keyframes より少ない場合、easings の要素を リストの先頭から順に反復し、easingsprocessed keyframes と同じ項目数になるまで続ける。

      たとえば、processed keyframes が5項目を持ち、easings がシーケンス « "ease-in", "ease-out" » である場合、easings は反復され、 « "ease-in", "ease-out", "ease-in", "ease-out", "ease-in" » となる。
    10. easings の項目数が processed keyframes より多い場合、余分な項目を unused easings として格納する。

    11. processed keyframes の末尾に到達するまで、easings 内の各値を processed keyframes 内の対応する位置にある キーフレーム上の "easing" という名前のプロパティに割り当てる。

    12. property-indexed keyframe の "composite" メンバーが空のシーケンスではない場合:

      1. composite modes を、 property-indexed keyframe の "composite" メンバーから割り当てられた CompositeOperationOrAuto 値のシーケンスとする。 そのメンバーが単一の CompositeOperationOrAuto 値である場合、composite modes を "composite" の値を唯一の項目とする 長さ1のシーケンスとする。

      2. easings と同様に、composite modes の項目数が processed keyframes より少ない場合、 composite modes の要素をリストの先頭から順に反復し、 composite modesprocessed keyframes と 同じ項目数になるまで続ける。

      3. processed keyframes の末尾に到達するまで、 composite modes 内の auto ではない各値を、processed keyframes 内の対応する位置にある キーフレーム上の キーフレーム固有の 合成操作に割り当てる。

  6. processed keyframesオフセットによって 緩やかにソートされていない場合、TypeError投げ、これらの手順を中止する。

  7. processed keyframes 内に、null ではなくゼロ未満または1より大きい キーフレームオフセットを持つ キーフレームが存在する場合、 TypeError投げ、 これらの手順を中止する。

  8. processed keyframes 内の各 frame について、 次の手順を実行する:

    1. frame 内の各プロパティと値のペアについて、 そのプロパティに指定された構文を使用してプロパティ値を構文解析する。

      プロパティ値がそのプロパティの構文に従って無効である場合、 そのプロパティと値のペアを破棄する。 コンテンツ内のエラー診断をサポートするユーザーエージェントは、 無効なプロパティ値を強調する適切な警告を生成するべきである。

    2. frameタイミング関数を、 EffectTiming 辞書の easing メンバーについて定義された CSS 構文を使用して、 frame 上の "easing" プロパティを構文解析した結果とする。

      "easing" プロパティの構文解析に失敗した場合、 TypeError投げ、 この手順を中止する。

      注: 上記の両方の手順で CSS パーサーを使用することは、 CSS コメントおよびエスケープが許可されるものの、 値が正常に構文解析された場合には保持されないことを意味する。

      注: "easing" プロパティの構文解析に失敗した場合、 TypeError を、 object からすべてのプロパティを読み取ったに投げることが重要である。 そうしなければその違いが観察可能となり、将来 WebIDL で 部分的に開放された辞書がサポートされた場合の動作と一致しない。

  9. unused easings 内の各値を、EffectTiming インターフェイスの easing メンバーについて定義された CSS 構文を使用して構文解析し、 いずれかの値の構文解析に失敗した場合、TypeError投げ、この手順を中止する。

    この最後の手順は、次のすべての場合に TypeError が投げられるという一貫した動作を 提供するために必要である:

    elem.animate({ easing: 'invalid' });
    elem.animate({ easing: ['invalid'] });
    elem.animate([{ easing: 'invalid' }]);
    

6.6.4. KeyframeEffectOptions 辞書

KeyframeEffectOptions オブジェクトを指定することで、KeyframeEffect(target, keyframes, options) コンストラクターに追加のパラメーターを渡すことができる。

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(target, keyframes, options) コンストラクターと同じ手順を使用して、新しい KeyframeEffect オブジェクト effect を構築する。 targettarget 引数として渡し、 keyframes および options 引数は指定されたとおりに渡す。

    上記の手順によって例外が投げられた場合、その 例外を伝播し、この手順を中止する。

  3. optionsKeyframeAnimationOptions オブジェクトである場合、timelineoptionstimeline メンバーとする。optionstimeline メンバーがない場合は、このメソッドが呼び出された要素の ノード文書既定の文書タイムラインとする。

  4. target関連する Realm内に、Animation() コンストラクターと同じ手順を使用して、新しい Animation オブジェクト animation を構築し、 同じ名前の引数として effecttimeline を渡す。

  5. optionsKeyframeAnimationOptions オブジェクトである場合、 optionsid メンバーの値を animationid 属性に代入する。

  6. auto-rewind フラグを true に設定して、 animation について アニメーションを再生する手順を実行する。

  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 インターフェイスの拡張

[DOM] で定義される Document インターフェイスに、次の拡張を行う。

partial interface Document {
    readonly attribute DocumentTimeline timeline;
};
timeline, 型は DocumentTimeline、読み取り専用

既定の文書タイムラインを表す DocumentTimeline オブジェクト。

6.10. DocumentOrShadowRoot インターフェイスミックスインの拡張

[DOM] で定義される DocumentOrShadowRoot インターフェイス ミックスインに、次の拡張を行う。

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)

[DOM]イベントを構築するために定義された手順を使用して、 新しい AnimationPlaybackEvent オブジェクトを構築する。

currentTime, 型は double、読み取り専用、null 許容

イベントがキューに入れられた時点で、 そのイベントを生成した アニメーション現在時刻。 イベントが生成された時点で アニメーションアイドルであった場合、 これは null となる。

timelineTime, 型は double、読み取り専用、null 許容

イベントがキューに入れられた時点で、 そのイベントを生成した アニメーションが関連付けられている タイムライン時間値。 イベントがキューに入れられた時点で アニメーションアクティブなタイムラインに関連付けられていなかった場合、 これは null となる。

currentTime, 型は double、null 許容、既定値は null

currentTime 属性の説明を参照。

timelineTime, 型は double、null 許容、既定値は null

timelineTime 属性の説明を参照。

6.13. モデルのライブ性

モデルのいずれかの部分に変更が加えられると、 タイミングモデル全体およびそれに依存するすべてのスタイルが更新される。

別途明記されていない限り、 この仕様のプログラミングインターフェイス節で定義されるインターフェイスの メソッドやコンストラクターを呼び出したり、 メンバーを取得または設定したりしても、 スタイル変更イベント発生しない

注: この仕様を拡張する他の仕様では、 そのようなイベントが発生する状況を導入することによって、 スタイル変更イベントに関する要件を さらに詳細化することが期待される。 たとえば、 この仕様のインターフェイスが CSS マークアップによって定義されたアニメーションを表す場合、 指定スタイルへの変更を反映するために、 多くのメソッドで スタイル変更イベントを 発生させる必要がある。

この節は非規範的である

上記の要件およびこの仕様の他の箇所にある規範的要件に基づき、 次の不変条件を観察できる:

Web Animations モデルに加えられた変更は直ちに有効になる

たとえば、Animation に関連付けられた KeyframeEffect がプログラミングインターフェイスを介してシークされた場合 (§ 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 をサポートしないブラウザー向けのフォールバック付きで
// opacity をフェードさせる
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 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日 作業草案以降、次の変更が行われた:

変更履歴には、より 詳細な履歴が記載されている。

付録 A: 既存 プロパティのアニメーション型

通常、プロパティの アニメーション型は、 その定義とともに含まれる。 ただし、古い仕様または非常に成熟した仕様で定義された一部のプロパティでは、 アニメーション型の情報が含まれていない。 そのようなプロパティはすべて、以下に列挙する例外のいずれかでない限り、 計算値による アニメーション型を持つものと仮定する。

font-weight のアニメーション

レベル4より前の font-weight プロパティの値は、次のように結合される:

注: この定義は [CSS-FONTS-4] により廃止されている。 そこでは font-weight 値が 100 の倍数でなければならないという要件が削除されている。 その時点で font-weightアニメーション 型は単に 計算値によるとなる。

visibility のアニメーション

visibility プロパティでは、visible は離散的な段階として補間され、 0 と 1 の間の p の値は visible に対応し、それ以外の p の値は近い方の端点に対応する。 どちらの値も visible でない場合は、離散アニメーションが使用される。

box-shadow および text-shadow のアニメーション

box-shadow または text-shadow プロパティのアニメーションは、次のように シャドウリストを結合するための 結合手順に従う:

リスト内の各シャドウ (none は長さ0のリストとして扱う)は、 計算値による動作と同様に、成分ごとに補間される。 ただし、両方の入力シャドウが inset であるか、両方の入力シャドウが inset でない場合、 補間されたシャドウもその点で入力シャドウと一致しなければならない。 入力シャドウのいずれかの組で、一方が inset でもう一方が inset でない場合、 シャドウリスト全体で 離散 アニメーションを使用する。 シャドウのリストの長さが異なる場合、 短い方のリストの末尾に、色が transparent、 すべての長さが 0、 かつ inset(または非 inset)が長い方のリストと一致するシャドウを追加する。

2つの シャドウリスト VaVb加算は、VresultVaVb拡張したものと等しくなるような リストの連結として定義される。

シャドウリスト累積は、上記の補間に関する 照合規則に従い、各成分についてその型に応じて加算を実行する。 inset の値が一致しない場合は 離散アニメーションにフォールバックする。

適合性

文書の表記規則

適合要件は、説明的な表明と RFC 2119 の用語を組み合わせて表現される。この文書の規範的な部分におけるキーワード “MUST”、 “MUST NOT”、 “REQUIRED”、 “SHALL”、 “SHALL NOT”、 “SHOULD”、 “SHOULD NOT”、 “RECOMMENDED”、 “MAY”、および “OPTIONAL” は、RFC 2119 に記述されているとおりに 解釈される。 ただし、可読性のため、この仕様ではこれらの語をすべて大文字では 表記していない。

明示的に非規範的と示された節、例、および注記を除き、 この仕様のすべてのテキストは規範的である。 [RFC2119]

この仕様の例は “for example” という語で導入されるか、 class="example" によって規範的テキストから区別される。 次のようになる:

これは参考例の例である。

参考注記は “Note” という語で始まり、 class="note" によって規範的テキストから区別される。次のようになる:

注: これは参考注記である。

勧告事項は、特別な注意を喚起するようにスタイル付けされた規範的な節であり、 <strong class="advisement"> によって他の規範的テキストから区別される。次のようになる: UA はアクセシブルな代替手段を提供しなければならない。

適合クラス

この仕様への適合性は、 3つの適合クラスについて定義される:

スタイルシート
CSS スタイルシート
レンダラー
スタイルシートの意味を解釈し、それを使用する文書を レンダリングする UA
オーサリングツール
スタイルシートを作成する UA

スタイルシートは、このモジュールで定義された構文を使用するすべての文が、 一般的な CSS 文法およびこのモジュールで定義される各機能の 個別の文法に従って妥当である場合、 この仕様に適合する。

レンダラーは、適切な仕様で定義されたとおりに スタイルシートを解釈することに加えて、この仕様で定義されたすべての機能を 正しく構文解析し、それに応じて文書をレンダリングすることで サポートする場合、この仕様に適合する。ただし、デバイスの制限により UA が文書を正しくレンダリングできないことによって、 UA が不適合になるわけではない。(たとえば、UA は モノクロモニターで色をレンダリングする必要はない。)

オーサリングツールは、一般的な CSS 文法および このモジュール内の各機能の個別の文法に従って構文的に正しいスタイルシートを作成し、 かつこのモジュールで説明されるスタイルシートのその他すべての適合要件を 満たす場合、この仕様に適合する。

部分的な実装

著者が前方互換の構文解析規則を利用して フォールバック値を割り当てられるようにするため、CSS レンダラーは、利用可能なレベルの サポートを持たない at-rule、プロパティ、プロパティ値、キーワード、 およびその他の構文構成要素をすべて無効として扱い(そして必要に応じて 無視しなければならない。特に、ユーザーエージェントは 単一の複数値プロパティ宣言内で、サポートされない成分値だけを選択的に 無視し、サポートされる値を有効にしてはならない。いずれかの値が無効と見なされる場合 (サポートされない値はそのように扱われなければならない)、CSS では宣言全体を 無視することが要求される。

不安定な機能および 独自機能の実装

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

非実験的な実装

仕様が勧告候補段階に達すると、 非実験的な実装が可能となり、実装者は 仕様に従って正しく実装されていることを実証できる 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; et al. CSS アニメーション レベル 1. 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-ANIMATIONS-2]
David Baron; Brian Birtles. CSS アニメーション レベル 2. 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-2/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS 背景と境界線モジュール レベル 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-3]
Elika Etemad; Tab Atkins Jr.. CSS カスケードと 継承 レベル 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 カスケードと継承 レベル 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 モジュール レベル 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display モジュール レベル 3. 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-EASING-1]
Brian Birtles; Dean Jackson; Matt Rakow. CSS イージング 関数 レベル 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 モジュール レベル 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad. CSS 論理プロパティ および値 レベル 1. 2018年8月27日. WD. URL: https://www.w3.org/TR/css-logical-1/
[CSS-PROPERTIES-VALUES-API-1]
Tab Atkins Jr.; et al. CSS プロパティと 値 API レベル 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 Style Attributes. 2013年11月7日. REC. URL: https://www.w3.org/TR/css-style-attr/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS テキスト装飾モジュール レベル 4. 2022年5月4日. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS 変形モジュール レベル 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TRANSITIONS-1]
David Baron; et al. 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; Koji Ishii. CSS 書字モード レベル 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 書字モード レベル 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; et al. カスケーディングスタイルシート レベル 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. 高解像度時刻. 2023年4月25日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. 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; et al. Media Fragments URI 1.0 (基本). 2012年9月25日. REC. URL: https://www.w3.org/TR/media-frags/
[MOTION-1]
Dirk Schulze; et al. モーションパス モジュール レベル 1. 2018年12月18日. WD. URL: https://www.w3.org/TR/motion-1/
[RFC2119]
S. Bradner. 要件レベルを 示すために RFC で使用するキーワード. 1997年3月. 現行ベストプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; et al. Selectors レベル 3. 2018年 11月6日. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors レベル 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics(SVG)1.1 (第2版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics(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([0, 1] の範囲外のキーフレームオフセット)を参照。

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

レンダリングされている [HTML] の定義における display: contents の扱いについては、現在も議論中である。 この手順の目的上、それ以外であれば 関連付けられたレイアウトボックスを持つ display: contents の要素 (すなわち、接続されており、かつ display: none サブツリーの一部ではない要素)はレンダリングされているものと仮定する。

remove() メソッドは、効果を その親グループまたはアニメーションのいずれからも削除するために使用できる。これをレベル1に残し、 単にアニメーション効果をそのアニメーションから削除するものとして定義すべきだろうか? [Issue #2082]
[[type]] が breakcontinue、または return の場合、どうすべきか? そのようなことはあり得るか?
これは、それらの 時間値navigationStart を基準とし、requestAnimationFramedocument.timeline.currentTime と同じ時刻を使用することと矛盾しないだろうか? [Issue #2083]