Web Animations モジュール レベル 2

W3C 作業草案,

本ドキュメントの詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-web-animations-2-20251120/
最新版:
https://www.w3.org/TR/web-animations-2/
編集者ドラフト:
https://drafts.csswg.org/web-animations-2/
履歴:
https://www.w3.org/standards/history/web-animations-2/
フィードバック:
CSSWG イシュートラッカー
仕様内でコメント
編集者:
Invited Expert
Google
過去の編集者:
Google
Google
この仕様への修正提案:
GitHub Editor
デルタ仕様:
はい
参加:
GitHub でテキストを修正
‘waapi’ チャンネルに Animation at Work Slack で参加
IRC: W3CのIRC #webanimations
イシュートラッキング:
GitHub
テストスイート:
https://wpt.fyi/results/web-animations/

概要

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

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

この文書の位置付け

このセクションは、本書の公開時点における文書の位置付けを説明します。 現在のW3C発行物リストおよびこの技術レポートの最新版は W3C標準・草案一覧から参照できます。

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

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

ご意見はGitHubでイシューを作成してお寄せください(推奨)。 件名に仕様コード “web-animations” を含めてください(例: “[web-animations] …コメント概要…”)。 すべてのイシューとコメントはアーカイブされています。 または、(アーカイブあり) パブリックメーリングリスト www-style@w3.org に送信いただいてもかまいません。

本書は 2025年8月18日版W3Cプロセス文書 に従って管理されています。

本書は W3C特許ポリシーの下で運営しているグループにより作成されました。 W3Cは グループ成果物に関する公開特許開示リスト を維持しています。 そのページには特許開示の手順も記載されています。 特許に関する実際の知識があり、その特許が必須請求に該当すると考える場合は、 W3C特許ポリシー第6節に従って開示してください。

1. 差分仕様

これは差分仕様(デルタ仕様)であり、現在はWeb Animations Level 1 [WEB-ANIMATIONS-1] との差分のみを記載しています。 Level 1の仕様が完成に近付いた際には、本書の追加事項と統合され、Level 2の完全な仕様となる予定です。

2. タイミングモデル

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

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

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

2.1.1. 階層構造

本仕様レベルでは更新されたタイミング階層図が含まれています。

A hierarchy of timing nodes
タイミングノードの階層構造。各ノードは親ノードから時刻を継承します。

また、以下の更新済み説明も付随します:

このような階層構造の結果として、複雑なアニメーション全体を単一の単位として逆再生したり、スケジューリング、加速などの操作が可能となります。これは、親ノードへの操作がその子孫ノードへカスケード的に反映されるためです。 さらに、全ての時刻が共通の基準から導かれるため、アニメーションの同期も容易です。

2.2. タイムライン

追加:

タイムラインのdurationは、そのタイムラインで生成可能な現在時刻の最大値を表します。この値は、アニメーションの対象エフェクトの固有反復時間を計算するのに使われます。特に効果のiteration durationが"auto"の場合は、対象のタイムラインと連動します。値は効果が利用可能な時間を埋めるように計算されます。単調増加なタイムラインの場合、現在時刻には上限がなく、タイムラインdurationは未解決となります。非単調(例:スクロール)タイムラインの場合、durationには固定上限があります。この場合、そのタイムラインは進捗ベースのタイムラインとなり、そのタイムラインdurationは100%となります。

2.3. アニメーションフレーム

アルゴリズムの最初のステップの注記に、次の項目を追加:

2.4. アニメーション

追記:

進捗ベースのタイムラインに関連付けられたアニメーションエフェクトは、タイミング特性を割合(比率)に変換する必要があります。への変換手順は以下の通り:

  1. iteration durationがautoの場合、次のステップを行います。

    • start delayend delayを0に設定します。これは、時間と割合を混在させることができないためです。

      注記: 将来のバージョンではこれらプロパティがパーセントで指定できるようになる可能性があり、その場合、値が時間の場合のみ無視されることになります。

    それ以外の場合:

    1. total timeend timeとする。

    2. start delayspecified start delay / total time * timeline durationで評価した結果に設定する。

    3. iteration durationspecified iteration duration / total time * timeline durationで評価した結果に設定する。

    4. end delayspecified end delay / total time * timeline durationで評価した結果に設定する。

指定タイミングの正規化手順は以下の通り:

timeline durationが解決済みの場合:

それ以外の場合:
  1. start delay = specified start delay

  2. end delay = specified end delay

  3. iteration durationがautoの場合:

    それ以外の場合:

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

アニメーションのタイムラインを設定animationnew timeline(null可)へ設定)の手順は以下の通り:

  1. old timelineを、animationの現在のtimeline(存在すれば)とする。

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

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

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

  5. previous progressを次の最初に該当する条件に基づいて設定:

    もしprevious current timeが未解決であれば:

    previous progressを未解決に設定する。

    もしend timeが0であれば:

    previous progressを0に設定する。

    それ以外の場合

    previous progress = previous current time / end time

  6. from finite timelineold timelineがnullではなく、かつ単調増加タイムラインでない場合trueとする。

  7. to finite timelinetimelineがnullでなく、かつ単調増加タイムラインでない場合trueとする。

  8. animationtimelinenew timelineに設定する。

  9. 次のうち最初に一致する条件に対し該当するステップを実行:

    もしto finite timelineなら、
    1. 保留中再生レートの適用animationに対して行う

    2. auto align start time を true に設定する。

    3. start time を未解決に設定する。

    4. hold time を未解決に設定する。

    5. もしprevious play stateが"finished"または"running"であれば

      1. pending play taskをスケジューリングする

    6. もしprevious play stateが"paused"で、かつprevious progressが解決済みの場合:

      1. hold timeprevious progress * end time に設定する。

    この手順により、previous progressはpause-pending かつ開始時刻が解決済みな場合でも維持されます。

    もしfrom finite timelineであり、かつprevious progressが解決済みの場合、

    現在時刻の設定手順を、previous progress * end time で実行する。

  10. もしanimationstart time未解決であれば、animationhold time未解決にする。

    このステップは、finished play stateが“sticky”にならず、更新後の現在時刻に基づき再評価されることを保証します。

  11. アニメーションの終了状態の更新手順を、did seekフラグfalse、synchronously notifyフラグfalseで実行する。

問題: new timelineがnullのとき、カスタムエフェクト未解決iteration progressで呼び出されることを保証すべきです (同じスクリプト実行コンテキストで以後の変更がこの操作を冗長にしない場合)。

2.4.2. アニメーションのターゲットエフェクト設定

pending play taskを再スケジューリングする手順の後に、次のステップを追加:

  1. もしnew effectnullでなく、かつnew effect親グループがあるなら、removenew effectをその親グループから外す。

new effectanimation関連エフェクトに割り当てる手順の後に、以下のステップを含める:

  1. もしold effectnullでなければ、カスタムエフェクトの呼び出し対象である包括的な子孫すべてについて、old effect未解決iteration progressでコールバックするタスクをキューに入れる。

    old effect が同一タスク内で別のアニメーションに再びアタッチされた場合には、追加の未解決値でのコールバックは不要かもしれません。

    カスタムエフェクト呼び出しの正確なタイミング定義は見直しと再検討が必要です。

2.4.3. 関連エフェクトの待機

以下に置き換え:

アニメーションは、次の両方の条件が成立した最初の瞬間にreadyになる:

次で置き換え:

アニメーションは、次のすべての条件が成立した最初の瞬間にreadyになる:

注: アニメーションは、ready ではありません。まだ 開始時刻 または 停止時刻 がない場合です。 スクロール駆動アニメーションについては、auto align start time が true の場合、 タイムラインを更新するときに開始時刻が決定されます。

2.4.4. CSSNumberish time の検証

CSSNumberish time を検証する手順は、入力値timeに対し最初に一致する条件に基づいて行います:

以下の条件がすべて満たされる場合:

TypeErrorthrow する。

false を返す;

以下の条件がすべて満たされる場合:

TypeErrorthrow する。

false を返す。

それ以外の場合

true を返す。

2.4.5. Animation の現在時刻を設定する

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

現在時刻を静かに設定する手順(アニメーションanimationの現在時刻をseek timeに設定)は次の通りです:

  1. もしseek time未解決時刻値であれば、次を行う:

    1. もしcurrent time解決済みなら TypeError を throw する。

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

  2. valid seek time を、CSSNumberish time を検証手順でseek timeを入力として実行した結果とする。

  3. もしvalid seek timeが false なら、この手順を中止する。

  4. auto align start time を false に設定する。

  5. 次の通りanimationhold timeまたは start time を更新する:

    いずれかの条件が true の場合:

    1. animationhold timeseek timeに設定する。

    それ以外の場合

    animationstart timetimeline time - (seek time / playback rate) で評価した結果に設定する。ただしtimeline timeanimationに紐づくtimelineの現在time valueとする。

  6. もしanimationに関連するtimeline が無いか、または関連 timelineinactiveなら animationstart time未解決にする。

    これにより、アクティブなタイムラインが無い場合、start timecurrent timeのいずれかしか設定できないという不変条件が維持されます。

  7. animationprevious current time未解決にする。

現在時刻を設定する手順(アニメーションanimationの現在時刻をseek timeに設定)は次の通りです:

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

  2. もしanimationpending pause taskを持つ場合、pause操作を次のステップですぐに完了する:

    1. animationhold timeseek timeに設定する。

    2. 保留中再生レートを適用する。

    3. animationstart time未解決にする。

    4. pending pause taskをキャンセルする。

    5. resolveanimationcurrent ready promiseanimationで解決する。

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

2.4.6. Animation の開始時刻を設定する

開始時刻を設定 手順(animation animation の開始時刻を new start time に設定)は以下の通り:

  1. valid start time を、CSSNumberish time を検証手順で new start time を入力として実行した結果とする。

  2. もし valid start time が false なら、この手順を中止する。

  3. auto align start time を false に設定する。

  4. timeline time を、animationに関連付けられた timeline の現在の time value とする。 animation に関連付けられたtimelineが 存在しないか、関連タイムラインがinactiveの場合は、 timeline time未解決とする。

  5. もしtimeline time未解決かつnew start time解決済みなら、 animationhold time未解決にする。

    これにより、アクティブなタイムラインが存在しない場合、start timecurrent timeのいずれかしか設定できないという不変条件が維持されます。

  6. previous current timeanimationcurrent time とする。

    注記: これは、前ステップによりcurrent time未解決になることもあるので、変更後の値となる。

  7. 保留中再生レートを適用する。

  8. animationstart timenew start time に設定する。

  9. animationhold time を次の条件分岐で更新する:

    もし new start time解決済みの場合

    もし animationplayback rate が0でないなら animationhold time未解決にする。

    それ以外の場合 (new start time未解決)
    1. animationhold timeprevious current timeに(それが未解決でも)設定する。

  10. もし animationpending play taskpending pause task を持っていれば、それらをキャンセルし、 resolveanimationcurrent ready promiseanimation で解決する。

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

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

アニメーションを再生する手順(animation、およびフラグauto-rewindを与える)は次の通り:

注記:auto-rewindフラグは、このモデルを基に構築されているが巻き戻し動作を必要としない他仕様、たとえばCSS Animations [CSS-ANIMATIONS-1]向けに用意されています。

  1. aborted pause を、animationpending pause taskを持つ場合にtrue、そうでなければfalseとなる論理値とする。

  2. has pending ready promise を初期値falseの論理値フラグとする。

  3. has finite timeline を、animationが関連付けられたtimelineを持ち、かつそれが単調増加でない場合にtrueとする。

  4. previous current timeanimationcurrent time とする。

  5. enable seek を、auto-rewindフラグがtrueでかつhas finite timelineがfalseのときtrue、さもなければfalseとする。

  6. 次のうち最初に該当する条件に従って手順を実行:

    もし animationeffective playback rate > 0 かつ enable seek が true かつ、さらにいずれかの条件が成り立つ場合:

    animationhold time を 0 に設定する。

    もし animationeffective playback rate < 0 かつ enable seek が true かつ、さらにいずれかの条件が成り立つ場合:

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

    InvalidStateError DOMException をスローし、この手順を中止する。

    それ以外の場合

    animationhold timeanimationassociated effect end にする。

    もし animationeffective playback rate = 0 かつ animationcurrent time未解決の場合

    animationhold time を 0 に設定する。

  7. もし has finite timeline が true かつ previous current time が未解決の場合:

    • フラグ auto align start time を true に設定する。

    注記: CSSアニメーションでスタイル更新中にplayが呼ばれた場合、animationstart timeはレイアウト後でないと確定できません(開始時刻はアニメーション範囲の先頭または末尾(playback rateに依存)に揃える必要があるため)。 この場合、アニメーションは開始時刻自動調整状態とされ、進行度をアニメーション範囲に合わせるように自動的に開始時刻が調整されます。

  8. もし animationhold time解決済みの場合、 start time未解決にする。

  9. もし animationpending play taskまたは pending pause taskを持つ場合

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

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

  10. 以下の3条件が全て満たされる場合:

    この手順を中止する。

  11. もし has pending ready promise が false なら animationcurrent ready promiseanimationrelevant Realm新しいpromiseとする。

  12. animationreadyになったらすぐ実行するタスクをスケジュールする。 タスクは以下のステップを実行する:

    1. animationstart timehold timeのいずれかが解決済みであることをアサートする。

    2. ready timeを、animationに関連するtimelineanimationready状態になった瞬間のtime valueとする。

    3. 次のいずれかに該当する場合、該当する条件ごとにステップを実行:

      もし animationhold time解決済みなら
      1. 保留中再生レートの適用animationに行う。

      2. new start timeready time - hold time / playback rate で計算する(ただし再生レート0の場合はnew start time=ready time)。

      3. animationstart timenew start timeに設定する。

      4. 再生レートが0でなければ、animationhold time未解決にする。

      もし animationstart timeが解決済み、かつ animationpending playback rateを持つ場合
      1. current time to match(ready time - start time) × playback rate で計算する。

      2. 保留中再生レートの適用animationに行う。

      3. 再生レート0の場合はhold timecurrent time to matchに設定する。

      4. new start timeready time - current time to match / playback rate で計算する(再生レート0の場合はready time)。

      5. animationstart timenew start timeに設定する。

    4. resolveanimationcurrent ready promiseanimationで解決する。

    5. アニメーションの終了状態の更新手順を did seekフラグfalse, synchronously notifyフラグfalseで実行する。

      上記2つの手順の順序が重要です。これにより、長さゼロの関連エフェクトを持つアニメーションはcurrent ready promisecurrent finished promiseより前に解決します。

    上記タスクがスケジュール済みでまだ実行されていない間、animationpending play taskを持つとみなします。 なおそのタスク実行中は、animationpending play taskを持ちません。

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

    上記要件は、次のようなコードがすべての実装で一貫した動作となることを保証します:

    animation.play();
    animation.ready.then(
      () => { console.log('Playback commenced'); },
      () => { console.log('Playback was canceled'); }
    );
    // Suppose some condition requires playback to be canceled...
    animation.cancel();
    // "Playback was canceled" will be printed to the console.
    

    もしpending play taskが同期的に実行されていれば、 current ready promiseはrejectされません。

  13. アニメーションの終了状態の更新手順を did seekフラグfalse, synchronously notifyフラグfalseで実行する。

アニメーションを再生手順には、カスタムエフェクトの更新タスクをスケジューリングする処理も含める必要がある。

2.4.7.1. 開始時刻の自動調整

非単調タイムラインにアタッチされている場合、アニメーションの開始時刻はレイアウト依存となりうる。この場合、タイムラインがレイアウト後に更新されてから開始時刻の計算を行う。タイムラインの現在時刻が更新される時、関連付けられているアニメーションすべてのstart timeが条件に応じて更新される。 開始時刻自動調整の手順は以下の通り:

  1. もしauto-align start timeフラグがfalseなら、この手順を中止する。

  2. タイムラインがinactiveなら、この手順を中止する。

  3. play stateがidleなら、この手順を中止する。

  4. play stateがpausedかつhold timeが解決済みなら、この手順を中止する。

  5. start offsetアニメーションattachment範囲の開始に対応する解決済みタイムライン時刻とする。 view timeline の場合、この計算はカバー範囲の比率に基づく。

  6. end offsetアニメーションattachment範囲の終了に対応する解決済みタイムライン時刻とする。 view timeline の場合、この計算はカバー範囲の比率に基づく。

  7. start timeeffective playback rateが0以上ならstart offset、 それ以外はend offsetに設定する。

  8. hold timeをクリアする。

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

アニメーションを一時停止する手順は、 関連エフェクトだけでなく、その関連エフェクトのすべての子孫にも参照する必要があります。

同様に、アニメーションの一時停止手順には カスタムエフェクトの更新タスクをスケジューリングすることも含める必要があります。

seek time の設定に関する制約は単調タイムライン使用時のみに適用されるように更新してください。 スクロール駆動アニメーション では、アニメーション範囲が計算されるまで hold time の設定を遅延する必要があります。

次の記述を置き換え:

  1. seek time を 最初はtime value未解決状態とする。

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

  3. animationcurrent time未解決の場合、次のうち最初に該当する条件で手順を実行する:

    もしanimationplayback rateが0以上なら

    seek time を 0 にする。

    それ以外の場合
    もし associated effect end が正の無限大なら

    InvalidStateError DOMException をthrowしこの手順を中止する。

    それ以外の場合

    seek timeanimationassociated effect end にする。

  4. seek time解決済みなら

    もし has finite timeline がtrueなら

    animationstart timeseek time に設定する。

    それ以外の場合

    animationhold timeseek time に設定する。

次で置き換え:

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

  2. もし animation現在時刻未解決 であり、かつ has finite timeline が false の場合、下記の最初に当てはまる条件に従って処理を行う:

    もし animation再生レート が 0 以上の場合

    停止時刻 をゼロに設定する。

    それ以外の場合
    もし 関連エフェクトの終点animation に対して正の無限大である場合

    "throw" "InvalidStateError" DOMException を送出して、これらの手続きを中止する。

    それ以外の場合

    停止時刻animation関連エフェクトの終点 に設定する。

  3. もし has finite timeline が true かつ animation現在時刻未解決 の場合

    • auto align start time フラグを true に設定する。

次の記述を置き換え:

次の2つの条件がともに成立した最初の瞬間にタスクをスケジュールする:

次で置き換え:

次のすべての条件が成立した最初の瞬間にタスクをスケジュールする:

注記: pause-pending なアニメーションでは auto-align start time フラグが true の場合、 start time が正しく範囲に揃うように必要です。 start time の設定は 開始時刻自動調整手順に従って行います。

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

最後のステップを追加:
  1. animation包括的な子孫のうち、 そのカスタムエフェクトを持つもの全てについて、 関連エフェクト未解決のiteration progressで タスクをキューする。

    カスタムエフェクト呼び出し処理は見直しが必要です。現状では変化が合成できる場合にも頻繁に呼ばれすぎている可能性があります。

2.4.10. 速度制御

次の文を追記:

アニメーションエフェクトにも ここで定義されるものとは異なる挙動をする playback rate が 関連付けられていることに注意。

2.4.11. アニメーション全体の進行度の計算

アニメーションのoverallProgressは、 current timeassociated effect endの比率で定まる。

テスト
overallProgressanimation animation)の計算手順は以下の通り:

以下のいずれかに該当する場合:

animationoverallProgress は null。

もし animationassociated effect end が0の場合
もし animationcurrent time が負なら

animationoverallProgress は0。

それ以外

animationoverallProgress は1。

もし animationassociated effect end が無限大の場合

animationoverallProgress は0。

それ以外
overallProgress = min(max(current time / animationassociated effect end, 0), 1)

2.5. アニメーション効果

次の文章を追加:

animation の関連エフェクトは そのアニメーションに直接関連付けられていると呼ばれます。

アニメーションエフェクトグループエフェクトを用いて階層構造にまとめられます(§ 2.10 Grouping and synchronization参照)。 その階層のルート アニメーションエフェクトだけが 直接アニメーションに関連付けられます親グループを持つアニメーションエフェクトアニメーションの関連エフェクトに指定される場合、 そのエフェクトは関連付け前に親グループから削除される。

アニメーションエフェクトアニメーションに関連付けられる のは、それが直接関連であるか 祖先となるグループエフェクト直接アニメーションに関連付けられている場合です。

2.5.1. アニメーションエフェクトの種類

本仕様は2種類のアニメーションエフェクトを定義します:

2.5.2. 活動区間(アクティブインターバル)

この仕様レベルでは活動区間(active interval)の下限が次のように定義されます:

アクティブインターバルの下限エフェクト開始時刻で決まり、 エフェクトstart delay によって調整されることもあります。

続く図では animation effect start time(アニメーションエフェクト開始時刻)を animation start time(アニメーション開始時刻)の代わりに参照する必要があります。

end delay の記述も次のように更新されます:

end delay も指定可能ですが、 主にシーケンスエフェクトなどアニメーションの連鎖時に有用です。

規範的記述は次のように更新:

アクティブインターバルの下限は、エフェクトの 開始時刻start delayの組み合わせで決まる。

アニメーションエフェクト開始時刻は、そのエフェクトの親グループ(あれば)が エフェクトの開始をスケジュールした時点。表現単位は継承時刻

ほとんどの場合(親グループがない場合を含む)は、この開始時刻は0となる。 唯一の例外はシーケンスエフェクトで、これについては § 2.10.4.1 Sequence effectの子の開始時刻に記載。

開始時刻に加えて、 アニメーションエフェクトstart delay という開始時刻からのオフセットも持つ。 開始時刻

開始時刻が親グループによって決まるのに対し、 start delay はエフェクト自身のプロパティである。

アニメーションエフェクト(animation effect)の アクティブインターバルの下限(継承時刻空間で表現)は 開始時刻start delayの和である。

これらの定義はローカル時刻§ 2.5.3参照)やアクティブタイムの計算に組み込まれている。

そしてend timeの定義に関しては次の通り:

アニメーションエフェクトend timemax(開始時刻 + start delay + active duration + end delay, 0) で評価した結果とする。

2.5.3. ローカル時刻と継承時刻

この節は追加されました。

Web Animations では、すべての時刻は何らかの基準点に対する相対値として扱われます。 各基準点ごとに異なる 時刻空間 が生じます。

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

座標空間と同様、時刻空間もネスト(入れ子)可能です。 グループエフェクトは多くの場合、 時刻値に 何らかの変形を加えてアニメーションから受け取り、 その変形後の時刻値を子へ渡します。 子のアニメーション効果は、その変形後の時刻空間内で 動作します。

子は親から受け取った変形済み時刻値(これを継承時刻と呼ぶ)に 自身の開始時刻を加算し、下図のように 独自のローカル時刻空間 を確立します。

Inherited time and local time.
継承時刻とローカル時刻。
時刻tにおける継承時刻は 2.5。
アニメーション効果 (a) の 開始時刻が 1 の場合、 ローカル時刻は 1.5。
アニメーション効果 (b) は 開始時刻 1、および start delay 1 を持つが、 ローカル時刻も 1.5 になる。 これは ローカル時刻アニメーション効果開始時刻だけを基準とし、 start delayは基準にしないからです。

アニメーション効果における、その時点での継承時刻は、次のいずれか最初に該当する条件で決まります:

そのアニメーション効果親グループを持つ場合

継承時刻は親グループの現在 変換済み時刻

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

継承時刻は アニメーションのcurrent time です。

それ以外の場合

継承時刻は未解決

ローカル時刻アニメーション効果継承時刻から開始時刻を引いた値です。 継承時刻未解決の場合、 ローカル時刻も未解決となります。

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

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

in play状態の非規範的な説明には次の内容が含まれています:

これは、アニメーションエフェクト およびその全ての祖先active phaseにある場合に発生します。 アニメーションエフェクトin playのときだけ「動作」します。

アニメーションエフェクトactive phaseにあるがin playではない、という状況もありえます。 たとえば、アニメーションエフェクト親グループがアニメーションエフェクトのactive intervalを切り詰め、親子で同じfill modeを適用している場合、子アニメーションエフェクトは、active phase内にスナップショットが残る状態となり、in playではなくなっても実質的に状態が保たれる場合があります。

currentについても同様です。

次のいずれかの場合に該当します:アニメーションエフェクトin play、またはbefore phaseである、あるいはその祖先がこの条件を満たす場合(たとえば繰り返しによって再び再生される可能性を開く)。

in playの規範的な定義には次の条件が含まれています:

  1. アニメーションエフェクト親グループを持ち、その親グループがin playであるか、またはアニメーションエフェクトアニメーションに直接関連付けられていてそのアニメーションがfinishedでない。

次の部分の代わりに:

  1. アニメーションエフェクトアニメーションに関連付けられていて、かつfinishedでない。

currentの規範的な定義には以下の条件が追加されています:

アニメーションエフェクトのphaseを決定する際に使用する用語リストに次の定義を追加します:

at progress timeline boundary

次の手順で判定します:

  1. 次のいずれかの条件がであれば:

    falseを返す

  2. effective start timeを、アニメーションstart timeが解決済みならその値、そうでなければ0とする。

  3. 次の一致する条件に基づきunlimited current timeを決定:

    start timeが解決済み:

    (timeline time - start time) × playback rate

    それ以外

    animationのcurrent time

  4. effective timeline timeを次で計算する: unlimited current time / アニメーション再生速度(playback rate) + effective start time

  5. effective timeline progressを次で計算する: effective timeline time / タイムラインduration

  6. effective timeline progressが0または1の場合はtrue、それ以外はfalseを返す。

この手順は、アニメーションが一時停止中でアニメーションのcurrent timeが明示的に設定されている場合には、タイムラインのcurrent timeとアニメーションのcurrent timeとの間にリードやラグが生じるため厳密には正しくありません。

この手順はさらに簡略化でき、再生速度や開始時刻に関係なくスクロール境界かどうかのみ判定すればよいでしょう。ここで意図するのは、アニメーションがちょうどスクロール制限で非アクティブになる予期しない挙動を防ぐことなので、ScrollTimeline の場合 fill-mode の設定が不要になります。タイムラインcurrent timeが0またはタイムラインdurationであるか判定すれば十分かもしれません。

次の部分を:

アニメーションエフェクトは、そのローカルタイムunresolvedでなく、かつ以下のいずれかが成り立つときbefore phaseにあります:

  1. ローカルタイムbefore-active boundary timeより小さい、または

  2. animation directionが"backwards"で、ローカルタイムbefore-active boundary timeに等しい。

次で置き換え:

アニメーションエフェクトは、そのローカルタイムunresolvedでなく、かつ以下のいずれかが成り立つときbefore phaseにあります:

  1. ローカルタイムbefore-active boundary timeより小さい、または

  2. animation directionが"backwards"で、ローカルタイムbefore-active boundary timeに等しく、さらにat progress timeline boundaryではない。

次の部分を:

アニメーションエフェクトは、そのローカルタイムunresolvedでなく、かつ以下のいずれかが成り立つときafter phaseにあります:

  1. ローカルタイムactive-after boundary timeより大きい、または

  2. animation directionが"forwards"で、ローカルタイムactive-after boundary timeに等しい。

次で置き換え:

アニメーションエフェクトは、そのローカルタイムunresolvedでなく、かつ以下のいずれかが成り立つときafter phaseにあります:

  1. ローカルタイムactive-after boundary timeより大きい、または

  2. animation directionが"forwards"で、ローカルタイムactive-after boundary timeに等しく、さらにat progress timeline boundaryではない。

2.5.5. フィルモード

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

forwards fill mode の説明は次のように更新されます:

アニメーションエフェクトがafter phaseのとき、…

アニメーションエフェクトがafter phase、またはアニメーションエフェクトがactive phaseだが、ある祖先after phaseの場合、…

backwards fill mode の説明は次のように更新されます:

アニメーションエフェクトがbefore phaseのとき、…

アニメーションエフェクトがbefore phase、またはアニメーションエフェクトがactive phaseだが、ある祖先before phaseの場合、…

both fill mode の説明は次のように更新されます:

アニメーションエフェクト…

アニメーションエフェクトまたはある祖先

(2か所)

現状、タイミング関数が[0,1]の範囲外の結果を生成した場合、group effectに適用すると予期しない挙動となり、子要素がイテレーション回数を増やしたりfill modeへ移行したりして、本来定義された挙動が外挿されなくなります(直接タイミング関数を適用された場合のほうが望ましい挙動となります)。

この問題の修正には、有効時間範囲より大きい・小さいtime valueにも“補間”ではなく外挿で応答する‘overflow’ fill modeの導入が考えられます。

詳しくは2013年東京対面会議議事録のセクション15(Overflowing fill)を参照。

2.6. 繰り返し

2.6.1. 繰り返し区間

次の記述の後に:

1回分の繰り返しの長さをiteration duration(反復期間)という。

追加:

アニメーションエフェクトの初期のiteration durationは、その固有反復期間(intrinsic iteration duration)である。 固有反復期間は、以下のうち最初に一致する条件で計算する:

アニメーションエフェクトがグループエフェクトのとき

§ 2.10.3 グループエフェクトの固有反復期間の手順に従う

アニメーションエフェクトがシーケンスエフェクトのとき

§ 2.10.4.2 シーケンスエフェクトの固有反復期間の手順に従う

timeline duration が未解決、または iteration count が0の場合

0を返す

それ以外の場合

(100% - start delay - end delay) / iteration count を返す

注記: 現時点ではstart/end delayは0だが、将来的にパーセント指定がサポートされた際はこの計算式になる。

iteration durationは、著者によって固有反復期間以外の値も設定可能である。

2.6.2. 繰り返しの時刻空間

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

このセクションの最初の数段落は次の記述に置き換え:

これまで、ローカル時刻継承時刻§ 2.5.3 ローカル時刻と継承時刻参照)など、 様々な時刻空間を説明してきた。繰り返しによってさらにもう一つの時刻空間―iteration time space(繰り返しの時刻空間)―が導入される。

2.6.3. 区間タイミング

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

記述は以下のように更新:

下記の例において、繰り返しエフェクトではローカル時刻1秒でiteration timeが0となる。 シーケンスのエフェクトでは、継承時刻1秒のとき、Bエフェクトのみ再生中となり、区間間に重なりは無い。

図も以下のように更新:

Illustration of end-point exclusive timing.
端点排他タイミングのイラスト。繰り返し・シーケンスいずれのアニメーションエフェクトでも区間の境界で重なりは生じない。

2.7. アニメーションエフェクトの速度制御

(このセクションは追加されました。)

アニメーションと同様に、アニメーションエフェクトにも playback rate(再生レート) パラメータがある。 再生レートアニメーションエフェクト変換後時刻(transformed time)ローカル時刻から算出するときに乗算する有限な実数である。

再生レートアニメーションエフェクトに設定したときの効果は、 アニメーション自体の再生レートとは異なる。 詳細な挙動は§ 2.8 コアアニメーションエフェクト計算で定義されている。

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

要約すると、再生レートアニメーションエフェクトでの挙動は以下の通り:

2.8. コアアニメーションエフェクト計算

2.8.1. 概要

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

次の記述を:

Web Animations タイミングモデルの核となるのは、ローカル時刻iteration progress に変換する処理である。

以下で置き換え:

Web Animations タイミングモデルの核となるのは、継承時刻iteration progress に変換する処理である。

図を更新し「アニメーションエフェクトの再生レート」を示す:

Calculation of the active duration.
アクティブ期間iteration durationiteration countを掛け、 再生レートで割ったもので決まる。

更新:

アクティブ期間が確定したら、 アニメーションエフェクトローカル時刻変換済み進行度iteration progress)に変換する過程は下図のとおり。

以下で置き換え:

アクティブ期間が確定したら、 アニメーションエフェクト継承時刻変換済み進行度iteration progress)に変換する過程は下図のとおり。

タイミング計算図も次のように更新:

An overview of timing model calculations.
タイミングモデル計算の概要。
(1) 継承時刻ローカル時刻に変換(開始時刻を加味)。
(2) ローカル時刻アクティブ時刻に変換(start delayを加味)。
(3) アクティブ時刻iteration duration, iteration start, 再生レートを使って 全体進行度に変換。
(4) 全体進行度を1回分の進行度(simple iteration progress)に変換。
(5) simple iteration progressdirected progressに変換(再生方向も考慮)。
(6) 最後にタイミング関数をdirected progressに適用して 変換済み進行度となる。

次の文を:

最初のステップであるローカル時刻の計算は、Local timeに記載。

以下で置き換え:

最初のステップであるローカル時刻の計算手順は § 2.5.3 ローカル時刻と継承時刻に記載。

2.8.2. アクティブ期間の計算

次のように更新:

アクティブ期間を計算するため、まず 繰り返し期間 を以下の式で定義する:

繰り返し期間 = iteration duration × iteration count

iteration duration または iteration count のいずれかが0の場合、 繰り返し期間は0となる。

この定義は、無限大×0はIEEE 754-2008では未定義となっているため必要である。

アクティブ期間 は次のステップで計算する:

  1. 再生レートが0のときは Infinity を返す。

  2. それ以外は 繰り返し期間 / abs(再生レート) を返す。

2.8.3. ローカル時刻の変換

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

アクティブ時刻active timeの定義の条件に 親グループの参照を追加:

ただしこれは、アニメーションエフェクトが 出力すべき場合のみ定義されるため、そのfill modeと フェーズ、そして(あれば)親グループのフェーズに従い次のように分類される:

各フェーズへの追加手順:

アニメーションエフェクトが before phase の場合

結果は以下のうち最初に該当する条件による:

エフェクトが親グループを持ち、その親グループがafter phaseのとき

未解決時刻値を返す。

アニメーションエフェクトが active phase の場合

結果は以下のうち最初に該当する条件による:

エフェクトが親グループを持ち、 その親グループがbefore phaseで、 このアニメーションエフェクトのfill modenoneもしくはforwardsのとき

未解決時刻値を返す。

エフェクトが親グループを持ち、 その親グループがafter phaseで、 このアニメーションエフェクトのfill modenoneまたはbackwardsのとき

未解決時刻値を返す。

それ以外

local time - start delay の結果を返す。

アニメーションエフェクトが after phase の場合

結果は以下のうち最初に該当する条件による:

エフェクトが親グループを持ち、 その親グループがbefore phaseのとき

未解決時刻値を返す。

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

未解決時刻値を返す。

2.8.3.2. 全体進行度の計算

overall progressの定義の "Otherwise" 分岐の initial progress の部分を次のように更新:

それ以外の場合

overall progress を以下のうち最初に該当する条件で計算:

再生レートが0未満の場合

(active time - active duration) × 再生レート / iteration duration

再生レートが0の場合

overall progressは0とする。

その他

(active time × 再生レート) / iteration duration

2.9. 時刻変換

現在、タイミング関数のセットは グループエフェクトで 制限されていません。 これにより実装の複雑さやfill modeとの挙動の複雑さに懸念が上がっています。 その結果、グループエフェクトで全てのタイミング関数を許可するのはリスクありと考えられています。

代案として、グループエフェクトで許可するタイミング関数を linear timing functionに限定する、 または複雑さを緩和する「単純な」タイミング関数の集合のみ許可することが考えられます。

2013年8月ディスカッション section 2を参照

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

第2ステップを、before flag計算(エフェクトの再生レート対応)の内容で置き換え:

  1. current directionforwardsである、 または再生レートが0以上である (ただし両方ともtrueの場合は除く)のいずれかなら going forwardsをtrue、そうでなければfalseとする。

2.9.2. 変換済み時刻の計算

(このセクションは追加されました。)

アニメーションエフェクトの 変換済み時刻 は単純に 変換済み進行度iteration duration を掛けたものとなる。

変換済み進行度未解決の場合、 変換済み時刻未解決となる。

変換済み進行度が0で、iteration duration が無限大の場合、変換済み時刻は0となる。

2.10. グループ化と同期

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

アニメーション効果 のタイミングプロパティを個別に設定することもできるが、 アニメーション効果の一部や全体を 共通タイミングで同期したい場合がある。これは グループエフェクト で実現される。

簡単な例を下図に示す。

Using groups to share common timing properties.
グループで共通タイミングプロパティを共有する例。
(a) 個別アニメーションに5秒のdelayを設定した場合。
(b) グループ全体にdelayを指定した場合。同じ効果が得られる。

グループエフェクトアニメーションに直接関連付けられているとき、 そのグループエフェクトに関連付けられている アニメーション効果全体をまとめてシーク・一時停止・停止できる。

グループエフェクトは、アニメーションエフェクトの一種であり、 アニメーションエフェクトの順序付きの0個以上の並びを含み、これらを子エフェクトと呼びます。

任意の時点で、アニメーション効果は最大1つの グループエフェクト子エフェクトになれる。 これを 親グループ と呼ぶ。 親グループ子エフェクト自身と同じアニメーション効果であってはならない。

グループエフェクトをネストすると 階層的なツリー構造を作れる。 こうした構造の部品や特性を記述する用語は [DOM]で定義されている:

注記: アニメーション効果への これら定義の適用において、「親」は親グループ(parent group)のみを指し、 アニメーション(概念的には親時刻ソースだが)は含まないことに注意。

子エフェクトとその 親グループの 時間関係は継承時刻定義(§ 2.5.3 ローカル時刻と継承時刻参照)に含まれる。

2.10.1. グループ時刻と子時刻の関係

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

グループエフェクトの子のタイミングは グループ自身のタイミングに基づく。 具体的には、子の時刻は親の変換済み時刻を基準にする。 繰り返しに関しては、子は親の1イテレーション内で動作することになる。

たとえばグループエフェクトiteration countが2の場合、 子アニメーションも2回再生される。実質的に親の繰り返し内で再生されるため。

The effect of multiple iterations on the children of a group.
グループエフェクトの子は グループの変換済み時刻に基づくため、 グループが繰り返されると子も再生される

この場合でも、子アニメーション効果アクティブ区間1つのみであることに注意。 しかし親タイミングの影響で アクティブ区間が2度再生されることになる。

グループの子にもiteration count を指定した場合、親子のiteration count の掛け算のように動作する。

Iteration counts are multiplicative.
iteration count 2を グループエフェクト、 3をその子アニメーションに指定すると、 該当子アニメーションは6回再生される。

さらに、子がグループ親の変換済み時刻を基準に 動作するので、親のアクティブ区間 の外ではアニメーションできなくなる。 これはグループの変換済み時刻が 区間外で変化しないためであり、 グループは子の再生をクリップできる。

Groups clip the active interval of contained children.
1つ目はアニメーション効果が負のdelay&無限の iteration countを持つ例。
2つ目は同様のアニメーション効果グループエフェクト内に (親が特定のiteration duration指定)入ることで 子エフェクトのアクティブ区間が クリップされる。

親グループの変換済み時刻を基準にすることで次も当てはまる:

2.10.2. グループエフェクトの子の開始時刻

グループエフェクト子エフェクト開始時刻は0とする。

ただし、グループエフェクトの具体的なタイプによってこの定義が上書きされる場合がある。

2.10.3. グループエフェクトの固有反復期間

グループエフェクト固有反復期間は 最後の子エフェクトアクティブ区間が終わる 時刻で決まる。計算は下記のように子エフェクト数で変わる。

グループに子エフェクトが無い場合

固有反復期間は0。

それ以外
  1. maximum end timeをグループ内すべての子エフェクトend timeの最大値とする。 end timeは時刻またはパーセント(progress-based timelineの場合)で表現される。 時刻とパーセントが混在する場合、最大の時刻値が100%となるよう時間スケーリングする。

  2. 固有反復期間max(0, maximum end time)で評価した値とする。

この定義はグループエフェクトの具体的なタイプで上書きされる場合がある。

2.10.4. シーケンスエフェクト

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

グループエフェクトの具体タイプで子の同期挙動を変えることができる。 本仕様ではさらに グループエフェクトの一種 シーケンスエフェクトを定義する。 シーケンスエフェクトは 子の開始時刻を順に調整し子を1つずつ再生する。

並列グループとシーケンスの違いを下図で比較:

Group effects and sequence effects.
グループエフェクトとシーケンスエフェクト。
(a)は通常のグループエフェクト(全子が同時に動作)。
(b)はシーケンスエフェクト(子を順に実行)。

グループエフェクトは 他のグループエフェクトを子にできるので、 異なるタイプのグループを組み合わせて複雑な同期も可能。 下図参照。

Nesting of group effects.
シーケンスエフェクト の子として通常のグループエフェクトが含まれる例。
グループエフェクトシーケンスエフェクトの 直前の子終了まで待機してから自身の子が同時に再生される。 全て終了後シーケンスの次の子が再生される。

シーケンスエフェクトグループエフェクトの 一種であり、グループ内の子エフェクト開始時刻を 調整して順番に再生する。

2.10.4.1. シーケンスエフェクトの子の開始時刻

シーケンスエフェクト子エフェクト開始時刻は、その子の直前の兄弟終了時刻とする。子に直前の兄弟がなければ開始時刻は0である。

アクティブ期間が正の無限大の場合、アニメーションエフェクト終了時刻や後続の子の開始時刻の計算はIEEE 754-2008の標準挙動に従う。そのため、シーケンスエフェクト内のいずれかの子に無限大のアクティブ期間がある場合、それ以降の子は再生されない。

また、上記定義は開始時刻を正の値に制限しないので、先行する子に負のstart delayがあると、グループの開始時刻より前にアクティブ区間が終了し、一部の子は再生されない場合がある。

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

アクティブ区間の開始は、アニメーションエフェクト開始時刻start delayの合計なので、シーケンスエフェクトの子同士のアクティブ区間は、後述の図のようにstart delayを使って前後にずらし、厳密に連続でなく重複も可能である。

Using negative start delays to overlap children of seq
        groups
シーケンスエフェクトの子がstart delayを持つことで、start delayが負なら重複させ、正なら間隔を空けるなど開始タイミングを調整できる例。

負のstart delayを使うことで2つの子のアクティブ区間を重ねることもできる。start delayはグループ内で後続の子の開始時刻にも影響する点に注意。

2.10.4.2. シーケンスエフェクトの固有反復期間

シーケンスエフェクト固有反復期間は、仮想的にグループの子の末尾に子エフェクトを1つ追加したときの開始時刻に等しい(§ 2.10.4.1 シーケンスエフェクトの子の開始時刻参照)。ただし結果が負値になる場合、固有反復期間は0とする。

したがって、シーケンスエフェクト子エフェクトがなければ固有反復期間は0となる。

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

3.1. アニメーションの型

3.1.1. アニメーション不可

非アニメーションプロパティを対象とする効果についての記述を以下のように更新:

アニメーション効果アニメーション不可なプロパティを対象としている場合でも、アニメーション効果として通常の挙動(シーケンスエフェクト内で時間を占める、シーケンスエフェクトで次の効果の実行を遅らせる、アニメーションcurrent finished promiseのfulfillを遅延する等)を示す。

3.2. キーフレームエフェクト

3.2.1. キーフレームエフェクトの値

キーフレームエフェクトで参照される単一プロパティのエフェクト値を、iteration progresscurrent iterationunderlying valueそれぞれについて計算する手順は、keyframe effect composite mode を適用する手順の後に以下を追加する:

  1. interval endpoints内の各keyframeに対し:

    1. (web-animations-1に同じ)

    2. このキーフレームエフェクト反復合成操作accumulateの場合、下記の手順をcurrent iteration回繰り返す:

      • property-specific keyframesで最終の keyframe のtarget property の値(Va)と、このkeyframetarget property値(Vb)について、accumulation procedure(プロパティに応じた加算処理)で合成し、その戻り値をkeyframetarget propertyの値に置き換える。

      注記: ここでの引数順は重要です。対象プロパティのアニメーション型が加算・合成処理を定めない場合、デフォルトではVb(つまりkeyframeの値)が返ります。蓄積できないプロパティの場合でも、初期値として常にVb(現イテレーションの値)になるべきなので、上記の手順通りにしています。

3.3. エフェクトの合成

3.3.1. エフェクトスタック

エフェクトの並び替え手順に次を追加:

  1. ツリー順序ABをソートする。 (この時点でABは同じアニメーションに属する。そうでなければ直前の手順でソートできているはず。)

「アニメーション効果の関連アニメーション」の定義は、このレベルで導入したアニメーションに関連付けられるに基づくよう改訂が必要。グループエフェクトを正しく扱うためにも。

3.4. エフェクトの蓄積

エフェクト値同士の合成と同様に(Web Animations § 5.4.4 Effect composition参照)、反復合成操作は同一キーフレームエフェクトにおける繰り返し間の値の合成方法を決める。

本仕様が定義する反復合成操作は以下の2つ:

replace

各繰り返しは前の繰り返しの結果を無視して独立して計算する。

accumulate

アニメーションの各繰り返しは、前イテレーションの最終値と蓄積する。

反復合成操作の適用はエフェクト値計算(§ 3.2.1 キーフレームエフェクトの値)で組み込む。

3.5. カスタムエフェクト

(このセクションは追加されました。)

この機能全体の見直しが必要。現状の案ではカスタムエフェクトではなく各アニメーションエフェクトがonupdateコールバックを持つ形がよい、という意見。既存効果にloggingやトリガ処理などを足す場合、従来型だと親グループを用意しなければならない。

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

いくつかの状況では、Web Animations が提供するアニメーション効果だけでは十分でない場合があります。 例えば、ここで定義されているアニメーション効果は 特定のCSSプロパティのみを対象にすることができます。 したがって、SVG要素のcurrentScale プロパティを、ドキュメントコンテンツに影響を与えずに ビューポートを滑らかにズームするために変更することはできません。

このように、提供されているアニメーション効果では 必要な機能が得られない場合は、スクリプトで定義したエフェクトを使うことができます。 このようなカスタム効果は、 タイミングモデルから反復進行度現在の反復を受け取り、指定された時刻に対応する効果を生成する役割を担います。

スクリプトで定義した効果を使えば、アニメーション不可の属性やプロパティだけでなく、 スクリプトでアクセス可能なあらゆるもの、たとえば音声の再生やバイブレーションの生成なども アニメーションさせることができます。

例えば、カスタム効果canvas 要素に描画することで、CSSやSVGで作成するのが難しい パターンを含む複雑なアニメーション効果を実現できます。 スクリプトベースのアニメーションのタイミング制御を 使う場合と比べて、この手法ではアニメーションがフレームレートに依存せず、 一時停止、逆再生、タイミング効果によるイージング、加速、他のアニメーションとの同期、 その他Web Animationsのアニメーションと同様の制御が追加のプログラミングなしに可能となります。

カスタムエフェクトは、オーサー定義のプログラミングコールバックであり、update animations and send events手順の一部としてタイミング情報を受け取る。

タイミングプロパティが更新された時にも必ずコールされるべきか要検討。

3.5.1. カスタムエフェクトのサンプリング

カスタムエフェクトは参照元アニメーション効果ごとに、update animations and send events手順(以後「アップデート」と呼ぶ)実行時に、次の条件を基にコールされる。

  1. 前回アップデート時に、そのアニメーション効果がこのカスタムエフェクトを参照し、

    この場合は、前回の効果ターゲット要素と、未解決iteration progressの2つをパラメータにコールバックする。

  2. 現時点の効果ターゲット要素 について、次いずれか最初の条件でコールバック:

    そのカスタムエフェクト参照先アニメーション効果が in effect でなく、前回はin effectだった場合

    現時点の効果ターゲット要素と、未解決iteration progressでコールする。

    それ以外で、そのアニメーション効果
    • in effectである

    • 直前はin effectでなかった、または同じin effectでもiteration progressかcurrent iterationが異なる

    この場合は、参照しているアニメーション効果の現時点のiteration progress及び効果ターゲット要素をパラメータにコールバックする。

アニメーションツリーの特定地点でアクションを発火したいケースもある。 ほとんどの場合、step-start easingのカスタムエフェクトを区間全体に適用すれば代用できるが、 このためだけに内容側レイアウト要件が重くなる場合もある。

今後検討されうる案:

  • カスタムエフェクト幅0のトリガ用途を想定し、区切り検出時(理論上の精度で前回・今回で対象時間が挟まった場合も)必ずコールする補助条件を設ける

  • カスタムエフェクトに特別な呼び出し条件を加える代わりに、Triggerのような新エフェクト型を導入し、ゼロ幅処理専用―例えば再生方向ごとの専用トリガなど―にする方式。

3.5.2. カスタムエフェクトの実行順序

カスタムエフェクトアニメーション効果と異なり 特定の対象プロパティに限定されないため、その 実行順判定の手順はアニメーション効果と異なる。

カスタムエフェクトは すべてのアニメーション効果が 結果をターゲットに適用し終えた後(「合成結果を適用」参照)に実行される。

より厳密な定義が必要。 スタイルはflushedされているのか?おそらくそうである。 スクリプトベースのアニメーション効果の実行中にリフローを一時停止し、実行後に一度だけリフロー可能か?

カスタムエフェクト同士の 実行順序は、アニメーション効果の [[#the-effect-stack]] で定義された順序と同じ。より前にソートされたものが後のものより先に実行される。

3.6. アニメーショントリガ

3.6.1. 概要

アニメーショントリガは、 時間駆動アニメーションにおいて 関連付けられたアニメーションの再生制御に用いられる。 アニメーション同様、アニメーショントリガタイムライン に関連付けられ、アタッチメント範囲にアタッチされる。

トリガがスクロール駆動アニメーションに影響すべきか?

3.6.2. アニメーショントリガ内部状態

アニメーショントリガ trigger は内部的に真偽値の did trigger フラグ(初期値false)と、 以下の値をとる内部状態stateを持つ:

idle
関連したアニメーション効果animationbefore phaseに留まり、current timeは0となる。
primary
この値に切り替えたとき、animationに対しtypeで定義されたprimary動作タイプが適用される。
inverse
この値に切り替えたとき、animationtypeで定義されたinverse動作タイプが適用される。

stateおよびdid triggerの 値は、後述のアニメーショントリガ状態の更新手順で更新される。

idle状態の仕様に正式な合意が必要か?

3.6.3. アニメーショントリガの振る舞い

アニメーショントリガアニメーショントリガの振る舞いを持ち、 did triggerstateとあわせて 関連アニメーションの再生制御に影響する。

アニメーショントリガに紐付くアニメーション効果idle状態のとき、 常にbefore phaseかつ current timeは0に留まり、 triggerのdid triggerstateの影響を受けない。 それ以外の時、behavior値ごとの再生制御は以下の通り:

once
stateprimaryのとき

関連アニメーションをtriggerする。

それ以外

トリガは何もしない。

repeat
stateprimaryのとき

関連アニメーションをtriggerする。

stateinverseのとき

関連アニメーション効果before phase、 関連アニメーションstart time を0へリセット。

alternate
stateprimaryかつ did triggerがfalseのとき

関連アニメーションをtriggerする。

stateprimaryかつ did triggerがtrueのとき

関連アニメーションをreverse(逆再生)する。

stateinverseのとき

関連アニメーションをreverse(逆再生)する。

state
stateprimaryのとき

関連アニメーションをtrigger/resumeする。

stateinverseのとき

関連アニメーションをpauseする。

primary/inverse各「動作タイプ」のきちんとした定義が必要?

3.6.4. アニメーショントリガのアクティブ区間

アニメーショントリガアクティブ区間 を定義し、かつ1つだけ持つ。この区間はトリガのstateprimary時の タイムライン進行区間である。

3.6.5. アニメーショントリガの範囲

アニメーショントリガは 2つの範囲、すなわち default rangeexit range を持つ。 exit rangedefault rangeを置き換え、 アクティブ区間を拡張するために使われる。

exit rangeの端点はdefault rangeの端点以上に限るべきか?

直近のstatestateによって、 アクティブ区間は次の条件で定まる:

stateprimaryの場合

intervalexit rangeとなる。

それ以外

intervaldefault rangeとなる。

3.6.6. アニメーショントリガの設定

アニメーショントリガの設定手順(animationのトリガをnew triggerに設定)は次の通り:
  1. old triggeranimation の現在のアニメーショントリガ(もしあれば)とする。

  2. もしnew triggerold triggerと同一であれば、この手順を中止。

  3. animationトリガnew triggerにする。

  4. new triggerに対しアニメーショントリガ状態の更新手順を実行。

3.6.7. アニメーショントリガのタイムライン設定

アニメーショントリガのタイムライン設定 手順(trigger のタイムラインを new timeline(null可)に設定)は次の通り:
  1. old timelinetrigger の現在のtimeline(もしあれば)とする。

  2. もしnew timelineold timelineと同一なら、この手順を中止。

  3. trigger.timelinenew timeline に設定。

  4. triggerに対しアニメーショントリガ状態の更新手順を実行。

3.6.8. アニメーショントリガ状態の更新

アニメーショントリガ状態の更新 手順(アニメーショントリガ trigger に対して)は次の通り:
  1. did triggertriggerdid triggerフラグ(現在値)とする。

  2. behaviortrigger に関連付けられたアニメーショントリガの振る舞いとする。

  3. trigger.stateを以下で設定:

    triggerlocal time未解決の場合

    この手順を中止。

    それ以外
    behavioronceかつdid triggerがtrueのとき

    この手順を中止。

    それ以外
    triggerが自身のアクティブ区間内にあるとき
    1. trigger.stateprimaryに設定。

    2. trigger.did triggerをtrueに設定。

    それ以外
    did triggerがtrueの場合

    trigger.stateinverseに設定。

timelineが再びidleになったら"did trigger"フラグをfalseに戻すのが正しい/期待される挙動か?

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

4.1. AnimationTimeline インターフェース

[Exposed=Window]
partial interface AnimationTimeline {
    readonly attribute CSSNumberish? currentTime;
    readonly attribute CSSNumberish? duration;
    Animation play (optional AnimationEffect? effect = null);
};

currentTime 属性の型を更新します。

currentTime, CSSNumberish、readonly、nullable

このタイムラインの現在の時刻を返します。このタイムラインが null の場合は 非アクティブです。値は進捗ベースのタイムラインであれば割合、その他の場合はミリ秒の倍精度値として表現されます。

duration, CSSNumberish、readonly、nullable

このタイムラインのdurationを返します。

テスト
Animation play(optional AnimationEffect? effect = null)

このタイムラインに紐づけられた新しいAnimationオブジェクトを作成し、それが ready になり次第再生を開始します。

effect が指定された場合、そのエフェクトがアニメーションの 関連付けられたエフェクトとして使用されます。

このメソッドのリネームや削除が提案されています (TAGフィードバック参照)。

effect が null の場合の開始動作について定義が必要です。

新しいAnimation オブジェクトは、 Animation() コンストラクタを使って、 この AnimationTimeline オブジェクトを timeline パラメータとして、 effecteffect パラメータとして渡して作成されます。

新しく作成されたAnimation オブジェクトに対しては、auto-rewind フラグを true にしてアニメーションを再生する手順が実行されます。

effect

新しく作成された Animation オブジェクトに割り当てる関連付けられたエフェクト

4.2. Animation インターフェース

Animation インターフェースの startTime および currentTime を更新し、さらに rangeStart、rangeEnd、overallProgress を以下のように追加します:

[Exposed=Window]
partial interface Animation {
    attribute CSSNumberish?       startTime;
    attribute CSSNumberish?       currentTime;
    attribute AnimationTrigger?   trigger;
    attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart;
    attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd;
    readonly attribute double? overallProgress;
};

属性の説明を以下のように追加または更新します:

startTime, CSSNumberish、nullable

説明を以下のように更新:

このアニメーションの開始時刻進捗ベースのタイムラインに関連付けられている場合は、開始時刻はパーセント単位の CSSNumericValue として返さなければなりません。それ以外の場合は、 開始時刻はミリ秒単位の倍精度値として返されます。 この属性に値を設定すると、開始時刻を設定 する手順により新たな値が適用されます。

currentTime, CSSNumberish、nullable

説明を更新:

このアニメーションの現在時刻です。進捗ベースのタイムラインに関連付けられている場合、現在時刻はパーセント単位の CSSNumericValue として返さなければなりません。 それ以外の場合、現在時刻はミリ秒単位の実数値(double値)として返さなければなりません。 この属性を設定する際は、このオブジェクトの現在時刻を新しい値に設定する手順に従います。

以下を追加:

rangeStart, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)

アニメーションアニメーションアタッチメント範囲の開始を指定します。 この属性の設定は KeyframeAnimationOption rangeStartと同じルールに従います。 この属性値の取得時は、TimelineRangeOffset または DOMString "normal" のいずれかが返されます。

rangeEnd, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)

アニメーションアニメーションアタッチメント範囲の終了を指定します。 この属性の設定は KeyframeAnimationOption rangeEndと同じルールに従います。 この属性値の取得時は、TimelineRangeOffset または DOMString "normal" のいずれかが返されます。

overallProgress, double、readonly、nullable

overallProgressを、アニメーションassociated effect endに対する割合で指定します。

trigger, AnimationTrigger、nullable

アニメーションに関連付けられたアニメーショントリガーを指定します。 この属性の設定は KeyframeAnimationOption triggerと同じ規則に従います。

4.3. AnimationEffect インターフェース

[Exposed=Window]
partial interface AnimationEffect {
    // Timing hierarchy
    readonly attribute GroupEffect?     parent;
    readonly attribute AnimationEffect? previousSibling;
    readonly attribute AnimationEffect? nextSibling;

    undefined before (AnimationEffect... effects);
    undefined after (AnimationEffect... effects);
    undefined replace (AnimationEffect... effects);
    undefined remove ();
};
getComputedTiming()

このオブジェクトのduration属性の説明には、 timing.duration が文字列autoの場合、この属性は 本質的な反復期間(intrinsic iteration duration)の現在の算出値を返すことを示す必要があります。その値は、ミリ秒単位または進捗ベースのタイムラインに関連付けられている場合は割合として表現される倍精度値である可能性があります。

parent, GroupEffect、readonly、nullable

この親グループを持つ アニメーションエフェクトか、 親グループがなければ null を返します。

これは parentGroupにすべきでしょうか?

previousSibling, AnimationEffect、readonly、nullable

この前の兄弟となるアニメーションエフェクトのインスタンス。

nextSibling, AnimationEffect、readonly、nullable

この次の兄弟となるアニメーションエフェクトのインスタンス。

undefined before (AnimationEffect... effects)

effects をこのアニメーションエフェクトの直前に挿入します。

  1. 親グループが存在しない場合、手順を中断します。

  2. effects内のいずれかのアニメーションエフェクトがこのアニメーションエフェクト包含祖先である場合、 HierarchyRequestError例外を投げて手順を中断します。

  3. Insert effects を このアニメーションエフェクトの前に挿入します。

この定義は以下の使用法を除外することに注意してください。なぜなら effect 自身が自身の包含祖先であるためです:
effect.before(effect); // throws HierarchyRequestError
undefined after(AnimationEffect... effects)

effects をこのアニメーションエフェクトの直後に挿入します。

  1. 親グループが存在しない場合、手順を中断します。

  2. effects内のいずれかのアニメーションエフェクトがこのアニメーションエフェクト包含祖先である場合、 HierarchyRequestError例外を投げて手順を中断します。

  3. reference childeffectsに含まれないこのアニメーションエフェクトの次の兄弟とします。

  4. Insert effectsreference child の前に挿入します。

undefined replace(AnimationEffect... effects)

このAnimationEffect を、引数の effects に置き換えます。

  1. 親グループが存在しない場合、手順を中断します。

  2. effects内のいずれかのアニメーションエフェクトが、 親グループの包含祖先である場合 HierarchyRequestError例外を投げて手順を中断します。

  3. reference childeffectsに含まれないこのアニメーションエフェクトの次の兄弟とします。

  4. この アニメーションエフェクトを、その親グループから削除します。

  5. Insert effectsreference child の前に挿入します。

undefined remove()

このアニメーションエフェクトを 親グループまたはアニメーションから削除します。

remove() メソッドはエフェクトを親グループまたはアニメーションから削除できます。これをレベル1に残し、単に“アニメーションから削除する”として定義するべきでしょうか?

4.4. EffectTiming および OptionalEffectTiming 辞書

partial dictionary EffectTiming {
    double delay;
    double endDelay;
    double playbackRate = 1.0;
    (unrestricted double or CSSNumericValue or DOMString) duration = "auto";
};

partial dictionary OptionalEffectTiming {
    double playbackRate;
};

注: 本仕様のこのバージョンでは、duration は CSSNumericValue として設定することはできません。しかし、getComputedTiming() で duration を解決する際に CSSNumericValue として返される場合があります。 将来バージョンの仕様では、duration を有効な時間単位またはパーセント単位の CSSNumeric 値として 設定できるようになる可能性があります。

delay, double

説明を以下のように更新:

指定開始遅延は、アニメーションエフェクト開始時刻からアクティブ区間の始まりまでのミリ秒数を表します。 指定開始遅延指定タイミングの正規化手続きに従って 開始遅延 に変換されます。

endDelay, double

説明を以下のように更新:

指定終了遅延は、 アニメーションエフェクトアクティブ区間の終了から、 例えばシーケンスエフェクト内の 後続の アニメーションエフェクト開始時刻までのミリ秒数を表します。 指定終了遅延 は、終了遅延指定タイミングの正規化手続きで変換されます。

duration, (unrestricted double or CSSNumericValue or DOMString)、デフォルト値 "auto"

説明を以下のように更新:

指定反復期間とは、ゼロ以上(正の無限大を含む)の実数で、 アニメーションエフェクトの1反復を完了するまでのミリ秒数、 または文字列 auto で、 アニメーションエフェクトの反復期間本質的反復期間を反映することを示します。 指定反復期間指定タイミングの正規化手続きにより、 反復期間に変換されます。

playbackRate, double、デフォルト値 1.0

アニメーションエフェクト再生速度(playback rate)プロパティであり、 ローカル時刻に乗算され、効果が元の速度とは異なる率で再生される場合があります。

4.5. AnimationEffect のタイミングを更新する

以下を置き換え:

input存在する各メンバーを、以下の対応関係に従って effect のタイミングプロパティに代入:

次の内容に:

input存在する各メンバーを、以下の対応関係に従って effect のタイミングプロパティに代入:

以下を追加:

指定タイミングの正規化手順に従うこと。

タイミングプロパティはスタイル変更によっても更新される場合があります。タイミングに影響を与える CSS アニメーションプロパティが変更された場合は 指定タイミングの正規化手順の再実行が必要です。

4.6. ComputedEffectTiming 辞書

partial dictionary ComputedEffectTiming {
    CSSNumberish         startTime;
    CSSNumberish         endTime;
    CSSNumberish         activeDuration;
    CSSNumberish?        localTime;
};
startTime, CSSNumberish

この開始時刻は、 アニメーションエフェクト進捗ベースのタイムラインに関連付けられていればパーセント、 それ以外はミリ秒(double型)で表現されます。

この時刻は、親グループ(もし存在する場合)がこの子を 変換後の時空間でスケジューリングしたタイミングであり、 すなわち継承時空間でのアニメーションエフェクトの時刻です。

アクティブ区間の開始は 開始時刻開始遅延 の合計に基づきます。

endTime, CSSNumberish

説明を以下のように更新:

終了時刻アニメーションエフェクト継承時空間での値です。 値は、進捗ベースのタイムラインに関連付けられていればパーセント、 それ以外はミリ秒(double 型)として表されます。 これは、アニメーションエフェクトのアクティブ区間終了 + 終了遅延に対応します。

activeDuration, CSSNumberish

説明を以下のように更新:

このアクティブ期間アニメーションエフェクト進捗ベースのタイムラインに関連付けられている場合パーセント、 そうでなければミリ秒(double 型)で表されます。

localTime, CSSNumberish、nullable

第2段落の説明を以下のように更新:

この値は、アニメーションエフェクトアニメーションに関連付けられていない 、または 親グループin effect 状態でない場合は null となります。

以下を追加:

値は 進捗ベースのタイムラインに関連付けられていればパーセント、 それ以外はミリ秒の double 値で表現されます。

4.6.1. FillMode 列挙型

enum FillMode { "none", "forwards", "backwards", "both", "auto" };
auto

説明を以下のように更新:

GroupEffect に適用される場合は前後両方向のフィル、 KeyframeEffect に適用される場合はフィルなしとなります。

4.7. GroupEffect インターフェース

(本節は追加されました。)

グループエフェクトGroupEffect インターフェースで表現されます。

[Exposed=Window]
interface GroupEffect {
  constructor(sequence<AnimationEffect>? children,
              optional (unrestricted double or EffectTiming) timing = {});

  readonly attribute AnimationNodeList  children;
  readonly attribute AnimationEffect?   firstChild;
  readonly attribute AnimationEffect?   lastChild;
  GroupEffect clone ();

  undefined prepend (AnimationEffect... effects);
  undefined append (AnimationEffect... effects);
};
GroupEffect ()

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

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

  2. timing input を、 timingタイミング引数を処理する手順を適用した結果とする。

  3. 次の条件分岐で最初にマッチする場合に従い、timing input を設定する。

    もしoptionsEffectTiming オブジェクトなら、

    timing inputoptions にする。

    そうでない場合(optionsdouble の場合)、

    timing input を、 すべてのメンバーがデフォルト値でduration だけ options に設定された EffectTiming オブジェクトにする。

  4. group の アニメーションエフェクトのタイミングプロパティを timing input から 更新する手順を呼び出す。

    この手順で例外が投げられた場合、例外を伝播して本手続きを中断する。

  5. childrennull の前に挿入 する。

children

このグループの子として追加するアニメーションエフェクトのシーケンス。

これらの子は、append() メソッドと同じセマンティクスで順番に追加されます。 GroupEffect インターフェース。

timing

新しいグループエフェクトのタイミングプロパティまたは反復期間

children, AnimationNodeList、readonly

グループの子エフェクトのリスト。

firstChild, AnimationEffect、readonly、nullable

このグループエフェクト最初の子

lastChild, AnimationEffect、readonly、nullable

このグループエフェクト最後の子

undefined prepend (AnimationEffect... effects)
  1. もしeffectsの中のいずれかのアニメーションエフェクトがこのアニメーションエフェクト包括祖先である場合、 HierarchyRequestError例外を投げ、この手順を中止する。

  2. effects最初の子の前に挿入する。

undefined append (AnimationEffect... effects)
  1. もしeffects中のいずれかのアニメーションエフェクトが、このアニメーションエフェクト包括祖先である場合、 HierarchyRequestError例外を投げ、この手順を中止する。

  2. effectsnull の前に挿入する。

GroupEffect clone ()

以下の手順でこのGroupEffect オブジェクトのディープコピーを作成します。

  1. sourceをこのGroupEffect オブジェクト(複製元)とする。

  2. cloned timingEffectTiming オブジェクトとして生成し、そのメンバーには source.getTiming() 上の同名属性の値を設定する。

  3. cloned children を空の AnimationEffect オブジェクトのシーケンスとする。

  4. source.children 内の各 child について、 child.clone() を呼び出した結果を cloned children に追加する。

  5. GroupEffect(cloned children, cloned timing) を引数に コンストラクタ GroupEffect() を呼び出して、新しい GroupEffect オブジェクトを返す。

4.7.1. timing 引数の処理

GroupEffect()SequenceEffect() のコンストラクタに渡されるtimingパラメータは、EffectTiming オブジェクト、アニメーションエフェクトのミリ秒単位のdurationを示すdouble値、または undefined である場合があります。

次の「タイミング引数を処理する」 手順は、上述の入力値を正規化し、EffectTiming オブジェクトに変換します。

もしtimingEffectTiming オブジェクトなら、

timing を返す。

もしtimingdouble なら、

すべてのメンバーがデフォルト値で duration だけ timing に設定した新しい EffectTiming オブジェクトを返す。

それ以外(timingが undefined)なら、

すべてのメンバーがデフォルト値の新しい EffectTiming オブジェクトを返す。

4.7.2. 階層操作の定義

effect の「含まれない次の兄弟」 は、ある アニメーションエフェクト セット effects において、次の手順で決定されます:

  1. context effecteffect とする。

  2. context effect次の兄弟null でない間、以下の手順を繰り返す:

    1. context effect次の兄弟に更新。

    2. もし context effecteffects に含まれていなければ、 context effect を返して手順を終了。

  3. null を返す。

アニメーションエフェクトを削除する には、effect をその親グループまたは アニメーションから取り除くため、下記条件で最初に該当した手順を実行します:

もしeffect親グループを持つなら

effect親グループ子エフェクトリストから除去する。

もしeffectアニメーションに直接関連付けられているなら

effectアニメーションの関連付けから外す。

複数のアニメーションエフェクト effectsparent子エフェクトリストの reference childの前に挿入するには、各effectについて次の手順を行う:

  1. 親からeffectを削除する。

  2. effectparent子エフェクトリストのreference childの前に挿入する。

4.8. AnimationNodeList インターフェース

アニメーションエフェクトのリストは AnimationNodeList で表現できます。

AnimationNodeList インターフェースは 0 ≤ index < length の範囲のインデックス付きプロパティに対応しています。

このインターフェースが存在する唯一の理由は、DOMインターフェースで child nodes に children メンバー経由でアクセスできることに慣れている作者に親しみやすい体験を提供するためです。

[Exposed=Window]
interface AnimationNodeList {
    readonly attribute unsigned long length;
    getter AnimationEffect? item (unsigned long index);
};
length, unsigned long, readonly

このリストに含まれるアニメーションエフェクトの数です。

getter AnimationEffect? item(unsigned long index)

index位置のアニメーションエフェクトを返します。 indexlength以上ならnullを返します。

4.9. SequenceEffect インターフェース

シーケンスエフェクトSequenceEffect インターフェースで表されます。

[Exposed=Window]
interface SequenceEffect : GroupEffect {
  constructor(sequence<AnimationEffect>? children,
              optional (unrestricted double or EffectTiming) timing = {});

  SequenceEffect clone ();
};
constructor (sequence<AnimationEffect>? children, optional (unrestricted double or EffectTiming) timing)

このコンストラクタの各パラメータの意味および扱いは、 GroupEffect() コンストラクタと同一です。

SequenceEffect clone ()

このSequenceEffect オブジェクトのディープコピーを作成します。 ただし、GroupEffect インターフェースの clone() メソッドの手順と同じですが、新しい SequenceEffect オブジェクトを作成します。

4.10. KeyframeEffect インターフェース

KeyframeEffect インターフェースは以下を追加して修正されます:

partial interface KeyframeEffect {
    attribute IterationCompositeOperation    iterationComposite;
};
KeyframeEffect (target, keyframes, options)

KeyframeEffect オブジェクトを作成する手順のステップ5を以下のように変更:

  1. optionsKeyframeEffectOptions オブジェクトであれば、 iterationCompositecomposite プロパティを effectoptionsの対応する値として代入する。

    これらのプロパティを代入する際は、 KeyframeEffect インターフェースの対応する setter に定義されているエラーハンドリングを適用する。 setter のいずれかが options の値について例外を投げる必要がある場合は、 同じ例外を投げ、それ以上のステップを中止すること。

KeyframeEffect (source)

KeyframeEffect オブジェクトをsource と同じプロパティで作成する手順に source から effect への iteration composite operation の設定を含める。

iterationComposite, IterationCompositeOperation

このiteration composite operationプロパティは、 キーフレームエフェクトに対して、 IterationCompositeOperation 列挙値のいずれかで指定されます。

設定時にはこのiteration composite operationプロパティが このアニメーションエフェクト に指定された値で設定されます。

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

この節は規範的でありません

次の文を置き換え:

duration が指定されていなければ、値は 0 となる。

次の内容に:

duration が指定されていなければ、 intrinsic iteration duration が使用されます。

以下を追加:

これは他のアニメーションエフェクトと組み合わせる場合に特に有用です。例えば、要素のフェードアウト後に visibility を 'hidden' にする場合、次のように記述できます:

new SequenceEffect(
  [
    new KeyframeEffect(elem, { opacity: 0 }, 1000),
    new KeyframeEffect(elem, { visibility: 'hidden' }, { fill: 'forwards' })
  ]
);

4.10.2. *Keyframe 辞書の型修正

ComputedKeyframeBaseComputedKeyframeBaseKeyframeBasePropertyIndexedKeyframe などの offset キーの double? 型は (CSSNumberish? or TimelineRangeOffset or DOMString) に置き換えられます。 double は引き続きパーセントとして解釈され、 DOMString<keyframe-selector> 構文で TimelineRangeOffset にパースされます。得られたTimelineRangeOffset または CSSNumericValue@keyframes の定義に従って解釈されます。

DOMString の値が有効な <keyframe-selector> としてパースできなかった場合、そのキーフレームは無効になり、 [[web-animations-1#processing-a-keyframes-argument|処理される]]際に TypeError を投げます (double 値が [0,1] 範囲外の場合と同じです)。

4.10.3. KeyframeEffectOptions 辞書

KeyframeEffectOptions 辞書インターフェースに次のメンバーを追加します:

partial dictionary KeyframeEffectOptions {
    IterationCompositeOperation iterationComposite = "replace";
};
iterationComposite, IterationCompositeOperation、デフォルトは"replace"

iteration composite operation であり、 アニメーションの値が反復ごとにどう累積するかを定義します。

4.11. IterationCompositeOperation 列挙型

アニメーションエフェクトiteration composite operationの可能な値は、 IterationCompositeOperation列挙型で表されます。

enum IterationCompositeOperation { "replace", "accumulate" };
replace

replace 反復合成演算値に対応し、生成される効果値現在の反復に依存しないことを意味します。

accumulate

accumulate iteration composite operation値に対応し、 2回目以降のアニメーションエフェクトの反復時は 前回の最終値に積み上げていきます。

4.12. EffectCallback コールバック関数

カスタムエフェクトは、 EffectCallback コールバック関数をスクリプトで提供することで定義できます。

callback EffectCallback = undefined (double? progress,
                                (Element or CSSPseudoElement) currentTarget,
                                Animation animation);

EffectCallback は、それと紐付けられたKeyframeEffectオブジェクトが更新されるたびに呼び出されます。

double? progress

iteration progress(反復進捗)値。 これがnullの場合、そのエフェクトは削除すべきです。

(Element or CSSPseudoElement) currentTarget

このコールバックが動作すべき ターゲット要素

currentTargetanimation.target と異なる場合があります。

animationターゲット要素 が更新間に変化した場合、このメソッドは一度 progress を null、かつ従来の ターゲット要素 で呼ばれ、その後新しい ターゲット要素 と現在の progress で再び呼び出されます。これによって、旧 ターゲット要素 からエフェクトを削除できます。

Animation animation

更新対象となっている Animation オブジェクトを示します。

4.13. Animatable インターフェース

sequence<Animation> getAnimations(options)

以下を追加:

このオブジェクトが2つ以上のターゲット要素で 同じアニメーションエフェクトを持っていた場合でも、 同じAnimation オブジェクトは返却されるリスト内で一度だけ現れます。

4.14. Animatable インターフェース mixin

Animatable mixinインターフェースに以下のメンバーを追加します:

Animation animate(keyframes, options)

手順のステップ6を次のように修正します:

  1. optionsKeyframeAnimationOptions オブジェクトの場合は、triggeroptionstriggerメンバー、存在しなければ空の AnimationTriggerOptions 辞書で新たに生成したAnimationTriggerとします。

  2. auto-rewindフラグをtrueにして、animationについて アニメーションのtrigger設定手順を実行します。

KeyframeAnimationOptions 辞書インターフェースに以下のメンバーを追加します:

dictionary TimelineRangeOffset {
  CSSOMString? rangeName;
  CSSNumericValue offset;
};

partial dictionary KeyframeAnimationOptions {
    (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal";
    (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal";
    AnimationTrigger? trigger;
};
rangeStart, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルトは"normal"

指定されていて値が "normal" でない場合アニメーションanimation attachment rangeの開始位置を指定します。 DOMString の値はanimation-range-end値としてパースされ TimelineRangeOffsetrangeNameoffset になるか、もしくはCSSKeywordValuevalue が"normal"であるものになります。 CSSNumericValue は、そのoffset を持ちrangeName はnullのTimelineRangeOffset として解釈されます。

rangeEnd, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルトは"normal"

指定されていて値が"normal"でない場合アニメーションanimation attachment rangeの終了位置を指定します。 DOMString の値はanimation-range-end値としてパースされ TimelineRangeOffsetrangeNameoffset になるか、 CSSNumericValue ならTimelineRangeOffsetoffsetと nullのrangeName で解釈されます。

trigger, AnimationTrigger、nullable

指定があれば、アニメーションに関連づくアニメーショントリガーsetting a trigger of an animation 手順に従って設定します。

CSSKeywordValuevalueが "normal"以外の場合に rangeStartrangeEnd に渡すと、どのAPIであっても KeyframeAnimationOptions 型で受け取った場合、TypeError例外を投げます。

注: rangeNameoffset の値は rangeStartrangeEnd でもanimation-range-start/ animation-range-end として解釈され、アニメーションに影響します。

詳しくは [[web-animations-1#the-animatable-interface-mixin]] をご覧ください。

4.15. AnimationPlaybackEvent インターフェース

currentTimeおよびtimelineTimeの型をdoubleからCSSNumberishにしてください。

[Exposed=Window]
interface AnimationPlaybackEvent : Event {
    constructor(DOMString type, optional AnimationPlaybackEventInit
    eventInitDict = {});
    readonly attribute CSSNumberish? currentTime;
    readonly attribute CSSNumberish? timelineTime;
};
dictionary AnimationPlaybackEventInit : EventInit {
    CSSNumberish? currentTime = null;
    CSSNumberish? timelineTime = null;
};

AnimationPlaybackEvent属性の型を更新します。

currentTime, CSSNumberish、readonly, nullable

イベントをキューした時刻のアニメーションの現在時刻。 イベント生成時にアニメーションidle状態であった場合はnull

timelineTime, CSSNumberish、readonly, nullable

イベントをキューした時点でイベントを生成したアニメーションが関連付けられていたタイムライン時刻値。 キュー時にアニメーションアクティブなタイムラインに関連していない場合はnull

AnimationPlaybackEventInitメンバーの型を更新します。

currentTime, CSSNumberish、nullable、デフォルト:null

currentTime 属性の説明を参照。

timelineTime, CSSNumberish、nullable、デフォルト:null

timelineTime 属性の説明を参照。

4.16. AnimationTrigger インターフェース

[Exposed=Window]
interface AnimationTrigger {
  constructor(optional AnimationTriggerOptions options = {});
  attribute AnimationTimeline timeline;
  attribute AnimationTriggerBehavior behavior;
  attribute any rangeStart;
  attribute any rangeEnd;
  attribute any exitRangeStart;
  attribute any exitRangeEnd;
};
テスト
AnimationTrigger(options)

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

  1. 新しいAnimationTrigger オブジェクトtriggerを作成。

  2. trigger.did triggerをfalseにする。

  3. trigger.stateidleに設定。

  4. trigger.behavioroptions.behaviorに設定。

  5. KeyframeAnimationOptionのrangeStartrangeEnd と同じルールに従いoptions.rangeStart および options.rangeEndを使って default rangeを設定。

  6. 同上のルールでdefault rangeに従い、 options.exitRangeStart および options.exitRangeEndexit rangeを設定。 ただし、"auto"の場合はdefault rangeのそれぞれの側になる。

  7. options.timelinenew timelineとしてtriggerアニメーショントリガーのタイムライン設定 手順を実行。

options

新たに作成されるトリガの設定用パラメータ。

timeline, AnimationTimeline

このトリガ用のタイムラインを返します。 タイムラインが非アクティブの場合は `null` です。

behavior, AnimationTriggerBehavior

このトリガのbehaviorを返します。

rangeStart, any

このトリガにおけるdefault rangeの開始を返します。

rangeEnd, any

このトリガにおけるdefault rangeの終了を返します。

exitRangeStart, any

このトリガにおけるexit rangeの開始を返します。

exitRangeEnd, any

このトリガにおけるexit rangeの終了を返します。

4.17. AnimationTriggerOptions 辞書

dictionary AnimationTriggerOptions {
  AnimationTimeline? timeline;
  AnimationTriggerBehavior? behavior = "once";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) exitRangeStart = "auto";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) exitRangeEnd = "auto";
};
timeline, AnimationTimeline、nullable

トリガが関連付けられるタイムライン。 未指定の場合デフォルトのドキュメントタイムラインに関連付けられます。

behavior, AnimationTriggerBehavior、nullable、デフォルト"once"

トリガの動作設定。 未指定ならトリガの動作はonceとなります。

rangeStart, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルト"normal"

トリガのdefault rangeの開始点です。 未指定ならdefault rangeの開始は"normal"です。

rangeEnd, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルト"normal"

トリガのdefault rangeの終了点です。 未指定ならdefault rangeの終了は"normal"です。

exitRangeStart, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルト"auto"

トリガのexit rangeの開始点です。 未指定ならexit rangeの開始は"auto"です。

exitRangeEnd, (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)、デフォルト"auto"

トリガのexit rangeの終了点です。 未指定ならexit rangeの終了は"auto"です。

4.18. AnimationTriggerBehavior 列挙型

enum AnimationTriggerBehavior { "once", "repeat", "alternate", "state" };
once

once:一度だけ実行する挙動。

repeat

repeat:繰り返し実行する挙動。

alternate

alternate:交互に切り替わる挙動。

state

state:状態による挙動。

4.19. モデルのライブ性

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

「Web Animationsモデルへの変更は即座に効果を持つ」セクションに関して、次を追加:

同じ概念は、GroupEffect の 子要素の追加や削除のような、Web Animationsモデルのより複雑な変更にも適用されます。

追加:

プログラミングインターフェイスを使用してモデルに加えられた変更は、 決して EffectCallback 関数が 呼び出される原因にはなりません。

例えば、以下のコードでは、スクリプトブロックが通常の更新中に完了したでコールバック関数が呼び出されます。

var timesCalled = 0;
elem.animate(function() {
  timesCalled++;
}, 10000);
alert(timesCalled); // ‘0’が表示される

注意: この仕様はどこかで正式に定義する必要があります。

5. 変更点

5.1. レベル1以降の変更点

本仕様では、前のレベルの仕様と比べて次の変更を導入しています:

このモジュールには [[#custom-effects]] に関するいくつかの実験的提案も含まれていますが、この機能の設計には懸念点があり、今後改訂の際に変更される可能性があります。 詳細は 議論 を参照してください。

5.2. 2023年2月21日の最初の公開作業草案以降の変更点

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

このモジュールに関して、プライバシーに関する報告はありません。

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

このモジュールに関して、セキュリティに関する報告はありません。

適合性

文書の慣例

適合性要件は、記述的主張と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が非適合となるわけではありません(例:モノクロモニターで色を表示する必要はありません)。

オーサリングツールは、汎用CSS文法および本モジュールで定義されている各機能の個別文法に従い文法的に正しいスタイルシートを出力し、また本モジュールで記述される他のすべてのスタイルシート適合要件を満たしていれば、本仕様に適合します。

部分的な実装

著者がフォワードコンパティブルなパース規則を活用しフォールバック値を指定できるようにするため、CSSレンダラーはサポートされていない at-規則、プロパティ、プロパティ値、キーワード、およびその他の構文要素を無効(適切に無視)として扱う必要があります。特に、ユーザーエージェントは、1つのマルチバリュープロパティ宣言のうちサポートされていない値部分だけを選択的に無視し、サポートされている値を適用してはなりません。いずれかの値が無効であれば(サポートされていない値は無効と見なされる)、CSSでは宣言全体が無視されなければなりません。

不安定・独自拡張機能の実装

将来の安定版CSS機能との競合を避けるため、CSS WG は、将来への備えのベストプラクティス に従って、不安定 機能や 独自拡張を実装することを推奨します。

実験的でない実装

仕様が Candidate Recommendation(CR)段階に達すると、実験的でない実装が可能となり、実装者は仕様どおりに正しく実装できたCRレベルの機能について、プレフィックスなしの実装をリリースする必要があります。

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

テストケースや実装レポートの提出に関する詳細は、CSS ワーキンググループのWebサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストへお問合せください。

索引

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

参照によって定義される用語

参考文献

規範的な参考文献

[CSS-ANIMATIONS-1]
David Baron 他. CSS Animations Level 1.2023年3月2日.WD.URL: https://www.w3.org/TR/css-animations-1/
[CSS-DISPLAY-4]
Elika Etemad;Tab Atkins Jr..CSS Display Module Level 4.2025年11月6日.WD.URL: https://www.w3.org/TR/css-display-4/
[CSS-EASING-1]
Brian Birtles;Dean Jackson;Matt Rakow.CSS Easing Functions Level 1.2023年2月13日.CRD.URL: https://www.w3.org/TR/css-easing-1/
[CSS-EASING-2]
CSS Easing Functions Level 2.2024年8月29日. FPWD.URL: https://www.w3.org/TR/css-easing-2/
[CSS-PSEUDO-4]
Elika Etemad;Alan Stearns.CSS Pseudo-Elements Module Level 4.2025年6月27日.WD.URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-TYPED-OM-1]
Tab Atkins Jr.;François Remy.CSS Typed OM Level 1.2024年3月21日.WD.URL: https://www.w3.org/TR/css-typed-om-1/
[CSS-VALUES-4]
Tab Atkins Jr.;Elika Etemad.CSS Values and Units Module Level 4.2024年3月12日.WD.URL: https://www.w3.org/TR/css-values-4/
[CSSOM-1]
Daniel Glazman;Emilio Cobos Álvarez.CSS Object Model (CSSOM).2021年8月26日.WD.URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren.DOM Standard.Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren 他.HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola.Infra Standard.Living Standard.URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner.Key words for use in RFCs to Indicate Requirement Levels.1997年3月.Best Current Practice.URL: https://datatracker.ietf.org/doc/html/rfc2119
[SCROLL-ANIMATIONS-1]
Brian Birtles 他.Scroll-driven Animations.2023年6月6日.WD.URL: https://www.w3.org/TR/scroll-animations-1/
[WEB-ANIMATIONS-1]
Brian Birtles 他.Web Animations.2023年6月5日.WD.URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen;Timothy Gu.Web IDL Standard.Living Standard.URL: https://webidl.spec.whatwg.org/

IDL 索引

[Exposed=Window]
partial interface AnimationTimeline {
    readonly attribute CSSNumberish? currentTime;
    readonly attribute CSSNumberish? duration;
    Animation play (optional AnimationEffect? effect = null);
};

[Exposed=Window]
partial interface Animation {
    attribute CSSNumberish?       startTime;
    attribute CSSNumberish?       currentTime;
    attribute AnimationTrigger?   trigger;
    attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart;
    attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd;
    readonly attribute double? overallProgress;
};

[Exposed=Window]
partial interface AnimationEffect {
    // Timing hierarchy
    readonly attribute GroupEffect?     parent;
    readonly attribute AnimationEffect? previousSibling;
    readonly attribute AnimationEffect? nextSibling;

    undefined before (AnimationEffect... effects);
    undefined after (AnimationEffect... effects);
    undefined replace (AnimationEffect... effects);
    undefined remove ();
};

partial dictionary EffectTiming {
    double delay;
    double endDelay;
    double playbackRate = 1.0;
    (unrestricted double or CSSNumericValue or DOMString) duration = "auto";
};

partial dictionary OptionalEffectTiming {
    double playbackRate;
};

partial dictionary ComputedEffectTiming {
    CSSNumberish         startTime;
    CSSNumberish         endTime;
    CSSNumberish         activeDuration;
    CSSNumberish?        localTime;
};

enum FillMode { "none", "forwards", "backwards", "both", "auto" };

[Exposed=Window]
interface GroupEffect {
  constructor(sequence<AnimationEffect>? children,
              optional (unrestricted double or EffectTiming) timing = {});

  readonly attribute AnimationNodeList  children;
  readonly attribute AnimationEffect?   firstChild;
  readonly attribute AnimationEffect?   lastChild;
  GroupEffect clone ();

  undefined prepend (AnimationEffect... effects);
  undefined append (AnimationEffect... effects);
};

[Exposed=Window]
interface AnimationNodeList {
    readonly attribute unsigned long length;
    getter AnimationEffect? item (unsigned long index);
};

[Exposed=Window]
interface SequenceEffect : GroupEffect {
  constructor(sequence<AnimationEffect>? children,
              optional (unrestricted double or EffectTiming) timing = {});

  SequenceEffect clone ();
};

partial interface KeyframeEffect {
    attribute IterationCompositeOperation    iterationComposite;
};

partial dictionary KeyframeEffectOptions {
    IterationCompositeOperation iterationComposite = "replace";
};

enum IterationCompositeOperation { "replace", "accumulate" };

callback EffectCallback = undefined (double? progress,
                                (Element or CSSPseudoElement) currentTarget,
                                Animation animation);

dictionary TimelineRangeOffset {
  CSSOMString? rangeName;
  CSSNumericValue offset;
};

partial dictionary KeyframeAnimationOptions {
    (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal";
    (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal";
    AnimationTrigger? trigger;
};

[Exposed=Window]
interface AnimationPlaybackEvent : Event {
    constructor(DOMString type, optional AnimationPlaybackEventInit
    eventInitDict = {});
    readonly attribute CSSNumberish? currentTime;
    readonly attribute CSSNumberish? timelineTime;
};
dictionary AnimationPlaybackEventInit : EventInit {
    CSSNumberish? currentTime = null;
    CSSNumberish? timelineTime = null;
};

[Exposed=Window]
interface AnimationTrigger {
  constructor(optional AnimationTriggerOptions options = {});
  attribute AnimationTimeline timeline;
  attribute AnimationTriggerBehavior behavior;
  attribute any rangeStart;
  attribute any rangeEnd;
  attribute any exitRangeStart;
  attribute any exitRangeEnd;
};

dictionary AnimationTriggerOptions {
  AnimationTimeline? timeline;
  AnimationTriggerBehavior? behavior = "once";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) exitRangeStart = "auto";
  (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) exitRangeEnd = "auto";
};

enum AnimationTriggerBehavior { "once", "repeat", "alternate", "state" };

課題索引

これは正しくありません。old effect が同じタスク内の別のアニメーションにアタッチされている場合、unresolved の状態で追加のコールバックを行うべきではないでしょう。

カスタムエフェクトが呼び出されるタイミングの定義について、見直しとおそらく再記述が必要です。

アニメーションを再生する手順には、カスタムエフェクトの更新用のタスクのスケジューリングが含まれる必要があります。
カスタムエフェクトの呼び出し手順は再設計が必要です。 現状では、まとめられる変更に対しても呼び出し回数が多すぎる可能性があります。
この手順は、アニメーションが一時停止中で animation の current time が明示的に設定された場合、必ずしも正しくありません。これは timeline の current time と animation の current time の間にリードまたはラグを導入することがあります。
この手順はおそらく簡略化でき、再生速度や開始時刻にかかわらずスクロールの境界かどうかのみ判定する形にできるでしょう。この防ごうとしている予期しない挙動は、アニメーションがちょうどスクロール制限で非アクティブになってしまうことなので、ScrollTimeline の場合 fill-mode を設定する必要がなくなります。タイムライン current time が 0 または timeline duration であることを確認すれば十分かもしれません。
現状、タイミング関数が[0, 1]の範囲外の値を生成した場合、group effect に適用されると予期せぬ挙動になります。子要素がイテレーションを増やしたり fill mode へ入ったりして、直接タイミング関数が適用された場合とは異なる動作となります。

これを修正するには、アクティブ時間の範囲を超える time value に対しても fill せず外挿する“overflow” fill modeを導入する可能性があります。

詳細は 2013年東京F2F議事録セクション15(Overflowing fill)を参照。

現在、タイミング関数のセットは group effect で制限されていません。 これにより、実装や fill mode の挙動の複雑化が懸念されています。 そのため group effect で全ての timing function を許可するのはリスクありと考えられています。

代替案として、group effect のタイミング関数を linear timing function もしくは挙動に問題のない「シンプル」な関数のみに限定する案があります。

詳しくは 2013年8月議論セクション2を参照。

アニメーションエフェクトをソートする際に使われている「animation effect に関連するアニメーション」の定義は、group effect も正しく扱えるように本仕様の アニメーションに関連付けられている定義を使う形に見直す必要があります。
この機能全体の再検討が必要です。現時点での考え方としては、カスタムエフェクトを持つよりも、各animation effectonupdate コールバックを持たせる方が良いというものです。これにより、例えば既存のエフェクトにログ記録や特定タイミングで追加処理を加えたい場合、現在のように親グループを追加しなくても実現できます。
タイミングプロパティが更新された場合にも呼び出される必要がありますよね?
アニメーションツリー内の特定のポイントでアクションを発火する必要があるユースケースも考えられます。 多くの場合、アクション実行期間をカバーする step-start easing のカスタムエフェクトを挿入することで実現できます。 しかし、これにはコンテンツに追加のレイアウト要件が課され、対応が煩雑になる場合があります。

現在検討中の代替案:

これをより厳密に定義する必要があります。 スタイルはフラッシュされますか? 通常はされるはずです。 スクリプトベースのアニメーションエフェクト実行中はリフローを一時停止して、処理後一度だけ行うことは可能でしょうか?
トリガーがスクロール駆動アニメーションに影響を与えるべきかどうか?
idle 状態の仕様に正式な結論が必要でしょうか?
「behavior types primary/inverse」を正確に定義する必要がありますか?
exit range の端点がデフォルト range の端点以上のみ許可する仕様とすべきでしょうか?
timeline が再び idle になった場合、"did trigger" フラグが false にリセットされるのが正しい(期待される)挙動でしょうか?
このメソッドは名称変更または廃止を検討すべきとの提案があります (TAGのフィードバック参照)。
effect が null の場合の開始時挙動を定義する必要があります。
これは parentGroup が正しいのでは?
remove() メソッドは親グループまたはアニメーションどちらからもエフェクトを除去できます。レベル1ではアニメーションから animation を除去するという単純な定義にすべきでしょうか?