CSSイージング関数 レベル1

W3C 候補勧告ドラフト

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2023/CRD-css-easing-1-20230213/
最新公開バージョン:
https://www.w3.org/TR/css-easing-1/
編集者草案:
https://drafts.csswg.org/css-easing/
過去のバージョン:
履歴:
https://www.w3.org/standards/history/css-easing-1
実装報告:
https://wpt.fyi/results/css/css-easing?label=master&label=experimental&aligned
フィードバック:
CSSWG イシューレポジトリ
編集者:
(Mozilla)
(Apple Inc)
Matt Rakow (Microsoft)
元編集者:
(Google)
この仕様への編集提案:
GitHub 編集者
参加方法:
IRC: #css(W3CのIRC)
テスト:
web-platform-tests css/css-easing

概要

このCSSモジュールは、著者が値の変化率を制御する変換を定義する方法について説明します。 アニメーションに適用すると、このような変換は物理現象(例えば慣性)を模倣したアニメーションを生成したり、アニメーションを離散的なステップで動かしロボットのような動きを作り出すことができます。

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

この文書のステータス

このセクションは、本書の発行時点でのステータスについて説明します。 現在のW3C出版物一覧やこの技術レポートの最新版は、W3C技術レポート・インデックス https://www.w3.org/TR/ で参照できます。

この文書は、CSSワーキンググループによって候補勧告ドラフトとして、勧告プロセスを用いて公開されました。 候補勧告として公開されても、W3Cおよびその会員による支持を意味するものではありません。 候補勧告ドラフトは、ワーキンググループが今後の候補勧告スナップショットに含める予定の、前回の候補勧告からの変更を統合しています。

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

フィードバックはGitHubでイシューを提出(推奨)することで送信してください。 タイトルに仕様コード「css-easing」を含めて、次のように記載してください: 「[css-easing] …コメントの要約…」。 すべての課題とコメントはアーカイブされています。 または、フィードバックは(アーカイブ済み)の公開メーリングリストwww-style@w3.orgへ送信することもできます。

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

この文書は、W3C特許方針の下で運営されているグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを維持しています。 そのページには特許開示の手順も記載されています。 特許に関する実際の知識を持ち、その特許が必要なクレームを含むと考える場合、W3C特許方針第6節に従って情報を開示する必要があります。

1. はじめに

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

値の変化速度を制御したい場面はよくあります。 例えば、要素の移動速度を徐々に上げていくことで、その要素が慣性を持って加速しているような重みを感じさせることができます。 これは直感的なユーザーインターフェース要素や、物理的な特性を持つアニメーション小道具を作る際にも役立ちます。 また、アニメーションが回転する分割ホイールのように、常に分割部分が同じ位置に現れるような、明確なステップで前進することが望ましい場合もあります。

同様に、グラデーション補間の変化速度を制御することで、凹面や凸面を示唆したり、縞模様のような視覚効果を生み出すことができます。

イージング関数は、 入力進行値を受け取り、対応する変換された出力進行値を生成することで、値の変化を変換する手段を提供します。

イージング関数によるイーズイン効果の例。
イージング関数によるイーズイン効果の例。
入力進行値が0.7の場合、イージング関数は値をスケールして出力進行値0.52を生成します。
このイージング関数をアニメーションに適用すると、最初はゆっくり、その後徐々に速く進行します。

1.1. 値の定義

この仕様では、値の定義構文[CSS-VALUES-3] から使用します。 この仕様で定義されていない値型は CSS Values & Units [CSS-VALUES-3] で定義されています。 他のCSSモジュールとの組み合わせによって、これらの値型の定義が拡張される場合があります。

2. イージング関数

イージング関数入力進行値を受け取り、 出力進行値を生成します。

イージング関数は純粋関数でなければならず、同じ入力に対しては常に同じ 出力進行値を返します。

入力進行値は、[-∞, ∞] の範囲の実数です。 通常、入力進行値は [0, 1] の範囲ですが、 イージング関数を連鎖させる場合はそうでないこともあります。

イージング関数を連鎖させる例として、Web Animations [WEB-ANIMATIONS] があります。 アニメーション効果で指定したイージング関数の出力が、キーフレーム効果のキーフレームで指定したイージング関数の入力となる場合です。 この場合、キーフレーム効果のイージング関数への入力が [0, 1] の範囲外になることがあります。

出力進行値は、[-∞, ∞] の範囲の実数です。

一部のイージング関数タイプでは、追加のブール値入力 before flag を取ります(後述)。

この仕様では、以下の4種類のイージング関数の定義を示します。

イージング関数を指定するための構文は次の通りです:

<easing-function> = linear | <cubic-bezier-easing-function> | <step-easing-function>

2.1. 線形イージング関数: linear

線形イージング関数は恒等関数であり、 すべての入力に対し出力進行値入力進行値と等しくなります。

線形イージング関数の構文は、単に linear キーワードです。

2.2. キュービックベジェイージング関数: ease, ease-in, ease-out, ease-in-out, cubic-bezier()

キュービックベジェイージング関数は、 イージング関数の一種であり、 4つの実数で定義されます。 これらはキュービックベジェ曲線の2つの制御点P1およびP2を指定し、始点P0と終点P3はそれぞれ(0, 0)および(1, 1)に固定されています。 P1P2x座標は[0, 1]の範囲に制限されます。

イージング関数として使われるキュービックベジェ曲線。
イージング関数として使われるキュービックベジェ曲線。
曲線の形状は制御点P1P2の位置によって決まります。
入力進行値は曲線のx値となり、y値が出力進行値となります。

キュービックベジェイージング関数の構文は次の通りです ([CSS-VALUES-3]の記法を使用):

<cubic-bezier-easing-function> = ease | ease-in | ease-out | ease-in-out | cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)

各値の意味は以下の通りです:

ease

cubic-bezier(0.25, 0.1, 0.25, 1)と同等です。

ease-in

cubic-bezier(0.42, 0, 1, 1)と同等です。

ease-out

cubic-bezier(0, 0, 0.58, 1)と同等です。

ease-in-out

cubic-bezier(0.42, 0, 0.58, 1)と同等です。

cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)

キュービックベジェイージング関数を指定します。 4つの数値は曲線のP1およびP2の座標(x1, y1, x2, y2)です。 両方のx値は[0, 1]の範囲でなければならず、範囲外の場合は定義が無効です。

上記のキーワード値によるイージング関数は下図の通りです。

キーワード値によって生成されるイージング関数。
キュービックベジェイージング関数の各キーワード値によるイージング関数。

2.2.1. キュービックベジェイージング関数の出力

入力進行値から出力進行値へのマッピングは、与えられたx値(入力進行値)に対応するy値(出力進行値)を求めることで行われます。 この曲線の評価方法は [FUND-COMP-GRAPHICS] など多くの資料で解説されています。

入力進行値が[0, 1]の範囲外の場合、曲線の端点における接線を使って無限に延長されます:

2.3. ステップイージング関数: step-start, step-end, steps()

ステップイージング関数は、イージング関数の一種で、入力時間を指定された数の等しい長さの区間に分割します。 区間数を示すstepsと、ステップ位置で定義されます。 構文は以下の通りです:

<step-easing-function> = step-start | step-end | steps(<integer>[, <step-position>]?)

<step-position> = jump-start | jump-end | jump-none | jump-both | start | end

各値の意味は以下の通りです:

step-start

steps(1, start)と同等です。

step-end

steps(1, end)と同等です。

ステップイージングキーワードの例。
ステップイージング関数キーワード値の例。
steps(<integer>[, <step-position> ]?)

1つ目のパラメーターは関数の区間数を指定します。 0より大きい正の整数でなければなりませんが、2つ目のパラメーターがjump-noneの場合は1より大きい正の整数が必要です。

2つ目のパラメーター(省略可能)は、以下の値のいずれかを使ってステップ位置を指定します:

jump-start

最初の上昇は入力進行値0で発生します。

jump-end

最後の上昇は入力進行値1で発生します。

jump-none

すべての上昇は(0, 1)の範囲内で発生します。

jump-both

最初の上昇は入力進行値0で、最後の上昇は入力進行値1で発生します。

start

jump-startと同じ動作です。

end

jump-endと同じ動作です。

2つ目のパラメーターを省略した場合、endが既定値となります。

これらの値は下図の通りです:

ステップイージング関数の例。
ステップイージング関数の例。

2.3.1. ステップイージング関数の出力

ステップが発生する正確な位置では、関数の結果は概念的にはステップの上端になります。ただし、追加のbefore flagが入力としてステップイージング関数に渡され、trueの場合は、その時点で関数の結果がステップの下端となります。

before flagがこの関数の挙動にどのように影響するかの例として、 ステップイージング関数ステップ位置startで、正の遅延とbackwards fillを持つアニメーションを考えます。

例: CSSアニメーションの場合

animation: moveRight 5s 1s steps(5, start);

遅延フェーズ中、入力進行値は0ですが、before flagがアニメーションがまだインターバルに到達していないことを示す場合、 イージング関数は出力進行値として0(つまり最初のステップの下端)を返します。

アニメーションインターバルが始まる瞬間、入力進行値は依然として0ですが、before flagはセットされず、イージング関数の結果は最初のステップの上端となります。

出力進行値の計算に関しては、ステップ位置startjump-startと同等とみなします。 同様にendjump-endと同等です。 そのため、以下のアルゴリズムではstartendへの言及は明示的に行いません。

注意: ユーザーエージェントは、シリアライズ時(§ 2.4 シリアライズ参照)、jump-startstartを区別する必要があります。

出力進行値は、入力進行値before flagから以下のように計算します:

  1. current stepfloor(入力進行値 × steps)として計算します。

  2. ステップ位置プロパティが以下のいずれかの場合:

    current stepを1増やします。

  3. 以下の2つの条件が両方とも真の場合:

    current stepを1減らします。

  4. 入力進行値 ≥ 0 かつ current step < 0 の場合、current stepを0とします。

  5. ステップ位置に基づき、jumpsを以下のように計算します:

    jump-start または jump-end

    steps

    jump-none

    steps - 1

    jump-both

    steps + 1

  6. 入力進行値 ≤ 1 かつ current step > jumps の場合、current stepjumpsとします。

    この手順のステップ4と6により、[0, 1]の範囲の入力進行値に対して、ステップイージング関数がその範囲外の出力進行値を生成しないことが保証されます。

    例えば、数学的にはステップ位置jump-startのステップイージング関数は、入力進行値が1の場合に1を超えてステップアップすると思われるかもしれませんが、 実際には、アニメーションが前方に進行する際には出力進行値が1となることが期待されます。

    同様に、ステップ位置jump-endのステップイージング関数をアニメーションの遅延フェーズに適用した場合も同様です。

  7. 出力進行値current step / jumpsです。

2.4. シリアライズ

イージング関数は、[CSSOM]で定義された一般的なシリアライズパターンを用い、以下の追加要件に従ってシリアライズされます:

3. プライバシーとセキュリティの考慮事項

本仕様はウェブプラットフォームに直接新しい機能を導入するものではなく、他の仕様で参照される共通定義を提供します。 そのため、新たなプライバシーやセキュリティ上の懸念事項はありません。

本仕様で定義された機能を参照する仕様は、イージング関数が通常 入力進行値を[0,1]の範囲で受け取り、 出力進行値を[0, 1]の範囲で生成することが多いですが、 必ずしも常にそうとは限らないことに注意すべきです。 イージング関数を応用する場合は、入力・出力がこの範囲外となる場合の挙動を定義し、新たなセキュリティの懸念を生じさせないようにしてください。

4. 変更点

以下は、2019年4月30日候補勧告以降の変更点です:

5. 謝辞

本仕様は、L. David Baron、Dean Jackson、David Hyatt、Chris Marrinが編集したCSS Transitions仕様を基にしています。 編集者らは、Douglas Stockwell、Steve Block、Tab Atkins、Rachel Nabors、Martin Pitt、そしてAnimation at Workのslackコミュニティの皆様に、フィードバックと貢献を感謝します。

適合性

文書規約

適合要件は、記述的な断定と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レンダラーは、サポートできるレベルがない@規則、プロパティ、プロパティ値、キーワード、その他の構文要素を無効(そして適切に無視)として扱わなければなりません。特に、ユーザーエージェントは、単一の複数値プロパティ宣言内でサポートされている値のみを選択的に評価し、サポートされていないコンポーネント値を無視してはなりません。いずれかの値が無効と判断された場合(サポートされていない値はすべて無効となる)、CSSでは宣言全体を無視する必要があります。

不安定およびプロプライエタリ機能の実装

将来の安定したCSS機能との衝突を避けるため、CSSWGはベストプラクティスに従い、不安定な機能やプロプライエタリ拡張の実装を推奨します。

非実験的な実装

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

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

テストケースや実装報告書の提出方法については、CSSワーキンググループのウェブサイトhttps://www.w3.org/Style/CSS/Test/を参照してください。 質問はpublic-css-testsuite@w3.orgメーリングリストまで。

CR終了基準

本仕様を提案勧告へ進めるには、各機能について独立かつ相互運用可能な実装が少なくとも2つ必要です。各機能は異なる製品セットで実装されてもよく、すべての機能が単一製品で実装される必要はありません。本基準のために、以下の用語を定義します:

独立
各実装は異なる当事者によって開発され、他の適格な実装で使用されるコードを共有・再利用・派生してはなりません。本仕様の実装に関係のないコード部分はこの要件から除外されます。
相互運用可能
公式CSSテストスイートの該当テストケース(またはWebブラウザ以外の場合は同等のテスト)に合格すること。テストスイートのすべての関連テストには、該当UAで相互運用性を主張する場合は同等のテストが必要です。さらに、相互運用性を主張する場合は、同じ方法でその同等テストに合格できる追加のUAが必要です。同等テストはピアレビューのため公開されなければなりません。
実装
以下を満たすユーザーエージェント:
  1. 仕様を実装していること。
  2. 一般公開されていること。実装は出荷製品またはその他の公開バージョン(ベータ版、プレビューリリース、ナイトリービルド等)であってもよい。出荷されていない製品リリースは、安定性を示すため少なくとも1ヶ月間その機能を実装していなければならない。
  3. 実験的でないこと(テストスイート合格専用のバージョンではなく、今後通常利用を想定していること)。

仕様は少なくとも6ヶ月間、候補勧告として残ります。

索引

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

参照で定義されている用語

参考文献

規定参考文献

[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3(CSS値と単位モジュール レベル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(CSS値と単位モジュール レベル4). 2022年10月19日. WD. URL: https://www.w3.org/TR/css-values-4/
[RFC2119]
S. Bradner. RFCで要求レベルを示すために使用するキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考情報文献

[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[FUND-COMP-GRAPHICS]
Peter Shirley; Michael Ashikhmin; Steve Marschner. Fundamentals of Computer Graphics(コンピュータグラフィックスの基礎). 2009年.
[WEB-ANIMATIONS]
Brian Birtles; et al. Web Animations(ウェブアニメーション). 2022年9月8日. WD. URL: https://www.w3.org/TR/web-animations-1/