CSS 过渡级别 2

W3C 首次公开工作草案,

更多关于此文档的详细信息
此版本:
https://www.w3.org/TR/2023/WD-css-transitions-2-20230905/
最新发布版本:
https://www.w3.org/TR/css-transitions-2/
编辑草案:
https://drafts.csswg.org/css-transitions-2/
历史记录:
https://www.w3.org/standards/history/css-transitions-2
反馈:
CSSWG 问题存储库
所有级别的 Bugzilla 错误
规范中的内联问题
编辑:
L. David Baron (谷歌)
(特邀专家)
建议对本规范进行编辑:
GitHub 编辑器

摘要

CSS 过渡允许 CSS 值的属性更改在指定的持续时间内平滑地进行。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等上呈现的语言。

此文档的状态

本节描述了本文档在发布时的状态。 当前 W3C 出版物列表 和此技术报告的最新修订版 可在 W3C 技术报告索引 https://www.w3.org/TR/. 中找到。

此文档由 CSS 工作组 作为首次公开工作草案 使用 推荐 路线 发布。 作为首次公开工作草案发布 并不意味着得到了 W3C 及其成员的认可。

这是一个草案文件, 可能会随时由其他文档更新、替换 或废弃。 除非作为正在进行的工作,否则引用此文档是不合适的。

请通过 在 GitHub 上提交问题(首选)来提供反馈, 在标题中包含规范代码“css-transitions”,如下所示: “[css-transitions] …评论摘要…”。 所有问题和评论都将 存档。 或者,反馈可以发送到 (存档) 公共邮件列表 www-style@w3.org

此文档受 2023 年 6 月 12 日 W3C 过程文档 管辖。

本文件由根据 W3C 专利政策 运营的小组制定。 W3C 维护着与该小组的交付物相关的任何专利披露的公共列表; 该页面还包括披露专利的说明。 个人如果知道某项专利,并认为该专利包含 必要声明,则必须按照W3C 专利政策第 6 节披露信息。

1. Delta 规范

这是一个 Delta 规范,意味着它目前仅包含与 CSS Transitions Level 1 [CSS-TRANSITIONS-1] 的不同之处。 一旦 Level 1 规范接近完成,它将与这里的添加内容合并为完整的第 2 级规范。

2. 过渡

2.1. transition-property 属性

CSS Transitions § 2.1 transition-property 属性 插入文本并向后移植以下段落。

尽管 transition-property 可以指定简写属性并且可以使用 all 关键字,但会为每个可过渡的长格式子属性生成单独的过渡。过渡的 扩展过渡属性名称 是为其生成过渡的长格式子属性的名称(例如 border-left-width)。

一旦从第 1 级移植,更新 transitionable 的定义实例。

在 CSS Transitions Level 2 中,当比较给定属性的 变更前样式变更后样式 时,属性值是 可过渡的 如果:

  1. 它们具有既非 不可动画 也非 离散动画类型,或
  2. transition-behaviorallow-discrete 并且它们具有 动画类型,且该类型为 离散

注意: 当具有 离散 动画类型 的值过渡时,它们会在进度达到 50% 时翻转。

2.2. transition-duration 属性

transition-duration 属性指定过渡关联的 迭代持续时间

2.3. transition-timing-function 属性

transition-timing-function 属性指定过渡关联的 时间函数(请参阅 Web Animations § 4.10 时间变换)。

注意: 与 CSS 动画不同,CSS 过渡的时间函数应用于动画效果而非单个关键帧,因为这允许它在计算反转缩短因子时反映在变换进度中。

2.4. transition-delay 属性

transition-delay 属性指定过渡关联的 开始延迟

2.5. transition-behavior 属性

transition-behavior 属性指定是否为离散属性启动过渡。

名称: transition-behavior
值: <transition-behavior-value>#
初始值: normal
适用于: 所有元素
继承:
百分比: 不适用
计算值: 按指定
规范顺序: 按语法
动画类型: 不可动画

指定 transition-behavior 的语法如下:

<transition-behavior-value> = normal | allow-discrete

当指定为 normal 时,过渡将不会为离散属性启动,只会为可插值属性启动。当指定为 allow-discrete 时,过渡将为离散属性和可插值属性启动。

2.6. transition 简写属性

指定 transition 简写项的语法如下:

<single-transition> = [ none | <single-transition-property> ] || <time> || <easing-function> || <time> || <transition-behavior-value>

3. 过渡的开始

过渡的 拥有元素 是指应用了 transition-property 属性并生成动画的元素或伪元素。 过渡可能会与其 拥有元素 解除关联,以至于它没有 拥有元素

正在运行的过渡 集合只包括那些有 拥有元素 的过渡。

每当需要实现 取消 过渡时, 它必须将过渡与其 拥有元素 解除关联,并按照 取消动画 的过程取消该过渡。

虽然在本规范第 1 级中未明确定义, 但除了取消不再 连接 的元素上的过渡外, 实现还必须取消所有不再 渲染 的元素上的正在运行的过渡,并将它们从 已完成过渡 集合中移除。

请注意,调用表示 正在运行的过渡cancel() 方法并不会导致该过渡与其 拥有元素 解除关联。

3.1. 更快地反转中断的过渡

为了产生正确的反转行为,过渡的 反转缩短因子反转调整的起始值 是与过渡本身相关的,而不是与其 动画效果 相关的。 因此,即使过渡的关联 动画效果 已使用 Web Animations API [WEB-ANIMATIONS] 进行更新或替换,过渡仍将使用这些相同的值来生成反向过渡。

3.2. 当前过渡生成

与每个顶级浏览上下文相关联的是一个 当前过渡生成,在每次 样式更改事件 时递增。

每次生成新的过渡时,当前(已递增的)当前过渡生成 的值将存储为过渡的 过渡生成

3.3. 定义 变更前样式@starting-style 规则

在本规范第 1 级中,过渡只能在元素具有由先前 样式更改事件 确定的变更前样式 的情况下开始。这意味着无法在之前的 样式更改事件 中未被渲染的元素上启动过渡(请参见:CSS 过渡 § 3 过渡的开始)。

在某些情况下,有必要在新插入的元素或从未被渲染到被渲染的元素上启动过渡。为此,本规范引入了 @starting-style

@starting-style 规则是一个分组规则。内部的样式规则用于确定要过渡的样式,如果之前的 样式更改事件 未为正在计算样式的元素建立 变更前样式

注意: 这意味着 @starting-style 规则仅适用于某些元素在计算样式更新期间,即那些在之前的 样式更改事件 中未渲染或不属于 DOM 的元素。

定义起始样式 为元素的变更后样式,并额外应用@starting-style规则。如果某元素对于某个样式变更事件没有变更前样式,则使用起始样式代替变更前样式,与变更后样式进行比较以启动过渡 (CSS Transitions § 3 过渡的开始)。

@starting-style 中的规则像其他分组样式规则一样级联,不会在级联中引入任何新顺序,这意味着 @starting-style 中的规则不一定会胜过外部规则。

@starting-style 中的样式规则不适用于 变更后样式。 因此,在 @starting-style 中存在匹配规则的情况下,可能会在本来无法过渡的元素上发生过渡,因为它们缺少 变更前样式

起始样式变更后样式 一样继承自父元素的 变更后样式

h1 元素的 background-color 可以在初次渲染时从透明过渡为绿色:

h1 {
  transition: background-color 1.5s;
  background-color: green;
}
@starting-style {
  h1 {
    background-color: transparent;
  }
}

可以使用 CSS 嵌套编写条件规则:

h1 {
  transition: background-color 1.5s;
  background-color: green;
  @starting-style {
    background-color: transparent;
  }
}
当元素的显示状态发生变化时,可以过渡 opacity
#target {
  transition-property: opacity, display;
  transition-duration: 0.5s;
  display: block;
  opacity: 1;
  @starting-style {
    opacity: 0;
  }
}
#target.hidden {
  display: none;
  opacity: 0;
}

在从 display:block 翻转到 display:none 之前,display 过渡允许进行 opacity 过渡。

opacity: 0 中指定的 @starting-style 规则表示,当元素插入树中或当 hidden 类翻转 displaynone 变为 block 时,元素的 opacity 将从 0 过渡为 1,因为目标元素在这些情况下并没有现成的 变更前样式

#target.hidden 规则中指定的 opacity: 0 会使当 hidden 类添加时,opacity1 过渡为 0

全局的、定义名称的 @ 规则,如 @keyframes@font-face@layer,可以在 @starting-style 中使用,并且它们的行为就像位于 @starting-style 之外一样。

3.3.1. CSSStartingStyleRule 接口

CSSStartingStyleRule 接口表示 @starting-style 规则。

[Exposed=Window]
interface CSSStartingStyleRule : CSSGroupingRule {
};

4. 过渡的应用

4.1. 动画的合成顺序

根据本规范定义的标记生成的 动画 具有‘CSS 过渡’的 动画类

CSS 过渡的合成顺序 早于 CSS 动画和没有特定 动画类 的动画。

在 CSS 过渡集中,两个动画 AB 的合成顺序(从先到后)按以下规则排序:

  1. 如果 AB 都没有 拥有元素, 则根据它们在 全局动画列表中的相对位置排序。

  2. 否则,如果 AB 中只有一个有 拥有元素,则让有 拥有元素 的动画排在前面。

  3. 否则,如果 AB拥有元素 不同,则根据其对应的 拥有元素树顺序AB 进行排序。 对于伪元素,排序顺序如下:

    • 元素

    • ::marker

    • ::before

    • 其他未在此列表中特别提及的伪元素,按组成每个选择器的 Unicode 代码点升序排序

    • ::after

    • 元素子项

  4. 否则,如果 AB过渡生成 值不同,则按其对应的 过渡生成 升序排序。

  5. 否则,按组成每个过渡的 扩展过渡属性名称 的 Unicode 代码点升序排序(即不尝试进行大小写转换,并且‘-moz-column-width’ 排在‘column-width’之前)。

使用本规范定义的标记生成的过渡在创建时不会被添加到 全局动画列表中。 相反,这些动画在与其 拥有元素 解除关联后,在首次退出 空闲播放状态 时才会被附加到 全局动画列表。 与其 拥有元素 解除关联但仍处于 空闲 状态的过渡没有定义的合成顺序。

注意,此行为依赖于将过渡与其 拥有元素 解除关联始终会使其进入(或保持在)空闲播放状态

4.2. 动画的层叠级别

具有‘CSS 过渡’ 动画类 并拥有 拥有元素 的动画 应用在 CSS 层叠中的‘过渡声明’级别。 所有其他由本规范定义的标记生成的动画,包括不再具有 拥有元素 的动画, 应用在层叠的‘动画声明’级别。 (参见 Web Animations § 5.4.5 合成结果的应用。)

5. 过渡事件

5.1. 事件分派

注意,这一部分比 CSS Transitions Level 1 [CSS-TRANSITIONS-1] 中的事件分派更通用,因为它必须考虑使用 Web Animations API [WEB-ANIMATIONS] 时动画的定位或反转的可能性。此外,通过 Web Animations API, 可以用完全不同的效果(例如重复多次的效果)替代过渡效果,因此该部分提供了适应 Web Animations 模型复杂性的通用定义。

过渡事件的 目标 是过渡的 拥有元素。 如果没有 拥有元素,则不会分派过渡事件 (但在 Web Animations 中定义的 动画播放事件 仍然会在相应的 CSSTransition 对象上分派)。

为了避免触发冗余事件,分派的事件集是基于比较过渡在之前的 动画帧 和当前状态的 阶段 来确定的。

过渡的 过渡阶段 初始为“空闲”状态, 并在每个 动画帧 更新,依据以下第一个匹配条件:

如果过渡没有 关联效果
过渡阶段根据以下第一个匹配条件设置:
如果过渡具有 未解析的 当前时间
过渡阶段为“空闲”。
如果过渡的 当前时间 < 0,
过渡阶段为“之前”。
否则,
过渡阶段为“之后”。
如果过渡有 待播放任务待暂停任务,并且其阶段先前为“空闲”或“待处理”,
过渡阶段为“待处理”。
否则,
过渡阶段为其 关联效果的阶段

为了计算每个事件的 elapsedTime,使用以下定义:

在上述公式中,引用的 开始延迟活动持续时间当前迭代迭代开始迭代持续时间 应理解为引用过渡的 关联效果 的相应属性。

每次建立新的 动画帧 时, 通过比较前一帧和当前帧的 过渡阶段 确定要分派的事件:

状态变化 分派的事件 经过时间 (毫秒)
空闲 → 待处理或之前 transitionrun 区间开始
空闲 → 活跃 ٭ transitionrun 区间开始
transitionstart
空闲 → 之后 ٭ transitionrun 区间开始
transitionstart
transitionend 区间结束
待处理或之前 → 活跃 transitionstart 区间开始
待处理或之前 → 之后 ٭ transitionstart 区间开始
transitionend 区间结束
活跃 → 之后 transitionend 区间结束
活跃 → 之前 transitionend 区间开始
之后 → 活跃 transitionstart 区间结束
之后 → 之前 ٭ transitionstart 区间结束
transitionend 区间开始
不是空闲且不是之后 → 空闲 transitioncancel 动画在取消时的 活动时间,计算时使用了填充模式

٭ 当多个事件被列为状态变化时,所有事件都会按列出的顺序立即依次分派。

由于上表和上述过程中定义的elapsed time是以毫秒为单位表示的,因此必须除以 1,000 才能生成秒值,然后将其分配给elapsedTime成员 TransitionEvent

上述状态转换图确保,除暂停或具有无限运行时间的过渡外,以下不变量成立:

典型的事件序列如下:

6. DOM接口

6.1. CSSTransition接口

[Exposed=Window]
interface CSSTransition : Animation {
  readonly attribute CSSOMString transitionProperty;
};
transitionProperty, 类型为CSSOMString,只读

该过渡的扩展过渡属性名称

6.2. 挂起样式更改的要求

各种操作可能会影响元素属性的计算值。用户代理可能出于优化目的,延迟重新计算这些值,直到有必要时才进行。 然而,所有包括在此规范定义的编程接口中的操作,以及Web Animations定义的那些可能返回由此规范定义的对象的操作[WEB-ANIMATIONS],必须产生与完全处理任何此类挂起的计算值更改一致的结果。

例如,在以下代码片段中,当更新elemopacity属性的指定值时,用户代理可能会延迟重新计算opacity属性的计算值。

当首次发生这种情况时,调用getComputedStyle(elt)并随后访问结果的opacity属性将导致用户代理重新计算opacity的值。

在第二次更新opacity属性后,调用getAnimations()方法。 此方法由Web Animations规范定义,并且可以返回由此规范定义的CSSTransition对象。 因此,根据本节的要求,用户代理必须应用任何挂起的样式更改,从而在返回结果之前为opacity属性生成新的CSSTransition

elem.style.transition = 'opacity 100s';
elem.style.opacity = '0';
window.getComputedStyle(elem).opacity; // 0
elem.style.opacity = '1';
elem.getAnimations()[0].transitionProperty // 'opacity'

7. 隐私考虑

在本规范中没有报告新的隐私考虑。

8. 安全考虑

在本规范中没有报告新的安全考虑。

9. 变更

9.1. 自第一级别以来的变更,在首次公开工作草案中

10. 常见的前几级规范中的问题

这些问题是前几级规范中常见的问题。

开发者常常希望有更强大的时间函数语法。例如:2013年的消息2015年的讨论

开发者经常需要触发样式刷新以强制过渡开始。最好有一个API可以避免这种需求。例如,参见2011年提案

11. 前几级规范中推迟的问题

这些问题出现在前几级规范中,但在本级规范中可能也不会变得重要。

我们最终可能希望为transition-property属性支持键路径语法。键路径语法可以使属性的不同组件指定不同的过渡。例如,阴影的模糊度可以与阴影的颜色有不同的过渡。

符合性

文档约定

符合性要求通过描述性断言和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"> 样式强调,如下所示:用户代理必须(MUST)提供可访问的替代方案。

符合性类别

本规范的符合性定义有三种类别:

样式表
CSS样式表
渲染器
用户代理(UA),解释样式表的语义并渲染使用它们的文档。
编辑工具
用户代理(UA),用于编写样式表。

如果样式表的所有语法符合通用CSS语法和本模块定义的每个特性的具体语法,则该样式表符合本规范。

如果渲染器除了解析样式表,还能正确解释本规范定义的所有功能并相应地渲染文档,则该渲染器符合本规范。然而,如果由于设备限制而无法正确渲染文档,不会导致UA不符合规范。(例如,UA不需要在单色显示器上渲染颜色。)

如果编辑工具编写的样式表语法正确,并符合通用CSS语法及本模块中每个特性的个别语法,并满足本模块描述的所有符合性要求,则该编辑工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则指定回退值,CSS渲染器必须将任何其不支持的@规则、属性、属性值、关键字和其他语法结构视为无效,并忽略它们。特别是,用户代理不得在单个多值属性声明中选择性忽略不支持的组件值并保留支持的值:如果任何值被认为是无效的(如不支持的值必须被视为),CSS要求整个声明被忽略。

不稳定和专有功能的实现

为了避免与未来稳定的CSS功能发生冲突,CSSWG建议遵循最佳实践来实现不稳定的功能和专有扩展

非实验性实现

一旦规范进入候选推荐阶段,非实验性实现是可能的,并且实现者应发布任何他们能够根据规范正确实现的CR级功能的无前缀实现。

为了建立和维护CSS在各实现中的互操作性,CSS工作组请求非实验性CSS渲染器在发布任何CSS功能的无前缀实现之前,向W3C提交实施报告(如果需要,还包括实施报告中使用的测试用例)。提交给W3C的测试用例需经过CSS工作组的审核和修正。

有关提交测试用例和实施报告的更多信息,请访问CSS工作组网站 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-BACKGROUNDS-3]
Bert Bos, Elika Etemad, Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-5]
Elika Etemad, Miriam Suzanne, Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[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-FONTS-5]
Myles Maxfield, Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-TRANSITIONS-1]
David Baron 等. CSS Transitions. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-4]
Tab Atkins Jr., Elika Etemad. CSS Values and Units Module Level 4. 2023年4月6日. 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. 现行标准. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren 等. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳现行做法. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEB-ANIMATIONS]
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. 现行标准. URL: https://webidl.spec.whatwg.org/

参考性参考文献

[CSS-COLOR-4]
Tab Atkins Jr., Chris Lilley, Lea Verou. CSS Color Module Level 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Elika Etemad, Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[WEB-ANIMATIONS-2]
Brian Birtles, Robert Flack. Web Animations Level 2. 2023年2月21日. WD. URL: https://www.w3.org/TR/web-animations-2/

属性索引

名称 初始值 适用于 继承 百分比 动画类型 语法顺序 计算值
transition-behavior <transition-behavior-value># normal 所有元素 不适用 不可动画 符合语法 按指定

IDL索引

[Exposed=Window]
interface CSSStartingStyleRule : CSSGroupingRule {
};

[Exposed=Window]
interface CSSTransition : Animation {
  readonly attribute CSSOMString transitionProperty;
};

问题索引

插入文本来自 CSS Transitions § 2.1 The transition-property Property 并回传以下段落。
一旦从第1级移植,更新transitionable的定义实例。

更强大的时间函数语法 是开发人员常见的请求。 请参见,例如:2013年消息2015年线程

开发人员经常需要触发样式刷新 以强制启动过渡。 最好有一个API 来避免这个要求。 请参见,例如,2011年提议

我们可能最终想要支持一种键路径语法 用于 transition-property 属性。 键路径语法 将允许为属性的组件 指定不同的过渡。 例如 阴影的模糊度 可以有 不同于阴影颜色的过渡。