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

W3C初公開作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2024/WD-css-easing-2-20240829/
最新公開バージョン:
https://www.w3.org/TR/css-easing-2/
編集者草案:
https://drafts.csswg.org/css-easing/
履歴:
https://www.w3.org/standards/history/css-easing-2/
実装レポート:
https://wpt.fyi/results/css/css-easing
フィードバック:
CSSWG課題リポジトリ
編集者:
(Mozilla)
(Apple Inc)
Tab Atkins Jr. (Google)
Chris Lilley (W3C)
元編集者:
Matt Rakow (Microsoft)
(Google)
(Google)
この仕様への編集提案:
GitHub エディター
参加方法:
IRC: #css (W3CのIRC)
テスト:
web-platform-tests css/css-easing
テストスイート:
https://wpt.fyi/results/css/css-easing/

概要

このCSSモジュールは、著者が値の変化速度を制御する変換を定義する方法について説明します。 アニメーションに適用すると、こうした変換により、物理現象(例えば運動量)を模倣したアニメーションや、 アニメーションを離散的なステップで動かしてロボットのような動きを実現することができます。 レベル2では、カスタムのイージング曲線用にさらに高度な関数が追加されました。

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

この文書のステータス

このセクションは、公開時点におけるこの文書のステータスを説明しています。 現在のW3C出版物の一覧や、この技術レポートの最新の改訂版は W3C技術レポート一覧(https://www.w3.org/TR/)にあります。

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

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

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

この文書は2023年11月3日版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 | <linear-easing-function> | <cubic-bezier-easing-function> | <step-easing-function>
テスト

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

線形イージング関数は、イージング関数であり、 ポイント間を線形補間します。

線形イージング関数ポイントリスト)を持ちます。これは線形イージングポイントのリストです。 新規作成時は空のリストです。

線形イージングポイントは、以下の項目を持つ構造体です:

input

数値または null

注: これは線形イージング関数の作成時のみ null となります。

output

数値

2.1.1. 構文

線形イージング関数の構文は以下の通りです:

<linear-easing-function> = linear(<linear-stop-list>)
<linear-stop-list> = [ <linear-stop> ]#
<linear-stop> = <number> && <linear-stop-length>?
<linear-stop-length> = <percentage>{1,2}
テスト

linear()は、 線形イージング関数にパースされます。その際、線形イージング関数の作成を呼び出し、 <linear-stop-list>リストとして、<linear-stop>のリストを渡します。

2.1.2. パース

線形イージング関数の作成リスト<linear-stop> stopListに対して行う場合、以下を実行します。 これは線形イージング関数または失敗を返します。

  1. functionを新しい線形イージング関数とします。

  2. largestInputを負の無限大で初期化します。

  3. stopList内の項目が2つ未満の場合、失敗を返します。

  4. stopについて、stopListを繰り返します:

    1. pointを新しい線形イージングポイントとし、outputにはstop<number>を数値として設定します。

    2. pointfunctionポイントに追加します。

    3. stop<linear-stop-length>がある場合:

      1. pointinputを、stop<linear-stop-length>の最初の<percentage>を数値として変換したものとlargestInputのうち大きい方に設定します。

      2. largestInputpointinputに設定します。

      3. stop<linear-stop-length>に2番目の<percentage>がある場合:

        1. extraPointを新しい線形イージングポイントとし、outputstop<number>を数値として設定します。

        2. extraPointfunctionポイントに追加します。

        3. extraPointinputを、stop<linear-stop-length>の2番目の<percentage>を数値として変換したものとlargestInputのうち大きい方に設定します。

        4. largestInputextraPointinputに設定します。

    4. それ以外で、stopstopListの最初の項目の場合:

      1. pointinputを0に設定します。

      2. largestInputを0に設定します。

    5. それ以外で、stopstopListの最後の項目の場合は、 pointinputを1またはlargestInputの大きい方に設定します。

  5. function項目のうち、inputがnullのものについては、 直前および直後のinputがnullでないポイント間で線形補間して値を設定します。

  6. functionを返します。

2.1.3. シリアライズ

linear()のシリアライズには各ポイントのinput値が含まれ、 input値は前のポイントのinput値より小さくなることはありません。

例:

linear easing functionlinearEasingFunction)の シリアライズ済み算出値を取得するには、 以下を実行します。 これは文字列を返します。

  1. outputに"linear("を代入します。

  2. pointについて linearEasingFunctionpointsを繰り返します:

    1. pointlinearEasingFunction最初の項目でない場合、 outputに", "を追加します。

    2. pointoutputの算出値を <number>として outputに追加します。

    3. outputに" "を追加します。

    4. pointinputの算出値を <percentage>として outputに追加します。

  3. outputに")"を追加します。

  4. outputを返します。

2.1.4. 線形イージング関数の出力

指定されたlinear easing function linearEasingFunctioninput progress value inputProgressについて、 線形イージング出力進捗値を計算するには以下を実行します。 これは出力進捗値を返します。

  1. pointslinearEasingFunctionpointsとします。

  2. pointAIndexを、points内でinputinputProgress以下である最後の項目のインデックスとします。 該当がなければ0とします。

  3. pointAIndexpointsサイズマイナス1と等しい場合、 pointAIndexを1減算します。

    注: これにより比較対象となる「次の」ポイントを保持できます。

  4. pointApoints[pointAIndex]とします。

  5. pointBpoints[pointAIndex + 1]とします。

  6. pointAinputpointBinputと等しい場合、 pointBoutputを返します。

  7. progressFromPointAinputProgressからpointAinputを減算した値とします。

  8. pointInputRangepointBinputから pointAinputを減算した値とします。

  9. progressBetweenPointsprogressFromPointApointInputRangeで割った値とします。

  10. pointOutputRangepointBoutputから pointAoutputを減算した値とします。

  11. outputFromLastPointprogressBetweenPointspointOutputRangeを掛けた値とします。

  12. pointAoutputoutputFromLastPointを加算した値を返します。

テスト

2.1.5.

linear()は、複数のポイント間を線形補間するイージング関数を定義できます。

例えば、linear(0, 0.25, 1)は、0から0.25、そして1へ線形に動くイージング関数を生成します:

linear(0, 0.25, 1) のグラフ描画例
デフォルトでは、明示的な"input"がないエントリ間の値は均等に分布されます。 input値は<percentage>で指定できます。

例えば、linear(0, 0.25 75%, 1)は、次のイージング関数を生成します。 これは0から.25への移行に全体の75%の時間を使い、 最後の25%で.25から1へ移行します:

linear(0, 0.25 75%, 1) のグラフ描画例。3点あり、最初は 0,0、次は 0.75,0.25、最後は 1,1。
1つの出力に対して2つのinput値を指定すると、同じ出力値を持つポイントが2つ生成されます。

例えば、linear(0, 0.25 25% 75%, 1)linear(0, 0.25 25%, 0.25 75%, 1)と同じで、 次のイージング関数を生成します:

linear(0, 0.25 75%, 1) のグラフ描画例。4点あり、最初は 0,0、次は 0.25,0.25、次は 0.75,0.25、最後は 1,1。
inputが指定範囲外の場合、最も近い2点の軌道が継続されます。

例えば、前述の関数の暗黙的な値は以下の通りです:

linear(0, 0.25 75%, 1) のグラフ描画例。4点あり、最初は 0,0、次は 0.25,0.25、次は 0.75,0.25、最後は 1,1。両端は近くの2線の角度で拡張されている。
linear()の一般的な用途は、多くのポイントを指定して曲線のような動きを作ることです。

例えば、linear()を使って再利用可能な「バウンス」イージング関数を作る例:

:root {
  --bounce: linear(
    /* 開始から1回目のバウンス */
    0, 0.063, 0.25, 0.563, 1 36.4%,
    /* 1回目から2回目のバウンス */
    0.812, 0.75, 0.813, 1 72.7%,
    /* 2回目から3回目のバウンス */
    0.953, 0.938, 0.953, 1 90.9%,
    /* 3回目のバウンスから終了まで */
    0.984, 1 100% 100%
  );
}

.example {
  animation-timing-function: var(--bounce);
}

定義の最後は1 100% 100%として2つの最終ポイントを作成し、1より大きいinputは常に1を出力します。

粗いバウンスイージングのグラフ。

より多くのポイントを使えば、アニメーションが遅い場合など滑らかな結果も得られます。

2.2. 線形イージングキーワード: linear

linearキーワードは、 入力値全てに対して出力進捗値入力進捗値と等しい 同一性の線形イージング関数を生成します。

これはlinear(0, 1)と同じ結果となります。

注: このキーワードは線形イージング関数を生成しますが、 linearキーワードの使用は常にそのままlinearとしてシリアライズされます。 一方、関数形式のlinear(0, 1)linear(0 0%, 1 100%)としてシリアライズされます。 これらの規則はシリアライズに記載されています。

2.3. 三次ベジェイージング関数: ease, ease-in, ease-out, ease-in-out, cubic-bezier()

三次ベジェイージング関数イージング関数の一種であり、 四つの実数値で定義されます。 これらの値は三次ベジェ曲線の2つの制御点P1P2を指定し、端点P0P3はそれぞれ(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>)

三次ベジェイージング関数を指定します。 四つの数値は曲線のP1P2を(x1, y1, x2, y2)として指定します。 どちらのx値も[0, 1]の範囲でなければならず、範囲外の場合は定義が無効です。

上記のキーワード値で生成されるイージング関数は以下の通りです:

キーワード値によるイージング関数例。
各三次ベジェイージング関数キーワード値で生成されるイージング関数。

2.3.1. 三次ベジェイージング関数の出力

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

入力進捗値が[0, 1]の範囲外の場合、 曲線は最も近い端点の接線を用いて無限に拡張されます:

テスト

2.4. ステップイージング関数: 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引数は関数の区間数を指定します。 2番目の引数がjump-noneの場合、1より大きい正の整数でなければならず、 それ以外は0より大きい正の整数でなければなりません。

第2引数(省略可能)は、以下のいずれかでステップ位置を指定します:

jump-start

最初の上昇は入力進捗値が0の時に発生します。

jump-end

最後の上昇は入力進捗値が1の時に発生します。

jump-none

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

jump-both

最初の上昇は入力進捗値が0の時、 最後の上昇は入力進捗値が1の時に発生します。

start

jump-startと同様に動作します。

end

jump-endと同様に動作します。

第2引数を省略した場合、値はendと見なされます。

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

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

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

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

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

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

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

遅延フェーズ中、input progress valueは0ですが、 before flagがセットされていて アニメーションがまだintervalに達していないことを示す場合、イージング関数はoutput progress valueとして0(最初のステップの下端)を返します。

アニメーション区間が始まる正確な瞬間では、input progress valueはまだ0ですが、 before flagはセットされていないため、 イージング関数の結果は最初のステップの頂点(上端)となります。

output progress valueを計算する目的では、 step positionstartjump-startと同等とみなします。 同様にendjump-endと同等とみなします。 そのため、以下のアルゴリズムではstartendは明示的に参照しません。

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

output progress valueは、 input progress valuebefore flagから次の手順で計算されます:

  1. current stepfloor(input progress value × steps) として計算します。

  2. step positionプロパティが以下のいずれかの場合:

    current stepを1加算します。

  3. 次の2条件が両方真の場合:

    current stepを1減算します。

  4. input progress value ≥ 0 かつ current step < 0 の場合、 current stepをゼロにします。

  5. step positionに基づいてjumpsを次のように計算します:

    jump-start または jump-end

    steps

    jump-none

    steps - 1

    jump-both

    steps + 1

  6. input progress value ≤ 1 かつ current step > jumps の場合、 current stepjumpsにします。

    この手順の4・6は、input progress valueが[0, 1]の範囲の場合、 ステップイージング関数がその範囲を超えるoutput progress valueを生成しないことを保証します。

    例えば、数学的にはstep positionjump-startのステップイージング関数は、 input progress valueが1のとき1より上にステップアップするように 期待されるかもしれませんが、実際にはアニメーションが前方にfillする場合は output progress valueが1になることを期待します。

    同様の状況は、step positionjump-endのステップイージング関数を アニメーションの遅延フェーズに適用した場合にも起こります。

  7. output progress valuecurrent step / jumpsです。

テスト

2.5. シリアライズ

イージング関数は[CSSOM]で定義された共通のシリアライズパターンを使ってシリアライズされますが、 以下の追加要件があります:

テスト

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

この仕様に関して新たなプライバシーの考慮事項は報告されていません。

本仕様はウェブプラットフォームに直接新しい機能を導入するものではなく、他の仕様が参照可能な共通定義を提供するものです。

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

本仕様で定義された機能を参照する仕様は、イージング関数が通常 input progress valueとして[0,1]の範囲の値を取り、 output progress valueとして[0,1]の範囲の値を生成することが多いですが、 必ずしもそうとは限らないことを考慮する必要があります。 イージング関数の適用時には、この範囲外の入力や出力に対する挙動を定義し、 新たなセキュリティ上の懸念を導入しないようにするべきです。

3. 変更点

3.1. Level 1からの追加点

4. 謝辞

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

適合性

文書の規約

適合性要件は、記述的な断言と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はアクセシブルな代替手段を提供しなければなりません。

テスト

この仕様の内容に関するテストは、このような「Tests」ブロックに記載される場合があります。 そのようなブロックは非規範です。


適合クラス

本仕様への適合性は、以下の3つの適合クラスについて定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UAはスタイルシートの意味を解釈し、それを使用する文書をレンダリングします。
オーサリングツール
UAはスタイルシートを作成します。

スタイルシートが本仕様に適合しているとされるのは、このモジュールで定義された構文を使用する全ての記述が、一般的なCSS文法およびこのモジュールで定義された各機能の個別文法に従って有効である場合です。

レンダラーが本仕様に適合しているとされるのは、適切な仕様に従ってスタイルシートを解釈することに加え、本仕様で定義された全ての機能を正しくパースし、文書をそれに従ってレンダリングする場合です。ただし、UAがデバイスの制限により文書を正しくレンダリングできない場合でも、UAが非適合であることにはなりません(例えば、UAは白黒モニターで色をレンダリングする必要はありません)。

オーサリングツールが本仕様に適合しているとされるのは、一般的なCSS文法およびこのモジュールの各機能の個別文法に従って構文的に正しいスタイルシートを作成し、このモジュールで記載されたスタイルシートの他の適合要件もすべて満たす場合です。

部分的な実装

著者が将来互換性のあるパース規則を活用してフォールバック値を指定できるように、CSSレンダラー、十分なレベルのサポートがない@規則、プロパティ、プロパティ値、キーワード、その他の構文構成要素を無効として(必要に応じて無視)扱わなければなりません。特に、ユーザーエージェント、サポートされていない構成要素値のみを選択的に無視し、1つのマルチ値プロパティ宣言でサポートされている値のみを有効にしてはなりません。いずれかの値が無効と見なされた場合(サポートされていない値は無効とする必要があります)、CSSでは宣言全体を無視する必要があります。

不安定および独自機能の実装

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

非実験的な実装

仕様が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-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024年3月22日. 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. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[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

参考情報文献

[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. 2023年6月5日. WD. URL: https://www.w3.org/TR/web-animations-1/