CSSアニメーション レベル1

W3C作業草案,

本資料の詳細情報
このバージョン:
https://www.w3.org/TR/2023/WD-css-animations-1-20230302/
最新公開バージョン:
https://www.w3.org/TR/css-animations-1/
編集者草案:
https://drafts.csswg.org/css-animations/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-animations-1
テストスイート:
http://test.csswg.org/suites/css-animations-1_dev/nightly-unstable/
フィードバック:
CSSWG課題リポジトリ
仕様内インライン
編集者:
(Apple Inc.)
L. David Baron (Google)
Tab Atkins Jr. (Google)
(招待専門家)
前編集者:
David Hyatt (Apple Inc.)
Chris Marrin (Apple Inc.)
(Adobe)
この仕様への編集提案:
GitHub 編集者
課題リスト:
https://github.com/w3c/csswg-drafts/labels/css-animations-1

概要

このCSSモジュールは、著者がキーフレームを用いてCSSプロパティの値を時間の経過とともにアニメーションする方法を記述します。これらのキーフレームアニメーションの挙動は、継続時間、繰り返し回数、および繰り返しの動作を指定することで制御できます。

CSSは、構造化文書(HTMLやXMLなど)の表示方法を画面や紙などで記述するための言語です。

この文書のステータス

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

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

この文書は草案であり、今後更新・置換・廃止される可能性があります。 この文書を進行中の作業以外として引用することは不適切です。

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

この文書は2021年11月2日W3Cプロセス文書に準拠しています。

この文書は、W3C特許ポリシーの下で活動するグループによって作成されました。 W3Cはグループ成果物に関連して提出された特許開示の一覧を公開しています。 そのページには特許開示の方法も記載されています。 実際に特許を知っている個人で、その特許が必須請求項を含むと考える場合は、W3C特許ポリシー第6節に従い情報を開示する必要があります。

1. はじめに

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

CSSトランジション [CSS3-TRANSITIONS] は、基礎となるプロパティの変化によってCSSプロパティ値が変化した際に、値を補間する方法を提供します。これにより簡単なアニメーションが容易に行えますが、アニメーションの開始状態と終了状態は既存のプロパティ値によって制御され、トランジションではアニメーションの進行方法について著者がほとんど制御できません。

この提案では、著者がCSSプロパティの時間的変化をキーフレームの集合として指定できる、定義済みアニメーションを導入します。アニメーションはトランジションと同様に、CSSプロパティの提示値を時間の経過とともに変化させます。主な違いは、トランジションがプロパティ値の変化時に暗黙的に発動するのに対し、アニメーションはアニメーションプロパティが適用されたときに明示的に実行されることです。したがって、アニメーションにはアニメーションされるプロパティの明示的な値が必要です。これらの値は以下で説明するアニメーションキーフレームを用いて指定します。

アニメーションの反復回数、開始値と終了値の交互挙動、アニメーションが実行中か一時停止中かなど、アニメーションの多くの側面を制御できます。アニメーションの開始時間を遅らせることもできます。

1.1. 値の定義

この仕様は、CSSプロパティ定義規約[CSS2])と 値定義構文[CSS-VALUES-3])に従っています。 この仕様で定義されていない値型は、CSS Values & Units [CSS-VALUES-3] で定義されています。 他のCSSモジュールとの組み合わせによって、これらの値型の定義が拡張される場合があります。

各プロパティの定義に記載されたプロパティ固有の値に加えて、この仕様で定義されているすべてのプロパティは CSS全体キーワードもプロパティ値として受け付けます。 可読性のため、これらのキーワードは明示的に繰り返し記載されていません。

2. アニメーション

CSSアニメーションは、算出プロパティ値に影響します。この効果は、CSSカスケード ([CSS3CASCADE]) に指定値を追加することで発生し(CSSアニメーション用のレベル)、アニメーションの現在の状態に合った算出値を生成します。[CSS3CASCADE] で定義されているように、アニメーションは通常のすべてのルールを上書きしますが、!importantルールには上書きされます。

ある時点で同じプロパティに対して複数のアニメーションが挙動を指定している場合、animation-name の値で最後に現れるアニメーションが、その時点で他のアニメーションを上書きします。

アニメーションは、アニメーションの適用前(つまり animation-name プロパティが要素に設定された時)や、削除された後には算出値に影響しません。さらに、通常はアニメーション遅延が終了する前やアニメーション終了後も算出値に影響しませんが、animation-fill-mode プロパティによっては影響する場合があります。

アニメーション実行中は、アニメーションするプロパティの値が算出されます。他の値は、CSSカスケード ([CSS3CASCADE]) に従って、アニメーション値より優先される場合があります。

アニメーションが適用されていて終了していない場合、あるいは終了していても animation-fill-modeforwardsboth の場合、ユーザーエージェントは、当該要素の will-change プロパティ ([css-will-change-1]) が、アニメーションによってアニメーションされたすべてのプロパティを追加で含んでいるかのように動作しなければなりません。

アニメーションの開始時刻は、アニメーションを適用するスタイルと対応する @keyframes ルールの両方が解決された時刻です。要素にアニメーションが指定されても対応する @keyframes ルールがまだ存在しない場合、アニメーションは開始できません。該当する @keyframes ルールが解決できるようになると、アニメーションは最初から開始します。要素のスタイルを動的に変更して指定されたアニメーションは、そのスタイルが解決されたときに開始します。これは、ホバーなどの疑似スタイルルールの場合は即座に、スクリプトでスタイルを適用した場合はスクリプトエンジンがブラウザに制御を戻した時に開始することがあります。なお、キーフレームスタイルルールを動的に更新しても、アニメーションが開始または再開始されることはありません。

要素にアニメーションを適用するには、その名前が animation-name プロパティの算出値の識別子のひとつとして現れ、アニメーションが有効な @keyframes ルールを使用している必要があります。アニメーションが開始すると、終了するか animation-name が削除されるまで継続します。アニメーションプロパティの値がアニメーション実行中に変更された場合、その変更はアニメーションが開始された時点からその値を持っていたかのように適用されます。たとえば、animation-delay を短縮すると、アニメーションが前方にジャンプしたり、即座に終了して animationend イベントが発行されたりすることがあります。 逆に、animation-delay を延長すると、アニメーションが再開始され、animationstart イベントが発行されることがあります。

同じ @keyframes ルール名は animation-name 内で繰り返して指定できます。 animation-name の値が更新されると、既存のアニメーションリストを末尾から先頭に向かって新しいアニメーションリストを順に反復し、それぞれのアニメーションについて、既存のアニメーションリスト内で最後に一致するアニメーションを探します。 一致が見つかった場合、既存のアニメーションは新しいリストの位置に対応するアニメーションプロパティで更新され、再生時間は上記のとおり維持されます。 一致したアニメーションは既存のリストから削除され、二重に一致しないようにします。 一致が見つからない場合は新しいアニメーションが作成されます。 その結果、animation-name を ‘a’ から ‘a, a’ に更新すると、既存の ‘a’ 用アニメーションはリストの2番目のアニメーションとなり、リストの最初の項目には新しいアニメーションが作成されます。

div {
  animation-name: diagonal-slide;
  animation-duration: 5s;
  animation-iteration-count: 10;
}

@keyframes diagonal-slide {

  from {
    left: 0;
    top: 0;
  }

  to {
    left: 100px;
    top: 100px;
  }

}

これは、要素を(0, 0)から(100px, 100px)まで5秒かけて移動し、9回繰り返して合計10回の反復となるアニメーションを生成します。

display プロパティを none に設定すると、その要素と子孫に適用されている実行中のアニメーションはすべて終了します。要素の displaynone の場合、displaynone 以外に更新すると、animation-name プロパティで適用されているすべてのアニメーションがその要素および displaynone 以外の子孫要素に対して開始されます。

著者はアニメーションを使って動的に変化するコンテンツを作成できますが、動的に変化するコンテンツは一部のユーザーに発作を引き起こす可能性があります。発作の原因となる可能性があるコンテンツを回避する方法については、ガイドライン2.3:発作:発作の原因として知られている方法でコンテンツを設計しないこと([WCAG20])を参照してください。

レンダリングメディアが対話型でない場合(例:印刷時など)、実装はアニメーションを無視してもかまいません。将来のバージョンのこの仕様では、これらのメディア向けのアニメーションのレンダリング方法が定義されるかもしれません。

3. キーフレーム

キーフレームは、アニメーションの様々な時点でアニメーションされるプロパティの値を指定するために使用されます。キーフレームはアニメーションの1サイクルの挙動を指定し、アニメーションは0回以上繰り返される場合があります。

キーフレームは、以下のように定義される @keyframes アットルールを使用して指定します:

@keyframes = @keyframes <keyframes-name> { <rule-list> }

<keyframes-name> = <custom-ident> | <string>

<keyframe-block> = <keyframe-selector># { <declaration-list> }

<keyframe-selector> = from | to | <percentage [0,100]>

<rule-list> は、@keyframes 内で <keyframe-block> ルールのみを含むことができます。

<declaration-list> は、<keyframe-block> 内でこの仕様で定義されているプロパティ以外の任意のCSSプロパティを受け付けますが、例外的に animation-timing-function プロパティは受け付け、特別に解釈されます。 これらのプロパティはカスケードとは相互作用しません(そのため !important を使用すると無効となり、プロパティは無視されます)。

@keyframes ブロックには、前置部の <custom-ident> または <string> により名前が与えられます。 2つの構文は機能的に同等であり、名前はidentまたはstringの値です。 <custom-ident><string> の場合、名前は完全に大文字小文字を区別します。 2つの名前が等しいのは、コードポイント単位で同一の場合のみです。 <custom-ident> では、さらに none キーワードを除外します。

例えば、次の2つの @keyframes ルールは同じ名前なので、最初のものは無視されます:
@keyframes foo { /* ... */ }
@keyframes "foo" { /* ... */ }

一方、次の @keyframes ルールの名前は前の2つとは異なります

@keyframes FOO { /* ... */ }

以下の @keyframes ルールは、許可されていない <custom-ident> 値を使用しているため無効です:

@keyframes initial { /* ... */ }
@keyframes None { /* ... */ }

ただし、それらの名前は <string> として指定することは可能です。したがって、以下はどちらも有効です:

@keyframes "initial" { /* ... */ }
@keyframes "None" { /* ... */ }

<keyframe-selector> は、<keyframe-block> のために、カンマ区切りのパーセンテージ値またはキーワード fromto で構成されます。セレクタはアニメーションの継続時間に対するパーセンテージを指定するために使用されます。 キーフレーム自体は、セレクタで宣言されたプロパティ値のブロックによって指定されます。キーワード from は値 0% と同等です。キーワード to は値 100% と同等です。 0% 未満や 100% より大きい値は無効となり、その <keyframe-block> は無視されます。

パーセンテージ値には単位指定子(%)が必要であることに注意してください。したがって、0 は無効なキーフレームセレクタです。

0%from キーフレームが指定されていない場合、ユーザーエージェントはアニメーションされるプロパティの算出値を使って 0% キーフレームを構築します。100%to キーフレームが指定されていない場合も、ユーザーエージェントはアニメーションされるプロパティの算出値を使って 100% キーフレームを構築します。

<keyframe-block> にはプロパティと値が含まれます。この仕様で定義されているプロパティは、animation-timing-function を除き、これらのルールでは無視されます。その挙動は後述します。また、!importantが付加されたプロパティは無効で無視されます。

同じ名前で複数の @keyframes ルールが定義されている場合、文書順で最後のものが有効となり、それ以前のものはすべて無視されます。

div {
  animation-name: slide-right;
  animation-duration: 2s;
}

@keyframes slide-right {

  from {
    margin-left: 0px;
  }

  50% {
    margin-left: 110px;
    opacity: 1;
  }

  50% {
    opacity: 0.9;
  }

  to {
    margin-left: 200px;
  }

}

上記の2つの50%ルールは、次のように等価な単一ルールにまとめることもできます:

@keyframes slide-right {

  from {
    margin-left: 0px;
  }

  50% {
    margin-left: 110px;
    opacity: 0.9;
  }

  to {
    margin-left: 200px;
  }

}

キーフレームの集合を決定するには、セレクタ内のすべての値を時間順に昇順でソートします。@keyframes ルール内の規則はカスケードされるため、同じセレクタ値を持つ @keyframes ルールが複数ある場合、キーフレームのプロパティは複数のルールから派生することがあります。

キーフレームでプロパティが指定されていない場合や無効の場合、そのキーフレームは存在しないものとしてアニメーションが進行します。概念的には、いずれかのキーフレームに存在する各プロパティごとにキーフレーム集合が構築され、それぞれ独立してアニメーションが実行されるかのように動作します。

@keyframes wobble {
  0% {
    left: 100px;
  }

  40% {
    left: 150px;
  }

  60% {
    left: 75px;
  }

  100% {
    left: 100px;
  }
}

「wobble」という名前のアニメーションには4つのキーフレームが指定されています。最初のキーフレーム(アニメーションサイクルの開始時)では、アニメーションされる left プロパティの値は 100px です。アニメーションの40%時点で left150px までアニメーションされます。 60%時点では left75px まで戻り、アニメーションサイクルの最後では left の値は 100px に戻ります。下図は、アニメーションの継続時間が 10s である場合の状態を示しています。

キーフレームで指定されたアニメーション状態

本仕様は、CSSトランジションの Application of transitions セクションのように、値がキーフレームからどのように決定されるかを定義する必要があります。

3.1. キーフレームのタイミング関数

キーフレームスタイルルールでは、アニメーションが次のキーフレームへ進む際に使用されるタイミング関数も宣言できます。

@keyframes bounce {

  from {
    top: 100px;
    animation-timing-function: ease-out;
  }

  25% {
    top: 50px;
    animation-timing-function: ease-in;
  }

  50% {
    top: 100px;
    animation-timing-function: ease-out;
  }

  75% {
    top: 75px;
    animation-timing-function: ease-in;
  }

  to {
    top: 100px;
  }

}

「bounce」という名前のアニメーションには5つのキーフレームが指定されています。最初と2番目のキーフレーム(0%~25%間)はease-outタイミング関数が使用されます。2番目と3番目のキーフレーム(25%~50%間)はease-inタイミング関数が使用されます。以降も同様に続きます。効果として、要素がページ上部へ50px移動し、最高点に到達するにつれ減速し、元の100pxへ戻る際には加速します。アニメーションの後半も同様に、要素はページ上部へ25pxだけ移動します。

to100% のキーフレームで指定されたタイミング関数は無視されます。

詳細は animation-timing-function プロパティの項を参照してください。

3.2. animation-name プロパティ

animation-name プロパティは適用するアニメーションのリストを定義します。各名前は、アニメーションのプロパティ値を提供するキーフレームアットルールを選択するために使用されます。名前がいずれのキーフレームアットルールとも一致しない場合、アニメーションされるプロパティはなく、アニメーションは実行されません。また、アニメーション名が none の場合、アニメーションはありません。これはカスケードからくるアニメーションを上書きするために使用できます。複数のアニメーションが同じプロパティを変更しようとした場合、名前リストの末尾に最も近いアニメーションが優先されます。

名前で列挙された各アニメーションには、下記の他のアニメーションプロパティにも対応する値があるべきです。その他のアニメーションプロパティの値リストの長さが一致しない場合、animation-name リストの長さが、アニメーション開始時に各リストで調べられる項目数を決定します。リストは先頭から対応付けられ、末尾の余剰値は使用されません。他のプロパティに animation-name の値数に十分なカンマ区切り値がない場合、UAは値リストを繰り返して十分な数になるように使用値を計算しなければなりません。この切り捨てや繰り返しは算出値には影響しません。

注: これは background-* プロパティの挙動と類似しており、background-imageanimation-name と類似しています。

名前: animation-name
値: [ none | <keyframes-name> ]#
初期値: none
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は大文字小文字区別のCSS識別子またはキーワード none
正規順序: 文法順
アニメーション型: アニメーション不可

animation-name の値には以下の意味があります:

none
キーフレームが全く指定されていないため、アニメーションはありません。 他のアニメーションプロパティを指定しても、このアニメーションには効果がありません。
<keyframes-name>
アニメーションは、指定された <keyframes-name> の名前を持つキーフレームを使用します(存在する場合)。 その名前の @keyframes ルールが存在しない場合、アニメーションはありません。

3.3. animation-duration プロパティ

animation-duration プロパティは、1回のアニメーションサイクルの継続時間を定義します。

名前: animation-duration
値: <time [0s,∞]>#
初期値: 0s
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は継続時間
正規順序: 文法順
アニメーション型: アニメーション不可
<time [0s,∞]>
<time> は、アニメーションが1サイクルを完了するまでの時間を指定します。 負の <time> は無効です。

<time>0s の場合(初期値と同様)、キーフレームは効果を持ちませんが、アニメーション自体は即座に発生します。 具体的には、開始・終了イベントが発火します。 animation-fill-modebackwards または both の場合、 animation-direction で定義されるアニメーションの最初のフレームが animation-delay の間表示されます。 animation-delay の後、 animation-direction で定義されるアニメーションの最後のフレームが animation-fill-modeforwards または both の場合表示されます。 animation-fill-modenone の場合は、アニメーションは可視効果を持ちません。

3.4. animation-timing-function プロパティ

animation-timing-function プロパティは、 アニメーションが各キーフレーム間をどのように進行するかを記述します。 タイミング関数は CSS イージング関数モジュール [css-easing-1] で定義されています。

使用される input progress value は、現在のキーフレームから次のキーフレームまでの経過時間の割合(animation-direction の効果を組み込んだ後)です。

animation-delay の間は animation-timing-function は適用されません。

注: この定義は、step easing functionstep positionstart の場合、関数の最初のステップのトップと同じ逆方向のフィルを生み出してしまうため必要です。

output progress value は、 現在と次のキーフレーム間でプロパティ値を補間する際の p 値として使用されます。

名前: animation-timing-function
値: <easing-function>#
初期値: ease
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は算出された <easing-function>
正規順序: 文法順
アニメーション型: アニメーション不可

キーフレームで指定された場合、animation-timing-function は、 アニメーションするプロパティについて、現在のキーフレームからソートされたキーフレームセレクタ順(暗黙の100%キーフレームも含む)の次のキーフレームまでの進行を定義します。

3.5. animation-iteration-count プロパティ

animation-iteration-count プロパティは、 アニメーションサイクルが再生される回数を指定します。初期値は 1 で、アニメーションは開始から終了まで1回だけ再生されます。 このプロパティは、animation-direction の値 alternate と組み合わせてよく使われ、これによりアニメーションは交互に逆方向で再生されます。

アニメーションがアクティブな時間枠(duration × iteration-count)は active duration と呼ばれます。

名前: animation-iteration-count
値: <single-animation-iteration-count>#
初期値: 1
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は数値またはキーワード infinite
正規順序: 文法順
アニメーション型: アニメーション不可

<single-animation-iteration-count> = infinite | <number [0,∞]>

infinite
アニメーションは無限に繰り返されます。
<number [0,∞]>

アニメーションは指定した回数だけ繰り返されます。 数値が整数でない場合、アニメーションは最後のサイクルの途中で終了します。 負の値は無効です。

0 は有効な値であり、animation-duration0s の場合と同様、アニメーションは即座に発生します。

アニメーションの継続時間が 0s の場合、animation-iteration-count のどんな有効値(infinite を含む)でも即座にアニメーションが発生します。

3.6. animation-direction プロパティ

animation-direction プロパティは、アニメーションが一部または全部のサイクルで逆方向に再生されるかどうかを定義します。 アニメーションが逆方向に再生される場合、タイミング関数も逆転します。 例えば、逆方向で再生された ease-in アニメーションは ease-out アニメーションのように見えます。

名前: animation-direction
値: <single-animation-direction>#
初期値: normal
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は指定されたキーワード
正規順序: 文法順
アニメーション型: アニメーション不可

<single-animation-direction> = normal | reverse | alternate | alternate-reverse

normal
アニメーションのすべての反復は指定された通りに再生されます。
reverse
アニメーションのすべての反復は指定された方法と逆方向に再生されます。
alternate
アニメーションサイクルの奇数回は通常方向で、偶数回は逆方向で再生されます。
alternate-reverse
アニメーションサイクルの奇数回は逆方向で、偶数回は通常方向で再生されます。

注: 反復回数が奇数か偶数かを判定する際は、1からカウントを開始します。

3.7. animation-play-state プロパティ

animation-play-state プロパティは、アニメーションが実行中か一時停止中かを定義します。

名前: animation-play-state
値: <single-animation-play-state>#
初期値: running
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は指定されたキーワード
正規順序: 文法順
アニメーション型: アニメーション不可

<single-animation-play-state> = running | paused

running
このプロパティが running に設定されている間、 アニメーションは通常通り進行します。
paused
このプロパティが paused に設定されている間、 アニメーションは一時停止されます。 アニメーションは、一時停止前に進行した状態で要素に引き続き適用されます。 再び running に戻すと、元の進行位置から再開されます。 これは、アニメーションを制御する「時計」が停止して再び動き始めるような動作です。

アニメーションの遅延フェーズ中にこのプロパティが paused に設定された場合、 遅延の時計も一時停止され、animation-play-staterunning に戻されるとすぐに再開します。

3.8. animation-delay プロパティ

animation-delay プロパティは、アニメーションがいつ開始されるかを定義します。このプロパティにより、アニメーションを適用してから実行開始まで時間を遅らせたり、適用前にすでに実行されているかのような見せ方も可能です。

名前: animation-delay
値: <time>#
初期値: 0s
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は継続時間
正規順序: 文法順
アニメーション型: アニメーション不可
<time>
<time> は、アニメーションの開始(これらのプロパティで要素にアニメーションが適用された時)から実際に実行が始まるまでの遅延時間を定義します。 0s(初期値)の遅延はアニメーションが適用されるとすぐに実行されることを意味します。

負の遅延も有効です。 0s の遅延と同様に、アニメーションは即座に実行されますが、自動的に絶対値の分だけ進行した状態で開始されます。 つまり、アニメーションが過去に指定された時間だけ前から始まっていたかのように見え、active duration の途中から開始する形となります。 アニメーションのキーフレームに暗黙の開始値がある場合は、値はアニメーション開始時のものが使われ、過去の値は使われません。

3.9. animation-fill-mode プロパティ

animation-fill-mode プロパティは、アニメーションが実行されていない時間帯にどんな値が適用されるかを定義します。デフォルトでは、アニメーションは適用された瞬間(animation-name プロパティが要素に設定された時)から実行開始(animation-delay で決まる)までの間、プロパティ値に影響しません。また、アニメーション終了後(animation-durationanimation-iteration-count で決まる)も影響しません。 animation-fill-mode プロパティでこの挙動を上書きできます。プロパティへの動的な更新は、アニメーション遅延中や終了後も必要に応じて反映されます。

名前: animation-fill-mode
値: <single-animation-fill-mode>#
初期値: none
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: リスト。各項目は指定されたキーワード
正規順序: 文法順
アニメーション型: アニメーション不可

<single-animation-fill-mode> = none | forwards | backwards | both

none
アニメーションが適用されているが実行されていない間は、何の効果もありません。
forwards
アニメーション終了後(animation-iteration-count で決まる)、アニメーションはアニメーション終了時点のプロパティ値を適用します。animation-iteration-count が0より大きい整数の場合、適用される値はアニメーションの最後に完了した反復の終了時点の値です(次の反復の開始時点の値ではありません)。animation-iteration-count が0の場合、適用される値は最初の反復を開始する値(animation-fill-modebackwards の場合と同様)になります。
backwards
animation-delay で定義される期間中、アニメーションはアニメーションの最初の反復を開始するキーフレームで定義されたプロパティ値を適用します。 これらは from キーフレームの値(animation-directionnormalalternate の場合)、または to キーフレームの値(animation-directionreversealternate-reverse の場合)です。
both
forwardsbackwards の両方の効果が適用されます。

3.10. animation ショートハンドプロパティ

animation ショートハンドプロパティは、カンマ区切りのアニメーション定義リストです。リスト内の各項目は、ショートハンドのすべてのサブプロパティ(アニメーションプロパティと呼ばれる)の値を1つずつ割り当てます。(animation-name の定義を参照。これらのプロパティが異なる長さのリストを持つ場合に何が起こるか、ただし animation ショートハンドのみで定義した場合はこの問題は発生しません。)

名前: animation
値: <single-animation>#
初期値: 個別プロパティ参照
適用対象: 全ての要素
継承: なし
パーセンテージ: N/A
算出値: 個別プロパティ参照
正規順序: 文法順
アニメーション型: アニメーション不可

<single-animation> = <time> || <easing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]

それぞれのアニメーション定義内では、順序が重要です。各 <single-animation> 内で最初に <time> として解析できる値が animation-duration に割り当てられ、 2番目の <single-animation> 内で <time> として解析できる値が animation-delay に割り当てられます。

それぞれのアニメーション定義内では、<keyframes-name> の値を他のキーワードと区別するためにも順序が重要です。解析時、他のプロパティ用のキーワードで、ショートハンド内で前に値が見つかっていないものは animation-name でなくそのプロパティの値として受け入れる必要があります。また、シリアライズ時は、他のプロパティのデフォルト値を、animation-name が他のプロパティ値となり得る場合など、必要最小限のケースで出力しなければならず、追加で出力しても構いません。

例えば、animation: 3s none backwards という値(animation-fill-modenoneanimation-namebackwards の場合)は、animation: 3s backwardsanimation-fill-modebackwardsanimation-namenone の場合)としてシリアライズしてはなりません。

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

複数のアニメーション関連イベントがDOMイベントシステムを通じて利用可能です。アニメーションの開始・終了、および各反復の終了でDOMイベントが発生します。 要素は複数のプロパティを同時にアニメーションさせることができます。これは、単一の animation-name の値で複数プロパティを含むキーフレームを持つ場合や、複数の animation-name の値がある場合に発生します。イベントの観点では、各 animation-name が1つのアニメーションを指定します。したがって、各 animation-name の値ごとにイベントが発生し、アニメーションされているプロパティごとではありません。

有効なキーフレームルールが定義されているアニメーションはすべて実行され、イベントを生成します。これは空のキーフレームルールでも同様です。

アニメーションが実行された時間は、生成された各イベントと共に送信されます。これにより、イベントハンドラはループアニメーションの現在の反復や交互アニメーションの現在位置を判定できます。この時間には、アニメーションが paused 状態であった時間は含まれません。

4.1. AnimationEvent インターフェース

AnimationEvent インターフェースは、アニメーションイベントに関連する特定のコンテキスト情報を提供します。

4.1.1. IDL定義

[Exposed=Window]
interface AnimationEvent : Event {
  constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {});
  readonly attribute CSSOMString animationName;
  readonly attribute double elapsedTime;
  readonly attribute CSSOMString pseudoElement;
};
dictionary AnimationEventInit : EventInit {
  CSSOMString animationName = "";
  double elapsedTime = 0.0;
  CSSOMString pseudoElement = "";
};

4.1.2. 属性

animationName, CSSOMString, 読み取り専用
イベントを発生させたアニメーションの animation-name プロパティの値。
elapsedTime, double, 読み取り専用
このイベントが発生した時点でアニメーションが実行されていた時間(秒)。一時停止していた時間は除外されます。具体的な計算方法は各イベントタイプごとに定義されています。
pseudoElement, CSSOMString, 読み取り専用
アニメーションが実行されたCSS疑似要素の名前(「::」で始まる)。その場合、イベントのターゲットは疑似要素に対応する要素になります。アニメーションが要素自体で実行されている場合は空文字列となり、イベントのターゲットはその要素になります。

AnimationEvent(type, animationEventInitDict)イベントコンストラクターです。

4.2. AnimationEvent の種類

発生しうるアニメーションイベントの種類は以下のとおりです:

animationstart
animationstart イベントはアニメーションの開始時に発生します。 animation-delay がある場合、遅延期間が終了した時点でこのイベントが発火します。

負の遅延の場合、イベントは elapsedTime が遅延の絶対値(アニメーションの active duration で上限)と等しい値で発火します。 すなわち、 min(max(-animation-delay, 0), active duration); この場合、animation-play-staterunning でも paused でもイベントは発火します。

  • バブル: あり
  • キャンセル可: なし
  • コンテキスト情報: animationName, elapsedTime, pseudoElement
animationend
animationend イベントはアニメーションが終了したときに発生します。 この場合、イベントの elapsedTime の値は active duration と等しくなります。
  • バブル: あり
  • キャンセル可: なし
  • コンテキスト情報: animationName, elapsedTime, pseudoElement
animationiteration
animationiteration イベントは、アニメーションの各反復の終了時に発生します(ただし同時に animationend が発火する場合は除く)。 つまり、反復回数が1回以下のアニメーションではこのイベントは発生しません。

この場合の elapsedTime の値は、current iteration × animation-duration となります。 current iteration は新しい反復のゼロ基準インデックスです。例として、負の animation-delay がない場合、1回反復が完了した後の current iteration は1です。

  • バブル: あり
  • キャンセル可: なし
  • コンテキスト情報: animationName, elapsedTime, pseudoElement
animationcancel
animationcancel イベントは、animationend イベントが発火しない方法でアニメーションの実行が停止した場合に発生します。 例:animation-name の変更によるアニメーションの削除や、アニメーション要素またはその先祖が display:none になる場合などです。

このイベントの elapsedTime の値は、アニメーション開始からキャンセルされた瞬間までに経過した秒数です(アニメーションが paused だった時間は除く)。 負の animation-delay があった場合、アニメーション開始は実際のトリガーより animation-delay 秒前とみなされます。 一方、正の animation-delay があり、遅延期間終了前にイベントが発火した場合、elapsedTime の値は0になります。

  • バブル: あり
  • キャンセル可: なし
  • コンテキスト情報: animationName, elapsedTime, pseudoElement

4.3. 要素・Documentオブジェクト・Windowオブジェクトのイベントハンドラ

以下は、すべての HTML要素イベントハンドラ内容属性および イベントハンドラIDL属性としてサポートしなければならないイベントハンドラ(および対応する イベントハンドライベントタイプ)です。また、すべての Document および Window オブジェクトが イベントハンドラIDL属性としてサポートしなければなりません:

イベントハンドラ イベントハンドライベントタイプ
onanimationstart animationstart
onanimationiteration animationiteration
onanimationend animationend
onanimationcancel animationcancel

5. DOMインターフェース

CSSアニメーションは、キーフレームを記述する新しいインターフェースペアによってCSSOMから利用可能になります。

注: 以下で定義されるインターフェースは、この仕様レベルで相互運用可能なAPIを反映しています。将来のレベルでは、このAPIの一部が廃止されたり拡張されたりする場合があります。

5.1. CSSRule インターフェース

以下の2つのルール型が CSSRule インターフェースに追加されます。これらは新しい keyframe および keyframes ルールの識別を提供します。

5.1.1. IDL定義

partial interface CSSRule {
    const unsigned short KEYFRAMES_RULE = 7;
    const unsigned short KEYFRAME_RULE = 8;
};

5.2. CSSKeyframeRule インターフェース

CSSKeyframeRule インターフェースは、単一のキーに対するスタイルルールを表します。

5.2.1. IDL定義

[Exposed=Window]
interface CSSKeyframeRule : CSSRule {
  attribute CSSOMString keyText;
  [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};

5.2.2. 属性

keyText, CSSOMString
この属性は、パーセンテージ値のカンマ区切りリストとしてキーフレームセレクタを表します。from および to キーワードは、それぞれ 0% と 100% に対応します。

keyText に無効なキーフレームセレクタで更新を試みた場合、SyntaxError 例外をスローし、keyText の値は変更されません。

style, CSSStyleDeclaration、読み取り専用
この属性は、キーフレームルール用の CSSStyleDeclaration オブジェクトを返します。詳細は以下の通りです:
readonlyフラグ
未設定。
宣言
ルール内で宣言された宣言(指定順)。
親CSSルール
コンテキストオブジェクト(つまりこの CSSKeyframeRule)。
オーナーノード
null。

5.3. CSSKeyframesRule インターフェース

CSSKeyframesRule インターフェースは、単一アニメーションのキーフレーム集合全体を表します。

5.3.1. IDL定義

[Exposed=Window]
interface CSSKeyframesRule : CSSRule {
           attribute CSSOMString name;
  readonly attribute CSSRuleList cssRules;
  readonly attribute unsigned long length;

  getter CSSKeyframeRule (unsigned long index);
  undefined        appendRule(CSSOMString rule);
  undefined        deleteRule(CSSOMString select);
  CSSKeyframeRule? findRule(CSSOMString select);
};

5.3.2. 属性

name, CSSOMString
この属性はキーフレームの名前であり、animation-name プロパティで使用されます。
cssRules, CSSRuleList、読み取り専用
この属性はリスト内のキーフレームへのアクセスを提供します。
length, unsigned long、読み取り専用
この属性はリスト内のキーフレーム数です。

5.3.3. インデックス付きプロパティgetter

indexed property getter は、指定した位置の CSSKeyframeRule をキーフレームリストから返します。

パラメーター:

indexunsigned long
返すルールのゼロ基準インデックス。

戻り値:

CSSKeyframeRule
該当するルール、または指定したインデックスにルールがなければ undefined

例外なし

5.3.4. appendRule メソッド

appendRule メソッドは、渡された CSSKeyframeRule をキーフレームルールの末尾に追加します。

パラメーター:

ruleCSSOMString
追加されるルール。@keyframes ルール内の1エントリと同じ構文で表現されます。有効なルールは、キーが既に存在していても常に追加されます。

戻り値なし

例外なし

5.3.5. deleteRule メソッド

deleteRule メソッドは、指定されたキーフレームセレクタに一致する最後に宣言された CSSKeyframeRule を削除します。 一致するルールが存在しない場合、このメソッドは何もしません。

パラメーター:

selectCSSOMString
削除対象のルールのキーフレームセレクタ。0%〜100%のパーセンテージ値のカンマ区切りリスト、または fromto キーワード(それぞれ0%と100%に解決されます)。

指定したキーフレームセレクタの値の個数と順序は、対象となるキーフレームルールと一致しなければなりません。リスト内の値の前後の空白には敏感ではありません。

戻り値なし

例外なし

5.3.6. findRule メソッド

findRule メソッドは、指定したキーフレームセレクタに一致する最後に宣言された CSSKeyframeRule を返します。 一致するルールが存在しない場合、このメソッドは何も返しません。

パラメーター:

selectCSSOMString
検索対象のキーフレームセレクタ。0%〜100%のパーセンテージ値のカンマ区切りリスト、または fromto キーワード(それぞれ0%と100%に解決されます)。

指定したキーフレームセレクタの値の個数と順序は、対象となるキーフレームルールと一致しなければなりません。リスト内の値の前後の空白には敏感ではありません。

戻り値:

CSSKeyframeRule
見つかったルール。

例外なし

例えば、次のアニメーションがあったとします:
@keyframes colorful-diagonal-slide {

  from {
    left: 0;
    top: 0;
  }

  10% {
    background-color: blue;
  }

  10% {
    background-color: green;
  }

  25%, 75% {
    background-color: red;
  }

  100% {
    left: 100px;
    top: 100px;
  }

}

変数 anim がこのアニメーションの CSSKeyframesRule オブジェクトへの参照を持っていると仮定すると:

anim.deleteRule('10%');
var tenPercent = anim.findRule('10%');

これは、最初に最後の10%ルール(緑の背景色ルール)を削除し、残った青の背景色ルールを tenPercent に返します。

次の例では:

var red = anim.findRule('75%');

red には null が設定されます。赤の背景色ルールには完全なセレクタを使う必要があります:

var red = anim.findRule('25%,75%');

from は 0%、to は 100% に対応するので、これらのルールもどちらの値でも検索できます:

var from = anim.findRule('0%'); // Returns from { left: 0; top: 0; } rule
var to = anim.findRule('to');   // Returns 100% { left: 100px; top: 100px; } rule

5.4. GlobalEventHandlers インターフェースミックスインへの拡張

この仕様はHTMLの GlobalEventHandlers インターフェースミックスインを拡張し、イベントハンドラIDL属性アニメーションイベント用に追加します。詳細は § 4.3 要素・Documentオブジェクト・Windowオブジェクトのイベントハンドラ を参照してください。

5.4.1. IDL定義

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onanimationstart;
  attribute EventHandler onanimationiteration;
  attribute EventHandler onanimationend;
  attribute EventHandler onanimationcancel;
};

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

本仕様について報告されたプライバシー上の懸念はありません。

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

本仕様について報告されたセキュリティ上の懸念はありません。

8. 変更点

8.1. 2018年10月11日作業草案以降の変更点

以下の実質的な変更が行われました:

9. 謝辞

特に Tab Atkins、Brian Birtles、Shane Stephens、Carine Bournez、Christian Budde、Anne van Kesteren、Øyvind Stenhaug、Estelle Weyl、そしてwww-styleコミュニティの皆様のフィードバックに感謝します。

10. その他の未解決課題

キーフレームの相互作用方法を仕様化する必要があります

11. 編集中の作業グループ決議

このセクションは参考情報であり一時的なものです。

編集者は現在この仕様の編集が遅れています。以下の作業グループ決議がまだ編集に反映されていません:

適合性

文書規約

適合要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されます。規範部分で使われる "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、"OPTIONAL" などのキーワードは、RFC 2119で記載されている通りに解釈されます。ただし、可読性のため、この仕様書ではこれらの単語をすべて大文字で表記していません。

この仕様書の本文は、明示的に非規範と指定されたセクション、例、および注記を除き、すべて規範的です。[RFC2119]

この仕様書の例は「例えば」などの語句で始まるか、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の実装を行うことを推奨します。

非実験的な実装

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

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

テストケースおよび実装報告書の提出方法など詳細は、CSS作業グループのWebサイト https://www.w3.org/Style/CSS/Test/ を参照してください。質問は public-css-testsuite@w3.org メーリングリストへお送りください。

索引

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

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

参考文献

規格参考文献

[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2022年11月18日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-EASING-1]
Brian Birtles; Dean Jackson; Matt Rakow. CSS Easing Functions Level 1. 2023年2月13日. CR. URL: https://www.w3.org/TR/css-easing-1/
[CSS-SHAPES-2]
CSS Shapes Module Level 2 URL: https://drafts.csswg.org/css-shapes-2/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2022年10月19日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WILL-CHANGE-1]
Tab Atkins Jr.. CSS Will Change Module Level 1. 2022年5月5日. CR. URL: https://www.w3.org/TR/css-will-change-1/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016年4月12日. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3CASCADE]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 3. 2021年2月11日. REC. URL: https://www.w3.org/TR/css-cascade-3/
[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; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[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
[WCAG20]
Ben Caldwell; et al. Web Content Accessibility Guidelines (WCAG) 2.0. 2008年12月11日. REC. URL: https://www.w3.org/TR/WCAG20/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報文献

[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-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 配置レイアウトモジュール レベル3. 2023年2月17日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS3-TRANSITIONS]
David Baron; 他. CSSトランジション. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/

プロパティ索引

名前 初期値 適用対象 継承 %ages アニメーション型 正規順序 算出値
animation <single-animation># 個別プロパティ参照 全ての要素 なし N/A アニメーション不可 文法順 個別プロパティ参照
animation-delay <time># 0s 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は継続時間
animation-direction <single-animation-direction># normal 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は指定されたキーワード
animation-duration <time [0s,∞]># 0s 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は継続時間
animation-fill-mode <single-animation-fill-mode># none 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は指定されたキーワード
animation-iteration-count <single-animation-iteration-count># 1 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は数値またはキーワード infinite
animation-name [ none | <keyframes-name> ]# none 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は大文字小文字区別のcss識別子またはキーワード none
animation-play-state <single-animation-play-state># running 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は指定されたキーワード
animation-timing-function <easing-function># ease 全ての要素 なし N/A アニメーション不可 文法順 リスト、各項目は算出された <easing-function>

IDL索引

[Exposed=Window]
interface AnimationEvent : Event {
  constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {});
  readonly attribute CSSOMString animationName;
  readonly attribute double elapsedTime;
  readonly attribute CSSOMString pseudoElement;
};
dictionary AnimationEventInit : EventInit {
  CSSOMString animationName = "";
  double elapsedTime = 0.0;
  CSSOMString pseudoElement = "";
};

partial interface CSSRule {
    const unsigned short KEYFRAMES_RULE = 7;
    const unsigned short KEYFRAME_RULE = 8;
};

[Exposed=Window]
interface CSSKeyframeRule : CSSRule {
  attribute CSSOMString keyText;
  [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};

[Exposed=Window]
interface CSSKeyframesRule : CSSRule {
           attribute CSSOMString name;
  readonly attribute CSSRuleList cssRules;
  readonly attribute unsigned long length;

  getter CSSKeyframeRule (unsigned long index);
  undefined        appendRule(CSSOMString rule);
  undefined        deleteRule(CSSOMString select);
  CSSKeyframeRule? findRule(CSSOMString select);
};

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onanimationstart;
  attribute EventHandler onanimationiteration;
  attribute EventHandler onanimationend;
  attribute EventHandler onanimationcancel;
};

課題索引

この仕様は、値がキーフレームからどのように決定されるかを定義する必要があります。 (CSS Transitionsの トランジションの適用 セクションのように)
キーフレームの相互作用方法を仕様化する必要があります