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. 引言

本节不是规范性的。

通常希望控制某些值变化的速率。例如,逐渐增加元素移动的速度可以使元素在获得动量时呈现出重量感。这可以用于产生直观的用户界面元素或表现得像其物理对应物的逼真动画道具。或者,有时希望动画以明显的步骤向前移动,例如一个分段的轮子旋转,使得各段始终出现在相同的位置。

同样,控制梯度插值的变化速率可以用于产生不同的视觉效果,例如暗示一个凹面或凸面,或产生条纹效果。

缓动函数 提供了一种通过接受输入进度值并产生相应转换输出进度值来转换这些值的方法。

缓动函数示例,产生ease-in效果。
产生ease-in效果的缓动函数示例。
给定输入进度为0.7,缓动函数将值缩放以产生输出进度0.52。
将此缓动函数应用于动画将导致其最初进展较慢,但随后逐渐加快。

1.1. 值定义

本规范使用值定义语法,来自[CSS-VALUES-3]。未在本规范中定义的值类型在 CSS 值与单位[CSS-VALUES-3]中定义。与其他 CSS 模块结合可能会扩展这些值类型的定义。

2. 缓动函数

一个缓动函数接受一个输入进度值并生成一个输出进度值

一个缓动函数必须是一个纯函数,这意味着对于给定的一组输入,它总是产生相同的输出进度值

输入进度值input progress value是一个在范围[-∞, ∞]内的实数。通常,输入进度值在范围[0, 1]内,但在缓动函数被串联在一起时,可能不是这种情况。

缓动函数串联在一起的一个示例发生在Web Animations [WEB-ANIMATIONS]中,其中指定的动画效果的缓动函数输出可能成为某个关键帧效果的缓动函数的输入。在这种情况下,关键帧效果上的缓动函数的输入可能超出范围[0, 1]。

输出进度值output progress value是一个在范围[-∞, ∞]内的实数。

某些类型的缓动函数还接受一个附加的布尔before flag输入,该输入稍后定义。

本规范定义了四种类型的缓动函数,其定义如下。

指定缓动函数的语法如下:

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

2.1. 线性缓动函数:linear

线性缓动函数linear easing function是一个恒等函数,这意味着它的输出进度值对于所有输入都等于输入进度值

线性缓动函数linear easing function的语法仅是linear关键字。

2.2. 立方 贝塞尔缓动函数: ease, ease-in, ease-out, ease-in-out, cubic-bezier()

一种立方贝塞尔 缓动函数是 一种缓动函数 ,由四个实数定义,这些实数指定了立方贝塞尔曲线的两个控制点P1P2, 其端点P0P3固定在(0, 0)和(1, 1)处。 P1P2x坐标限制在[0, 1]范围内。

A cubic Bezier curve used as an easing function.
用作缓动函数的立方贝塞尔曲线。
曲线的形状由控制点P1P2的位置决定。
输入进度值作为曲线的x值,而y值则是输出进度值。

一种立方 贝塞尔缓动函数具有以下语法 (使用[CSS-VALUES-3]中的符号):

<cubic-bezier-easing-function> = ease | ease-in | ease-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)。

上述关键字值的效果如下所示。

由关键字值产生的缓动函数。
每个立方贝塞尔缓动函数关键字值产生的缓动函数。

2.2.1. 立方贝塞尔缓动函数的输出

输入进度到输出进度的映射是通过确定给定 x 值(输出进度值)对应的 y 值来完成的(输入进度值)。这个曲线的评估在许多来源中都有覆盖,如 [FUND-COMP-GRAPHICS]

对于范围外的 输入进度值 [0, 1],曲线将无限延伸,使用最近端点的切线如下:

2.3. 阶跃缓动函数: step-start, step-end, 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> ]?)

第一个参数指定函数中的区间数量。它必须是一个大于0的正整数,除非第二个参数为jump-none,在这种情况下,它必须是一个大于1的正整数。

第二个参数(可选)使用以下值指定步骤位置

jump-start

第一次上升发生在输入进度值为0时。

jump-end

最后一次上升发生在输入进度值为1时。

jump-none

所有上升发生在范围 (0, 1) 内。

jump-both

第一次上升发生在输入进度值为0时,最后一次上升发生在输入进度值为1时。

start

表现为jump-start

end

表现为jump-end

如果省略第二个参数,则假定值为end

这些值在下方示例中有所说明:

示例阶跃缓动函数。
示例阶跃缓动函数。

2.3.1. 阶跃缓动函数的输出

在阶跃发生的确切点,函数的结果概念上是阶跃的顶部。然而,作为输入传递给阶跃缓动函数的附加前标志如果为真,将导致函数的结果对应于阶跃点的底部。

作为前标志如何影响此函数行为的示例, 考虑一个具有阶跃缓动函数的动画,其阶跃位置开始并具有正延迟和向后填充。

例如,使用CSS动画:

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

在延迟阶段,输入进度值将为零,但如果前标志被设置以指示动画尚未到达其 动画区间,则缓动函数将产生零作为其输出进度值,即第一步的底部。

在动画区间开始的确切时刻,输入进度值仍然为零,但前标志将未设置,因此 缓动函数的结果将对应于第一步的顶部。

在计算输出进度值时,阶跃位置 开始被视为等同于跳跃开始。 同样结束被视为等同于跳跃结束。 因此,以下算法未明确提及开始结束

注意:用户代理仍然必须区分跳跃开始开始以便进行序列化(见§ 2.4 序列化)。

输出进度值是根据输入进度值前标志如下计算的:

  1. 计算当前步骤floor(输入进度值 × 步骤)

  2. 如果阶跃位置 属性为以下之一:

    当前步骤增加1。

  3. 如果两个以下条件均为真:

    当前步骤减少1。

  4. 如果输入进度值 ≥ 0 且 当前步骤 < 0, 让当前步骤为零。

  5. 根据阶跃位置计算跳跃如下:

    跳跃开始跳跃结束

    跳跃当前步骤

    跳跃两者

    跳跃当前步骤 + 1。

  6. 如果输入进度值 ≤ 1 且 当前步骤 > 跳跃,则让当前步骤等于跳跃

    此过程中的步骤 4 和 6 确保对于范围在 [0, 1] 内的 输入进度值,阶跃缓动函数不会产生超出该范围的 输出进度值

    例如,尽管从数学上我们可能预期,具有阶跃位置跳跃开始的阶跃缓动函数将在输入进度值为 1 时向上跳跃(即超过 1), 但直观上,当我们将这样的缓动函数应用于向前填充的动画时,我们期望它在动画向前填充时产生的输出进度值为 1。

    类似的情况出现在具有阶跃位置跳跃结束的阶跃缓动函数在动画的延迟阶段时。

  7. 输出进度值当前步骤 / 跳跃

2.4. 序列化

缓动函数使用[CSSOM]中定义的通用序列化模式进行序列化,并附加以下要求:

3. 隐私和安全考虑

本规范并未直接向Web平台引入任何新功能,而是提供了可供其他规范引用的共同定义。 因此,它并未引入任何新的隐私和安全问题。

引用本规范中定义的特性的规范应考虑到,尽管缓动函数通常接受范围为[0,1]的输入进度值, 并产生范围为[0, 1]的输出进度值, 但情况并不总是如此。 应用缓动函数时,应定义输入和输出超出该范围时的行为, 以确保不会引入新的安全考虑。

4. 变更

2019年4月30日候选推荐版本以来,已进行以下更改:

5. 致谢

本规范基于CSS过渡规范, 编辑者为L. David Baron、Dean Jackson、David Hyatt和Chris Marrin。 编辑者还要感谢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]

本规范中的示例以“例如”开头,或用class="example"与规范性文本区分开,示例如下:

这是一个信息性示例。

信息性注释以“注意”开头,并用class="note"与规范性文本区分开,示例如下:

注意,这是一个信息性注释。

建议是规范性部分,样式上旨在引起特别注意,并用<strong class="advisement">与其他规范性文本区分开,示例如下: 用户代理必须提供可访问的替代方案。

符合性类别

本规范的符合性定义了三个符合性类别:

样式表
一个CSS样式表
渲染器
一个用户代理,解释样式表的语义并渲染使用它们的文档。
创作工具
一个用户代理,编写样式表。

如果样式表中使用本模块定义的语法的所有声明根据通用CSS语法和本模块中定义的每个特性的单独语法都是有效的,则该样式表符合本规范。

如果渲染器除了按照适当的规范解释样式表外,支持本规范定义的所有特性,并能正确解析和渲染文档,则该渲染器符合本规范。然而,由于设备限制,用户代理无法正确渲染文档并不使其不符合规范。(例如,用户代理不需要在单色显示器上渲染颜色。)

如果创作工具编写的样式表在通用CSS语法和本模块中每个特性的单独语法方面是语法正确的,并满足本模块中描述的样式表的所有其他符合性要求,则该创作工具符合本规范。

部分实现

为了让作者利用向前兼容的解析规则来分配回退值,CSS渲染器必须将任何没有可用支持级别的@规则、属性、属性值、关键字和其他语法结构视为无效(并适当忽略)。特别是,用户代理不得选择性地忽略不支持的组件值,并在单个多值属性声明中尊重支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS要求忽略整个声明。

不稳定和专有特性的实现

为了避免与未来稳定CSS特性发生冲突,CSS工作组建议遵循最佳实践,以实现不稳定特性和专有扩展

非实验性实现

一旦规范达到候选推荐阶段,可以进行非实验性实现,实施者应发布任何可以证明根据规范正确实现的CR级特性的未加前缀实现。

为了建立和维护CSS在实现之间的互操作性,CSS工作组请求非实验性CSS渲染器在发布任何CSS特性的未加前缀实现之前向W3C提交实现报告(如有必要,还需提交用于该实现报告的测试用例)。提交给W3C的测试用例将由CSS工作组审查和修正。

有关提交测试用例和实现报告的更多信息,请访问CSS工作组的网站https://www.w3.org/Style/CSS/Test/。 有关问题应发送至public-css-testsuite@w3.org邮件列表。

CR退出标准

为了使本规范晋升为提议推荐,必须对每个特性至少有两个独立的、互操作的实现。每个特性可以由不同的产品集实现,不要求所有特性由单一产品实现。为了满足此标准,我们定义以下术语:

独立
每个实现必须由不同方开发,不能共享、重用或源自另一合格实现使用的代码。与本规范的实现无关的代码部分不受此要求限制。
互操作
通过官方CSS测试套件中的相应测试用例,或者如果实现不是Web浏览器,则通过等效测试。所有相关测试在测试套件中应有等效测试创建,如果此类用户代理(UA)被用来声称互操作性。此外,如果此类UA被用来声称互操作性,则必须有一个或多个其他UA也能够以相同方式通过这些等效测试,以实现互操作性。等效测试必须公开,以便进行同行评审。
实现
一个用户代理:
  1. 实现规范。
  2. 对公众开放。实现可以是已发货的产品或其他公开可用的版本(即,测试版、预览版或“夜间构建”)。非已发货产品版本必须实施特性至少一个月,以展示稳定性。
  3. 不是实验性的(即,专门设计用于通过测试套件的版本,不打算用于未来的正常使用)。

本规范将保持候选推荐状态至少六个月。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 3 级。2022 年 12 月 1 日。CR。网址:https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 4 级。2022 年 10 月 19 日。WD。网址:https://www.w3.org/TR/css-values-4/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词。1997 年 3 月。最佳现行实践。网址:https://datatracker.ietf.org/doc/html/rfc2119

信息性参考

[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS 对象模型 (CSSOM)。2021 年 8 月 26 日。WD。网址:https://www.w3.org/TR/cssom-1/
[FUND-COMP-GRAPHICS]
Peter Shirley; Michael Ashikhmin; Steve Marschner. 计算机图形学基础。2009 年。
[WEB-ANIMATIONS]
Brian Birtles; 等。 网页动画。2022 年 9 月 8 日。WD。网址:https://www.w3.org/TR/web-animations-1/