1. 差异规范
这是一个差异规范,这意味着目前仅包含与 Web Animations Level 1 [WEB-ANIMATIONS-1] 的不同之处。当第一级规范接近完成时,将会把这里的新增内容与其合并,形成完整的第二级规范。
2. 时间模型
本节描述并定义了 Web Animations 时间模型的行为。
2.1. 时间模型概述
本节为非规范性内容
2.1.1. 分层结构
本级规范包含了更新后的时间层级结构示意图。
以及以下更新描述:
这种分层结构带来的结果是,复杂的动画可以作为一个整体被反转、调度、加速等,因为对父节点的操作会层叠到其后代上。此外,由于时间有共同的来源,动画的同步也变得很容易。
2.2. 时间线
新增:
时间线时长 指的是时间线可以为其当前时间生成的最大值。此值用于计算与该时间线关联的动画目标效果的固有迭代时长,当该效果的迭代时长为 "auto" 时。该值的计算方式是让效果填满可用时间。对于单调递增的时间线,当前时间没有上限,时间线时长为未定。对于非单调的(例如滚动)时间线,时长有固定的上限。在这种情况下,该时间线是基于进度的时间线,其 时间线时长 为 100%。
2.3. 动画帧
为算法第一步的说明更新,添加如下内容:
2.4. 动画
附加:
与基于进度的时间线关联的动画效果需要将其时间属性转换为比例。将的过程如下:
如果迭代时长为 auto,执行以下步骤。
否则:
将规格化指定的计时的过程如下:
如果时间线时长已确定:
否则:
遵循将基于时间的动画转换为比例动画的过程。
2.4.1. 设置动画的时间线
将设定动画的时间线 animation 为 new timeline,可能为 null 的过程如下:
-
令 old timeline 为 animation 当前的时间线(如果有)。
-
如果 new timeline 与 old timeline 为同一对象,则终止此过程。
-
令 previous play state 为 animation 的播放状态。
-
令 previous current time 为 animation 的当前时间。
-
根据以下条件设置 previous progress:
-
当old timeline 非 null 且非单调递增时,from finite timeline 为 true。
-
当 timeline 非 null 且非单调递增时,to finite timeline 为 true。
-
将 animation 的时间线设为 new timeline。
-
按下列首个匹配条件执行步骤:
- 如果 to finite timeline
-
-
对 animation应用所有待处理播放速率
-
令 auto align start time 为 true。
-
将起始时间设为未定。
-
将保持时间设为未定。
-
如果previous play state为"finished"或"running"
-
安排一个待播放任务
-
-
如果previous play state为"paused"且previous progress已定:
此步骤确保即使是处于待暂停状态且起始时间已定的动画,previous progress也能被保留。
-
- 如果from finite timeline且previous progress已定,
-
以 did seek 标记为 false,synchronously notify 标记为 false,运行更新动画完成状态过程。
2.4.2. 设置动画的目标效果
在重新安排待播放任务的步骤后,添加以下步骤:
在将new effect赋为animation的关联效果后,补充以下步骤:
2.4.3. 等待关联效果
替换:
动画在以下两个条件均成立的最早时刻准备就绪:
修改为:
动画在以下所有条件均成立的最早时刻准备就绪:
注意: 没有起始时间或保持时间时动画并不准备就绪。对于滚动驱动动画,如果 auto align start time 为 true,则会在更新时间线时确定起始时间。
2.4.4. 校验 CSSNumberish 时间值
用于输入值 time 的校验 CSSNumberish 时间值的过程,基于首个匹配条件如下:
-
如果全部如下条件为真:
-
动画关联于基于进度的时间线,并且
-
time不是带百分比单位的 CSSNumeric 值:
-
-
抛出 TypeError。
返回 false;
-
如果全部如下条件为真:
-
抛出 TypeError。
返回 false。
- 否则
-
返回 true。
2.4.5. 设置 Animation 的当前时间
动画的当前时间可以被设置为新值,从而定位(seek)动画。设置当前时间的流程分为两部分。
静默设置当前时间的过程如下,将动画 animation 的当前时间设为 seek time:
-
如果 seek time 是未定时间值,则执行以下步骤。
-
令 valid seek time 为以 seek time 作为输入,执行校验 CSSNumberish 时间值过程的结果。
-
如果 valid seek time 为 false,则终止此过程。
-
设置 auto align start time 为 false。
设置当前时间的过程如下,将动画 animation 的当前时间设为 seek time:
-
执行静默设置当前时间过程,将 animation 的当前时间设置为 seek time。
-
如果 animation 存在待暂停任务,则同步完成暂停操作,执行下列步骤:
-
将animation的保持时间设为seek time。
-
对animation应用所有待处理播放速率。
-
取消待暂停任务。
-
解决 animation 的当前 ready promise,传入 animation。
-
-
以 did seek 标志为 true,synchronously notify 标志为 false,执行更新动画完成状态过程。
2.4.6. 设置 Animation 的起始时间
将animation的起始时间设置为 new start time 的设置起始时间过程如下:
-
令 valid start time 为以 new start time 为输入,执行校验 CSSNumberish 时间值过程的结果。
-
如果 valid start time 为 false,则终止此过程。
-
设置 auto align start time 为 false。
-
令 timeline time 为 animation 关联时间线的当前时间值。如果animation 没有关联的 时间线 或时间线不活动(inactive),则设timeline time为未定。
-
如果 timeline time 为未定 并且 new start time 为 已定,将 animation 的保持时间设为 未定。
-
令 previous current time 为 animation 的当前时间。
-
对animation应用所有待处理播放速率。
-
将animation的起始时间设为new start time。
-
根据如下首个匹配条件,更新 animation 的 保持时间:
-
如果animation有待播放任务或待暂停任务,则取消该任务并解决 animation 的当前 ready promise,传入 animation。
-
以 did seek 标志为 true,synchronously notify 标志为 false,执行更新动画完成状态过程。
2.4.7. 播放动画
播放动画 animation 的过程,以及传入的 auto-rewind 标志如下:
注意:auto-rewind 标志用于基于该模型但不要求回退行为的其他规范,如 CSS Animations [CSS-ANIMATIONS-1]。
-
令 aborted pause 为布尔 flag,当 animation 有待暂停任务为 true,否则为 false。
-
令 has pending ready promise 为布尔标志,初始为 false。
-
令 previous current time 为 animation 的当前时间。
-
如果 auto-rewind 为 true 且 has finite timeline 为 false,则 enable seek 为 true,否则初始为 false。
-
执行下列首次匹配的条件:
-
如果 animation 的有效播放速率 > 0,且 enable seek 为 true,且满足下列任一:
-
将 animation 的保持时间设为 0。
-
如果 animation 的有效播放速率 < 0,enable seek 为 true,且满足下列任一:
-
- 关联效果结束为正无穷
-
抛出 "
InvalidStateError"DOMException并终止本步骤。 - 否则,
-
将 animation 的保持时间设为 0。
-
-
如果 has finite timeline,并且 previous current time 是未定:
-
将 auto align start time 标志设为 true。
注意: 如果在样式更新期间调用 play(如 CSS 动画),则动画 起始时间在布局后才能可靠计算,因为起始时间需与动画区间的开始或结束对齐(依据播放速率)。此时动画称为具有自动对齐起始时间,即动画起始时间会自动调整,使动画进度对齐到动画区间。
-
-
-
取消该任务。
-
将 has pending ready promise 设为 true。
-
-
如果下列三条件均成立:
终止本过程。
-
如果 has pending ready promise 为 false,将 animation 的当前 ready promise 设为新的 promise,位于 animation 的相关 Realm。
-
调度一个任务,当 animation 准备就绪 时执行。该任务将执行以下步骤:
-
执行下列首个匹配条件:
-
解决 animation 的当前 ready promise,传入 animation。
-
对 animation 以 did seek 标志为 false,synchronously notify 标志为 false,运行更新动画完成状态过程。
只要上述任务被调度但尚未执行时,animation被描述为有待播放任务。而当该任务正在运行时,animation则没有待播放任务。
如果用户代理确定 animation 立即准备就绪,则可以将上述任务调度为微任务,使其在下一个微任务检查点执行,但不得同步执行该任务。
上述要求异步处理待播放任务,确保如下代码在各实现中行为一致:
animation
. play(); animation. ready. then( () => { console. log( 'Playback commenced' ); }, () => { console. log( 'Playback was canceled' ); } ); // Suppose some condition requires playback to be canceled... animation. cancel(); // "Playback was canceled" will be printed to the console. 如上所示,如果待播放任务是同步执行,则当前 ready promise将不会被拒绝。
-
以 did seek 标志为 false,synchronously notify 标志为 false,运行更新动画完成状态过程。
2.4.7.1. 自动对齐起始时间
当附加到非单调时间线时,动画的起始时间可能依赖于布局。在这种情况下,我们会推迟起始时间的计算直到时间线在布局后更新。当更新时间线当前时间时,任意附加动画的起始时间会被有条件地更新。计算自动对齐起始时间的过程如下:
-
如果 auto-align start time 标志为 false,则终止本过程。
-
如果时间线不活动,则终止本过程。
-
如果播放状态为 idle,则终止本过程。
-
令 start offset 为动画附加区间开始所对应的已定时间线时间。对于视图时间线(view timeline),需要基于覆盖区间比例进行计算。
-
令 end offset 为动画附加区间结束所对应的已定时间线时间。对于视图时间线,需要基于覆盖区间比例进行计算。
-
清除保持时间。
2.4.8. 暂停动画
暂停动画的过程不仅需要涉及关联效果,还需要涉及关联效果的所有后代。
同样,暂停动画的过程也需要包含调度用于更新自定义效果的任务。更新设置 seek time 的约束,使其只在使用单调时间线时适用。滚动驱动动画需要等到动画区间计算完毕后再设置保持时间。
替换:
改为:
如果 animation 的当前时间为未定且 has finite timeline 为 false,则按下列首个匹配条件执行:
- 如果 animation 的播放速率 ≥ 0,
将保持时间设为0。
- 否则,
- 如果 关联效果结束为正无穷,
抛出 "
InvalidStateError"DOMException并终止。- 否则,
如果 has finite timeline 为 true,且 animation 的当前时间为未定
将 auto align start time 标志设为 true。
替换:
调度一个任务,在同时满足以下两个条件的第一个时刻执行:
用户代理已完成暂停动画关联效果播放所需的任何处理(如有)。
动画已关联到非不活动时间线。
改为:
调度一个任务,在同时满足以下所有条件的第一个时刻执行:
注意:如果auto-align start time标志为 true,为了正确对齐动画区间,暂停待决动画仍然需要起始时间。起始时间需按自动对齐起始时间的过程设置。
2.4.9. 取消动画
补充最后一步:2.4.10. 速度控制
2.4.11. 计算动画整体进度
动画的overallProgress为其当前时间与关联效果结束的比值。
-
如任一条件为真:
-
animation的overallProgress为 null。
- 如果 animation 的关联效果结束为0,
-
- 如果animation的当前时间为负值,
-
animation的overallProgress为0。
- 否则,
-
animation的overallProgress为1。
- 如果animation的关联效果结束为无穷大,
-
animation的overallProgress为0。
- 否则,
-
overallProgress = min(max(current time / animation的关联效果结束, 0), 1)
2.5. 动画效果
加入如下内容:
动画效果可以通过分组效果组合为层级结构(见§ 2.10 分组与同步)。只有这种层级结构中的根动画效果可以直接关联到动画。如果一个具有父组的动画效果被指定为动画的关联效果,该动画效果会先从其父组移除,再与动画关联。
2.5.1. 动画效果的类型
本规范定义了两种动画效果:
2.5.2. 活动区间
在本级规范中,活动区间下界定义为:
下图也应提及动画效果起始时间而非动画起始时间。
最后,结束延迟的描述更新为:
规范性描述更新如下:
动画效果的起始时间是父组(如有)调度动画效果开始的时刻,以继承时间表示。
大多数情况下,包括动画效果没有父组时,起始时间为0。唯一例外是序列效果会如§ 2.10.4.1 序列效果子项的起始时间描述为其子项设定起始时间。
除起始时间外,动画效果还拥有起始延迟,即相对于起始时间的偏移。
某动画效果的活动区间下界(以继承时间空间表示)为其起始时间与起始延迟之和。
这些定义被用于本地时间(参见§ 2.5.3 本地时间和继承时间)与活动时间的计算。
最后,结束时间定义如下:
2.5.3. 本地时间与继承时间
本节为新增内容。
在 Web Animations 中,所有时间都是相对于某个参考点的。这些不同的参考点构成了不同的时间空间。
这可以类比于计算机图形学中的坐标空间。时间空间的零点类似于坐标空间的原点。
同坐标空间一样,时间空间也可以嵌套。分组效果通常会对其从父节点或动画接收到的时间值做一定的变换,再将变换后的时间值传递给子元素。子动画效果随后在这种变换后的时间空间内工作。
子对象会从父对象那里获取变换后的时间值,也就是继承时间,并加上自身的起始时间,来建立自己的本地时间空间,如下图所示。
在 t 时刻,继承时间 为 2.5。
对于动画效果 (a),起始时间为 1,则本地时间为 1.5。
对于 (b) 动画效果,起始时间为 1,起始延迟为 1,本地时间仍为 1.5,因为本地时间仅基于动画效果的起始时间而非起始延迟。
对于动画效果,某一时刻的继承时间,根据以下条件首个匹配项确定:
本地时间指动画效果的继承时间减去其起始时间。如果继承时间为未定,则本地时间也为未定。
2.5.4. 动画效果阶段与状态
关于播放中(in play)状态的非规范性描述如下:
当动画效果及其所有祖先均处于活动阶段时发生。动画效果仅在播放中时才“运动”。
动画效果可能处于活动阶段,但未处于播放中。举例:若某动画效果的父组导致当前效果的活动区间被裁剪,且父子均应用相同填充模式,则子动画效果可能即使在活动阶段内也被快照,实际已不再播放。
Current 状态同理:
播放中的规范定义增添如下条件:
动画效果有父组,且父组播放中,或该动画效果直接关联于未完成(not finished)的动画。
替换:
Current 状态规范定义增加如下条件:
补充以下定义于动画效果阶段判断条件列表:
- 处于进度时间线边界
-
判断流程如下:
若暂停动画期间明确设定动画的当前时间,上述流程不完全正确,可能导致动画当前时间与时间线当前时间出现偏差。
此流程还可简化,判断滚动边界时可忽略播放速率和起始时间。其目的是避免动画在滚动极限处变为非活动状态,无需对 ScrollTimeline 设置填充模式。直接检查时间线当前时间是否为0或时间线时长可能更合适。
替换:
若动画效果的本地时间不是未定,且满足以下任一条件,则处于前置阶段(before phase):
动画方向为 "backwards" 且本地时间等于before-active 边界时间。
改为:
若动画效果的本地时间不是未定,且满足以下任一条件,则处于前置阶段:
动画方向为 "backwards" 且本地时间等于before-active 边界时间,且不 处于进度时间线边界。
替换:
若动画效果的本地时间不是未定,且满足以下任一条件,则处于后置阶段(after phase):
动画方向为 "forwards" 且本地时间等于active-after 边界时间。
改为:
若动画效果的本地时间不是未定,且满足以下任一条件,则处于后置阶段:
动画方向为 "forwards" 且本地时间等于active-after 边界时间且不 处于进度时间线边界。
2.5.5. 填充模式
forwards 填充模式描述由:
当动画效果处于后置阶段时,……
更新为:
backwards 填充模式描述由:
当动画效果处于前置阶段时,……
更新为:
both 填充模式描述由:
当动画效果……
更新为:
当动画效果或其祖先……
(出现两次)。
为解决此问题,可能以后会引入“溢出”填充模式,以针对超出活动时间区间的时间值采用外推而非填充处理。
2.6. 重复
2.6.1. 迭代区间
补充:
单次迭代的长度称为迭代时长(iteration duration)。
新增:
2.6.2. 迭代时间空间
本节前几段替换为:
我们在描述本地时间和继承时间时(见§ 2.5.3 本地时间和继承时间)已经遇到过不同的时间空间。重复又引入了另一种时间空间:迭代时间空间。
2.6.3. 区间计时
描述更新如下:
下方示例中,对于重复的效果,在本地时间为 1s 时,迭代时间为 0。对于序列效果,在继承时间为 1s 时,只有效果 B 处于播放中;两者区间边界都没有重叠。
下方图示同样更新:
2.7. 动画效果速度控制
(本节为新增)
与动画类似,动画效果也有一个播放速率参数。动画效果的播放速率是一个有限实数,在根据本地时间计算动画效果的变换后时间时作为乘数。
为动画效果设置播放速率,与为动画设置播放速率的效果不同。详细行为见§ 2.8 动画效果核心计算。
总结如下,动画效果的播放速率行为:
2.8. 动画效果核心计算
2.8.1. 概述
描述由:
改为:
更新图示,展示动画效果播放速率:
更新如下:
改为:
更新时间计算图:
(1) 将继承时间结合起始时间转换为本地时间;
(2) 本地时间结合起始延迟转换为活动时间;
(3) 活动时间除以迭代时长,结合迭代起始和播放速率生成整体进度;
(4) 整体进度被转换为单次迭代内的偏移量:简单迭代进度;
(5) 简单迭代进度结合定向进度和播放方向;
(6) 最后,对定向进度应用计时函数,得到变换后进度。
更新:
第一步,本地时间的计算见 Local time。
改为:
第一步,本地时间的计算见§ 2.5.3 本地时间与继承时间。
2.8.2. 计算活动时长
更新为:
重复时长 =迭代时长 × 迭代次数此澄清是因为根据 IEEE 754-2008,无穷大与零相乘结果未定义。
活动时长按以下步骤计算:
2.8.3. 本地时间的变换
2.8.3.1. 计算活动时间
在每个阶段的定义中补充如下步骤:
2.8.3.2. 计算整体进度
在整体进度定义中,更新initial progress的“否则”分支如下:
2.9. 时间变换
可替代方案包括:只能在分组效果上使用线性时间函数, 或者只允许一组“简单”时间函数,这些函数在某些特性上能缓解复杂时间函数带来的部分问题。
参见 2013年8月讨论第2节。
2.9.1. 计算变换后进度
将第二步替换为针对before flag的计算(以适应效果播放速率):
如果任一下列条件为真:current direction为forwards,或播放速率 ≥ 0(但不是两者都为真时), 那么令going forwards为 true,否则为 false。
2.9.2. 计算变换后时间
(本节为新增。)
动画效果的变换后时间很简单,就是 变换后进度乘以 迭代时长。
2.10. 分组与同步
虽然可以分别设置动画效果的计时属性,但通常将多个动画效果同步,使它们共享公共计时属性并保持它们的时序关系会更有用。这通过分组效果实现。
下面是一个简单示例:
(a) 展示分别给各个动画设置5秒延迟。
(b) 通过给分组设置延迟,达到同样效果。
分组效果是一种动画效果,包含若干个(零个或多个)有序的动画效果,称为子效果。
某一时刻,一个动画效果至多只能是一个分组效果的子效果,该分组效果称为父组。 父组不能与动画效果自身相同。
通过嵌套分组效果可以构建树状结构。用于描述此类结构组成与属性的术语如下,并见 [DOM] 的定义:
注意: 在应用这些定义到动画效果时,父节点专指父组,不包括动画,即使后者实际上是动画效果的时间源。
子效果与其父组之间的时序关系体现在继承时间的定义中(参见§ 2.5.3 本地时间与继承时间)。
2.10.1. 分组时间与子项时间的关系
分组效果的子项的计时基于分组的计时。具体来说,子项的时间基于父分组的变换后时间。对于重复来说,这意味着子项在父分组的每一次迭代内执行。
例如,若分组效果的迭代次数为2,则该组的所有子项会播放两次,因为它们有效地在分组的每轮迭代内被播放。
注意,即便如此,每个子动画效果只有一个活动区间,但是由于父分组的计时安排,该活动区间会被播放两次。
如果对子项和分组本身同时设置迭代次数,等同于将分组的迭代次数与子项的迭代次数相乘。
由于分组效果的子项的计时基于分组的变换后时间,所以它们无法超出分组的活动区间进行动画。 这是因为分组的变换后时间在其活动区间之外不会变化,因此分组合可以裁剪其子项的播放。
但当类似的动画效果被放入一个指定了迭代时长的分组效果时,会导致子动画效果的活动区间被裁剪。
2.10.2. 分组效果子项的起始时间
注意,某些特定类型的分组效果可以重写此定义,实现其它类型的同步行为。
2.10.3. 分组效果的固有迭代时长
分组效果的固有迭代时长等于该分组内最后一个子效果完成其活动区间的时间,具体取决于子项数量,规则如下:
- 如果分组没有子效果,
-
固有迭代时长为0。
- 否则,
某些特定类型的分组效果可以重写上述固有迭代时长的定义。
2.10.4. 序列效果
某些特定类型的分组效果可用于对子项实现不同的同步行为。本规范定义了一种额外类型的分组效果:序列效果。序列效果将其子项的起始时间顺序排列,使其逐一依次执行。
对比如下两种安排:
(a) 是常规分组效果,所有子项同时执行。
(b) 是序列效果,子项依次执行。
由于分组效果还可以嵌套其他分组效果,下图展示了组合不同类型分组以实现复杂同步的可能性:
分组效果会等待序列中的前一个子项结束,才与该分组的所有子项一起同时播放。播放完后,序列效果的下一个子项才会播放。
序列效果是分组效果的一个类型,它会安排其子效果按顺序依次执行。这种序列方式是通过调整组内每个子项的起始时间实现的。
2.10.4.1. 序列特效子项的开始时间
子特效的开始时间(属于序列特效)是该子项前一个兄弟节点的结束时间。 如果子项没有前一个兄弟节点,那么开始时间为零。
同样,上述定义并未限制开始时间为正值,因此,由于分组中较早子项具有负的启动延迟,导致其活跃区间可能在分组的开始时间前结束,某些子项可能不会被播放。
因为活跃区间的起点是基于动画特效的开始时间 加上 启动延迟, 所以序列特效子项的活跃区间未必严格按顺序顺次运行,可以通过启动延迟前后移动,如下图所示。
2.10.4.2. 序列特效的固有迭代时长
序列特效的固有迭代时长等价于假定 在组的子项末尾追加一个子特效后,按§ 2.10.4.1 序列特效子项的开始时间的定义计算得到的开始时间,如果该值为负,则固有迭代时长为零。
3. 动画模型
3.1. 动画类型
3.1.1. 不可动画化
将针对不可动画属性的特效的描述更新为:
针对不可动画属性的 动画特效,依然会表现出 动画特效的常规行为,例如在序列特效中占用时间, 以及延后动画的 current finished promise的实现时机。
3.2. 关键帧特效
3.2.1. 关键帧特效的效果值
针对由关键帧特效作为 目标属性之一引用的某个属性, 在指定iteration progress、current iteration和underlying value下, 用于计算效果值的过程, 需在应用关键帧特效合成模式步骤后插入以下步骤。
-
对interval endpoints中的每个keyframe:
3.3. 效果合成
3.3.1. 效果栈
为效果排序过程追加以下步骤:
排序动画特效时所用的 “动画特效的关联动画” 定义需要根据本级规范引入的与动画关联的定义进行修订,以正确处理群组特效。
3.4. 效果累加
类似于效果值之间的合成 (参见 Web Animations § 5.4.4 效果合成), 迭代合成操作 决定了同一个关键帧特效连续多次迭代时如何合成属性值。
本规范定义了如下两种迭代合成操作:
- replace
-
每次迭代独立计算,不依赖于前次迭代的结果。
- accumulate
-
动画的连续多次迭代,将与上一次迭代的最终值累加。
对迭代合成操作的应用已被整合进效果值的计算中, 可参见§ 3.2.1 关键帧特效的效果值。
3.5. 自定义特效
(本节新增。)
该功能需要重新讨论。目前的想法是,与其单独设置自定义特效,不如在每个动画特效上直接支持onupdate回调即可。
这样,比如要给已有的特效添加日志、或在特定时刻触发额外行为等,就不需要单独加一个父分组,仅用回调即可实现。
在某些场景下,Web Animations原生提供的动画特效可能无法满足需求。
比如,此处定义的动画特效只能作用于特定CSS属性,
无法用来平滑缩放SVG viewport的currentScale
属性而不影响文档内容。
如果内置动画特效无法满足功能需求,可以通过脚本自定义特效。 这样定义的自定义特效会从计时模型接收迭代进度和当前迭代,并负责根据指定时刻产生对应的效果。
通过脚本定义的特效不仅能动画化原本不能动画的属性,还可以动画化任何脚本可访问目标,包括生成音频或控制震动等。
例如,利用自定义特效
绘制到canvas元素,
就可以实现复杂的动画,比如用CSS或SVG难以创建的图案。
与脚本动画定时控制技术相比,
这种方式保证了动画不会受帧率影响,可暂停、反向、支持缓动效果、加速、与其他动画同步,并且可像其它Web Animations动画一样受控,无需额外编程。
自定义特效 是开发者自定义的回调,会在更新动画并发送事件流程中被传递计时信息调用。
3.5.1. 自定义特效的取样
每次执行更新动画并发送事件流程(下称更新)时, 会根据以下方式为每个引用自定义特效的动画特效调用回调。
待讨论的其他备选方案:
-
可以为零宽度的自定义特效定义额外的回调调用条件。例如可要求,若在上一次和当前更新时间之间(假定无限精度)恰好有某时刻落在自定义特效区间内,则必须调用回调。
-
也可以不为自定义特效增加特殊调用逻辑,而是另行引入新的动画特效类型:—如Trigger,该类型只作为零宽度自定义特效生效,其构造函数仅需回调,不要求目标或计时参数。也可以指定其它调用方式,比如限定仅在某种播放方向下触发等。
3.5.2. 自定义特效的执行顺序
由于自定义特效不像动画特效那样仅限于单一的目标属性,因此评估它们的执行顺序的步骤与动画特效不同。
自定义特效会在所有 动画特效都已完成并将其结果应用到对应目标之后执行(参见“应用合成结果”)。
需要更精确地定义此处。 样式是否已刷新? 推测应当如此。 能否在执行基于脚本的动画特效的期间暂停回流,待所有执行后再进行一次回流?
在所有自定义特效之间, 执行顺序与动画特效在[[#the-effect-stack]]中定义的排序顺序相同, 排序靠前的会优先执行,排序靠后的会后执行。
3.6. 动画触发器
3.6.1. 概述
动画触发器用于控制其关联的 动画在基于时间的动画中的播放。 与动画类似,动画触发器会与时间轴相关联,并附加到一个附着区间上。
3.6.2. 动画触发器内部状态
动画触发器 trigger 具有一个内部布尔型did trigger标志,初始为false, 以及一个内部state,可取如下值:
- idle
- 与animation关联的动画特效保持在其开始前阶段,并将当前时间固定为零。
- primary
- 切换到此值时,由type指定的primary行为类型会应用到animation。
- inverse
- 切换到此值时,由type指定的inverse行为类型会应用到animation。
state和did trigger的值会在下面描述的更新动画触发器状态步骤中被更新。
3.6.3. 动画触发器行为
动画触发器 具有一个关联的动画触发器行为, 该行为结合did trigger和 state, 决定该触发器对其关联动画播放的影响。
与动画触发器关联的动画特效在idle状态下, 会始终处于其开始前阶段,并且当前时间保持为零, 无论触发器的did trigger标志或state为何。 其他情况下,不同行为behavior的播放效果如下:
- once
-
- 如果state是primary,
-
则其效果是触发关联动画。
- 否则,
-
触发器不产生任何效果。
- repeat
- alternate
- state
“primary/inverse” 行为类型是否需要详细定义?
3.6.4. 动画触发器激活区间
每个动画触发器都定义了一个激活区间 ,且仅有一个。该区间为时间轴进度上state设置为primary期间的片段。
3.6.5. 动画触发器区间
一个动画触发器包含两个区间, 即默认区间和 退出区间。 退出区间用于替换默认区间并扩展激活区间。
3.6.6. 设置动画的触发器
3.6.7. 设置动画触发器的时间轴
null)过程如下:
3.6.8. 更新动画触发器状态
当时间轴再次变为闲置时,"did trigger" 标志是否应重置为false才是正确/期望的行为?
4. 编程接口
4.1.
AnimationTimeline 接口
[Exposed =Window ]partial interface AnimationTimeline {readonly attribute CSSNumberish ?currentTime ;readonly attribute CSSNumberish ?duration ;Animation play (optional AnimationEffect ?effect =null ); };
更新 currentTime 属性类型。
currentTime, 类型为 CSSNumberish,只读,可为 null-
返回该时间轴的当前时间,如果该时间轴 未激活则返回
null。对于基于进度的时间轴,该值表示为百分比;其他情况下为毫秒单位的 double 类型值。 duration, 类型为 CSSNumberish,只读,可为 null-
返回该时间轴的时长。
Animation play(optional AnimationEffect? effect = null)-
创建一个新的
Animation对象,关联到此时间轴,并在其 就绪时立即开始播放。若指定了 effect,则作为动画的 关联特效。
有建议将本方法重命名或移除 (见 TAG 意见)。
新的
Animation对象由Animation()构造函数创建,参数包含本AnimationTimeline对象(作为 timeline)和 effect(作为 effect 参数)。
4.2. Animation 接口
更新 Animation 接口的 startTime 和 currentTime,增加 rangeStart、rangeEnd 和 overallProgress,如下所示:
[Exposed =Window ]partial interface Animation {attribute CSSNumberish ?startTime ;attribute CSSNumberish ?currentTime ;attribute AnimationTrigger ?trigger ;attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeStart ;attribute (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeEnd ;readonly attribute double ?overallProgress ; };
增加或更新如下属性描述:
startTime, 类型为 CSSNumberish,可为 null-
按如下方式更新描述:
该动画的起始时间。若与基于进度的时间轴关联,则start time返回类型必须为
CSSNumericValue且单位为百分比。否则 start time 返回毫秒单位的 double 值。 设置该属性时,会按照设置起始时间 的过程将此对象的起始时间变为新值。
currentTime, 类型为 CSSNumberish,可为 null-
按如下方式更新描述:
该动画的当前时间。若与基于进度的时间轴关联,则current time返回类型为
CSSNumericValue百分比单位。 否则 current time 必须为毫秒单位的 double 类型值。 设置该属性时将按照设置当前时间的流程,将当前时间更新为新值。
新增:
rangeStart, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)指定该动画的动画附着区间的起点。 设置该属性遵循 KeyframeAnimationOption 的 rangeStart 的同样规则。 读取该属性时返回值为
TimelineRangeOffset或DOMString"normal"。rangeEnd, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString)指定该动画的动画附着区间的终点。 设置该属性遵循 KeyframeAnimationOption 的 rangeEnd 的同样规则。 读取该属性时,返回值为
TimelineRangeOffset或DOMString"normal"。overallProgress, 类型为 double,只读,可为 null指定overallProgress,即该动画相对于其关联特效终点的进度比例。
trigger, 类型为 AnimationTrigger,可为 null
4.3.
AnimationEffect 接口
[Exposed =Window ]partial interface AnimationEffect { // Timing hierarchyreadonly attribute GroupEffect ?parent ;readonly attribute AnimationEffect ?previousSibling ;readonly attribute AnimationEffect ?nextSibling ;undefined before (AnimationEffect ...);effects undefined after (AnimationEffect ...);effects undefined replace (AnimationEffect ...);effects undefined remove (); };
getComputedTiming()-
对象的
duration属性描述需说明:如果timing.duration是字符串auto,该属性会返回 当前计算出的固有迭代时长, 可能表示为毫秒的 double,或若特效关联到基于进度的时间轴,则为百分比。 parent, 类型为 GroupEffect,只读,可为 null-
该父组(parent group),或者
null若此 动画特效 无 父组。 previousSibling, 类型为 AnimationEffect,只读,可为 null-
该前一个兄弟节点。
nextSibling, 类型为 AnimationEffect,只读,可为 null-
该下一个兄弟节点。
undefined before (AnimationEffect... effects)-
在本动画特效之前插入 effects。
注意:由于该定义,下述用法不可行,因为effect同时是自身或祖先:effect
. before( effect); // 抛出 HierarchyRequestError undefined after(AnimationEffect... effects)-
在本动画特效之后插入 effects。
undefined replace(AnimationEffect... effects)-
将本
AnimationEffect替换为传入的 effects。 undefined remove()
remove()
方法既可将特效从父组移除,也可从动画移除。我们是否应在第1级中保留该方法,并只定义为从动画对象移除?
4.4.
EffectTiming 和 OptionalEffectTiming
字典
partial dictionary EffectTiming {double delay ;double endDelay ;double playbackRate = 1.0; (unrestricted double or CSSNumericValue or DOMString )duration = "auto"; };partial dictionary OptionalEffectTiming {double ; };playbackRate
注意: 本规范当前版本中,duration 暂不支持设置为 CSSNumericValue;但通过 getComputedTiming()
解析 duration 时,返回值可能为 CSSNumericValue。
未来版本有望允许将 duration 设置为 CSSNumeric 类型,需为有效时间单位或百分比。
delay, 类型为 double-
将描述更新为:
endDelay, 类型为 double-
将描述更新为:
指定结束延迟,即从动画特效的活跃区间结束到后续(如序列组中另一个序列特效)动画特效起始时间的毫秒数。指定结束延迟会通过规范化指定计时过程转换为结束延迟。
duration, 类型为(unrestricted double or CSSNumericValue or DOMString),默认值为"auto"-
将描述更新为:
指定迭代时长,即大于或等于零的实数(包括正无穷),表示单次动画特效迭代所需的时间(毫秒),或字符串
auto,表示迭代时长以特效的固有迭代时长为准。指定迭代时长会通过规范化指定计时过程转换为迭代时长。
4.5. 更新 AnimationEffect 的计时
替换:
将 input 中存在的每个成员赋值给 effect 的对应计时属性如下:
为:
将 input 中存在的每个成员赋值给 effect 的对应计时属性如下:
增加:
按规范化指定计时流程操作。
样式变更也可能导致计时属性被更新。任何影响动画计时的 CSS 动画属性变化,都需要重新执行规范化指定计时流程。
4.6.
ComputedEffectTiming 字典
partial dictionary ComputedEffectTiming {CSSNumberish startTime ;CSSNumberish endTime ;CSSNumberish activeDuration ;CSSNumberish ?localTime ; };
startTime, 类型为 CSSNumberish-
该动画特效的起始时间。若特效关联的是基于进度的时间轴,则以百分比表示,否则为毫秒的 double 类型。
endTime, 类型为 CSSNumberish-
将描述更新为:
本动画特效在继承时间空间下的结束时间。如果关联的是基于进度的时间轴,则该值以百分比表示,否则为毫秒单位的 double。 该时间为动画特效活跃区间的结束点加上结束延迟。
activeDuration, 类型为 CSSNumberish-
将描述更新为:
localTime, 类型为 CSSNumberish,可为 null-
将第二段描述更新为:
补充:
如关联到基于进度的时间轴,则该值为百分比,否则为毫秒单位的 double 值。
4.6.1.
FillMode 枚举
enum {FillMode ,"none" ,"forwards" ,"backwards" ,"both" };"auto"
auto-
将描述更新为:
应用于
GroupEffect时前后都填充,应用于KeyframeEffect时不填充。
4.7.
GroupEffect 接口
(本节新增。)
组特效由
GroupEffect
接口表示。
[Exposed =Window ]interface {GroupEffect constructor (sequence <AnimationEffect >?children ,optional (unrestricted double or EffectTiming )timing = {});readonly attribute AnimationNodeList children ;readonly attribute AnimationEffect ?firstChild ;readonly attribute AnimationEffect ?lastChild ;GroupEffect clone ();undefined prepend (AnimationEffect ...);effects undefined append (AnimationEffect ...); };effects
GroupEffect ()-
按照如下过程创建一个新的
GroupEffect对象:-
创建一个新的
GroupEffect对象 group。 -
令 timing input 为对
timing执行处理 timing 参数的结果。 -
令 timing input 为如下第一个符合条件的结果。
- 如果 options 是一个
EffectTiming对象, -
令 timing input 为 options。
- 否则(如果 options 是
double), -
令 timing input 为 新建的
EffectTiming,其所有成员为默认值,duration为 options。
- 如果 options 是一个
-
按照 更新动画特效计时属性 的流程用 timing input 更新 group 的计时属性。
如果过程中抛出异常,则传播该异常并中止本流程。
children-
要作为本组子项添加的一系列动画特效。
这些子项会按照
append()方法的语义依次插入到GroupEffect接口中。 timing-
该新组特效的计时属性或迭代时长。
-
children, 类型为 AnimationNodeList,只读-
本组中子特效的列表。
firstChild, 类型为 AnimationEffect,只读,可为 nulllastChild, 类型为 AnimationEffect,只读,可为 null
- undefined prepend (AnimationEffect... effects)
undefined append (AnimationEffect... effects)GroupEffect clone ()-
按如下过程深拷贝本
GroupEffect对象:-
令 source 为当前
GroupEffect对象,即需克隆的对象。 -
令 cloned timing 为新建的
EffectTiming,其每个成员都赋值为source.getTiming()中同名属性的值。 -
令 cloned children 为空序列
AnimationEffect对象。 -
对
source.children中的每个 child,调用child.clone()并添加到 cloned children。 -
返回通过调用
GroupEffect()构造的新GroupEffect,参数为GroupEffect(cloned children, cloned timing)。
-
4.7.1.
处理 timing 参数
传递给
GroupEffect()
或 SequenceEffect()
构造函数的 timing 参数可以是一个 EffectTiming
对象、表示 动画特效时长(毫秒)的 double 或 undefined。
以下流程处理 timing
参数
,用于将上述输入归一化为
EffectTiming
对象。
- 如果 timing 是
EffectTiming对象, -
直接返回 timing。
- 如果 timing 是
double, -
返回新建的
EffectTiming,其所有成员为默认值,duration为 timing。 - 否则(timing 未定义),
-
返回新建的
EffectTiming,其所有成员为默认值。
4.7.2. 层级操作定义
用于确定动画特效 effect 在一组动画特效 effects 中的 下一个未包含在该组内的兄弟节点 的步骤如下:
-
令 context effect 为 effect。
-
当 context effect 的下一个兄弟节点 非
null时,执行下列步骤:-
令 context effect 变为其下一个兄弟节点。
-
如果 context effect 不在 effects 中,返回 context effect 并中止。
-
-
返回
null。
要移除一个 effect 从其父组或 动画 ,按照首先匹配到的条件执行如下操作(如有):
要插入一系列 effects 到 parent 的子特效列表的 reference child 之前,对 effects 里每一个 effect 依次按以下步骤操作:
4.8.
AnimationNodeList 接口
一组动画特效可以用
AnimationNodeList
表示。
AnimationNodeList 接口支持索引属性,索引范围为 0 ≤ index <
length。
此接口存在的唯一原因,是为了让熟悉 DOM 接口(通过 children 成员访问子节点)的作者获得熟悉的体验。
[Exposed =Window ]interface {AnimationNodeList readonly attribute unsigned long length ;getter AnimationEffect ?item (unsigned long ); };index
length, 类型为 unsigned long,只读-
列表中动画特效的数量。
getter AnimationEffect? item(unsigned long index)-
返回
index位置的动画特效。 如果index大于等于length,则返回null。
4.9.
SequenceEffect 接口
序列特效由
SequenceEffect
接口表示。
[Exposed =Window ]interface :SequenceEffect GroupEffect {constructor (sequence <AnimationEffect >?,children optional (unrestricted double or EffectTiming )= {});timing SequenceEffect clone (); };
constructor (sequence<AnimationEffect>? children, optional (unrestricted double or EffectTiming) timing)-
该构造函数中的每个参数的意义和处理方式,与
GroupEffect()构造函数完全相同。
SequenceEffect clone ()-
用与
clone()方法相同的流程,对此SequenceEffect对象进行深拷贝;唯一不同点是会新建一个SequenceEffect对象。
4.10.
KeyframeEffect 接口
KeyframeEffect
接口修改如下:
partial interface KeyframeEffect {attribute IterationCompositeOperation iterationComposite ; };
KeyframeEffect (target, keyframes, options)-
将创建新
KeyframeEffect对象的流程第5步修改为如下:-
如果 options 是
KeyframeEffectOptions对象, 则将iterationComposite和composite属性分配给 effect 对应成员,赋值时如有异常应依KeyframeEffect的 setter 定义处理,并导致整个流程中止并抛出异常。
-
KeyframeEffect (source)-
补充:用与原流程一致的方法创建新
KeyframeEffect对象,且将 source 的 迭代合成操作 赋值给 effect。
iterationComposite, 类型为 IterationCompositeOperation-
该迭代合成操作属性由 关键帧特效选用 IterationCompositeOperation 枚举值指定。
设定时,会把本迭代合成操作属性赋值为参数值。
4.10.1. 创建新的 KeyframeEffect 对象
替换:
如未指定时长,则默认值为零。
为:
如未指定时长,则使用固有迭代时长。
补充:
此点在与其他动画特效联用(如下例)时尤其实用。例如,可通过如下方式先淡出元素再切换 visibility 为 ‘hidden’:
4.10.2.
对 *Keyframe 字典的修改
ComputedKeyframe、BaseComputedKeyframe、BaseKeyframe、BasePropertyIndexedKeyframe
等
字典中 offset 键的 double? 类型被替换为
(CSSNumberish? or TimelineRangeOffset or DOMString),
其中 double 依然表示百分比,DOMString
将按照 <keyframe-selector> 语法解析为 TimelineRangeOffset,
得到的 TimelineRangeOffset或者
CSSNumericValue
按 @keyframes 语义解释。
如果 DOMString
不能正确解析为合法<keyframe-selector>,
则该关键帧无效,在 [[web-animations-1#processing-a-keyframes-argument|处理]] 时会抛出
TypeError
(行为同 double 超出 [0,1] 时)。
4.10.3. KeyframeEffectOptions 字典
KeyframeEffectOptions
字典接口新增如下成员:
partial dictionary KeyframeEffectOptions {IterationCompositeOperation iterationComposite = "replace"; };
iterationComposite, 类型为 IterationCompositeOperation, 默认值为"replace"-
用于指定动画每次迭代间合成方式的迭代合成操作。
4.11. IterationCompositeOperation 枚举
一个动画特效的 迭代合成操作 可用 IterationCompositeOperation 枚举表示。
enum {IterationCompositeOperation ,"replace" };"accumulate"
replaceaccumulate-
对应accumulate 迭代合成操作,即后续迭代会在上次迭代的最终值基础上累加。
4.12. EffectCallback 回调函数
自定义特效可通过脚本提供
EffectCallback
类型的回调函数来定义。
callback =EffectCallback undefined (double ?, (progress Element or CSSPseudoElement ),currentTarget Animation );animation
每当与 KeyframeEffect
对象关联时更新,该 EffectCallback
就会被调用一次。
4.13.
Animatable 接口
sequence<Animation> getAnimations(options)-
补充:
如果此对象是两个或以上动画特效的目标元素,且这些特效属于同一个动画,则该
Animation只会在返回列表中出现一次。
4.14.
Animatable 接口混入
Animatable
的混入接口
修改如下,新增以下成员:
Animation animate(keyframes, options)-
将该过程第6步修改如下:
-
如果 options 是
KeyframeAnimationOptions对象, 则令 trigger 为 options 的trigger成员, 若 options 的trigger成员不存在则创建一个空AnimationTrigger,其选项字典为新的AnimationTriggerOptions。 -
以 auto-rewind 标志为 true, 对 animation 运行为动画设置触发器过程。
-
KeyframeAnimationOptions
字典接口
添加以下成员:
dictionary {TimelineRangeOffset CSSOMString ?;rangeName CSSNumericValue ; };offset partial dictionary KeyframeAnimationOptions { (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeStart = "normal"; (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeEnd = "normal";AnimationTrigger ?trigger ; };
rangeStart, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认值为"normal"-
如果该值存在且非 "normal",则指定该动画的动画附着区间起点。
DOMString类型将作为animation-range-end 语法解析, 得到TimelineRangeOffset、rangeName、offset,或CSSKeywordValue且value为 "normal";CSSNumericValue被解释为TimelineRangeOffset,其offset为此值,rangeName为 null。 rangeEnd, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认值为"normal"-
如有且非 "normal",指定该动画的动画附着区间终点。
DOMString类型按照 animation-range-end 语法解析得到TimelineRangeOffset、rangeName、offset;CSSNumericValue被解释为TimelineRangeOffset,包含该offset,rangeName为 null。 trigger, 类型为 AnimationTrigger,可为 null
向任何接受 CSSKeywordValue
,其 value
不为 "normal" 的
rangeStart
或 rangeEnd
传参到任何接受 KeyframeAnimationOptions
的 API 时会 抛出 TypeError。
注意: rangeName
和 offset
是 rangeStart
和 rangeEnd
的组成部分,具体含义按 animation-range-start 和 animation-range-end 的语法执行,进而影响动画表现。
更多说明参见 [[web-animations-1#the-animatable-interface-mixin]]。
4.15. AnimationPlaybackEvent 接口
将 currentTime 和 timelineTime 属性的类型由 double 改为 CSSNumberish。
[Exposed =Window ]interface :AnimationPlaybackEvent Event {(constructor DOMString ,type optional AnimationPlaybackEventInit = {});eventInitDict readonly attribute CSSNumberish ?currentTime ;readonly attribute CSSNumberish ?timelineTime ; };dictionary :AnimationPlaybackEventInit EventInit {CSSNumberish ?currentTime =null ;CSSNumberish ?timelineTime =null ; };
更新 AnimationPlaybackEvent 属性类型。
currentTime, 类型为 CSSNumberish,只读,可为 nulltimelineTime, 类型为 CSSNumberish,只读,可为 null
更新 AnimationPlaybackEventInit 成员类型。
currentTime, 类型为 CSSNumberish,可为 null,默认null-
见
currentTime属性描述。 timelineTime, 类型为 CSSNumberish,可为 null,默认null-
见
timelineTime属性描述。
4.16.
AnimationTrigger 接口
[Exposed =Window ]interface {AnimationTrigger constructor (optional AnimationTriggerOptions options = {});attribute AnimationTimeline timeline ;attribute AnimationTriggerBehavior behavior ;attribute any rangeStart ;attribute any rangeEnd ;attribute any exitRangeStart ;attribute any exitRangeEnd ; };
AnimationTrigger(options)-
通过如下流程创建新的
AnimationTrigger对象:-
新建
AnimationTrigger对象 trigger。 -
将 trigger 的did trigger 设为 false。
-
按 KeyframeAnimationOption 的 rangeStart 和 rangeEnd 规则, 用 options 的
rangeStart、rangeEnd设定 trigger 的默认区间。 -
同上,配置 退出区间,若为"auto"则用默认区间对应边界。
-
对 trigger 用 options.
timeline作为参数,执行设置动画触发器时间轴过程。
options-
新触发器的配置参数。
-
4.17. AnimationTriggerOptions
字典
dictionary {AnimationTriggerOptions AnimationTimeline ?timeline ;AnimationTriggerBehavior ?behavior = "once"; (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeStart = "normal"; (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )rangeEnd = "normal"; (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )exitRangeStart = "auto"; (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString )exitRangeEnd = "auto"; };
timeline, 类型为 AnimationTimeline,可为 null-
触发器关联的时间轴。 如未指定则使用默认文档时间轴。
behavior, 类型为 AnimationTriggerBehavior,可为 null,默认"once"-
触发器的行为类型。 未设置时默认为 once。
rangeStart, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认"normal"-
触发器默认区间的起点。 未指定时 默认区间起点为 "normal"。
rangeEnd, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认"normal"-
触发器默认区间的终点。 未指定时 默认区间终点为 "normal"。
exitRangeStart, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认"auto"-
触发器退出区间的起点。 未指定时 退出区间起点为 "auto"。
exitRangeEnd, 类型为(TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString), 默认"auto"-
触发器退出区间的终点。 未指定时 退出区间终点为 "auto"。
4.18. AnimationTriggerBehavior 枚举
enum {AnimationTriggerBehavior "once" ,"repeat" ,"alternate" ,"state" };
once-
once。
repeat-
repeat。
alternate-
alternate。
state-
state。
4.19. 模型活动性
关于“Web 动画模型的变更立即生效”这一章节,补充如下:
同样的概念也适用于对 Web Animations 模型更复杂的修改,例如为
GroupEffect添加或移除子元素。
补充:
- 通过编程接口对模型进行的更改 不会导致任何
EffectCallback函数被调用例如,在如下代码中,回调函数直到脚本块在常规更新期间完成后才会被调用。
var timesCalled= 0 ; elem. animate( function () { timesCalled++ ; }, 10000 ); alert( timesCalled); // 显示 ‘0’ 注意:需要在其它地方对其进行规范定义。
5. 变更说明
5.1. 自 Level 1 以来的变更
本规范相较于先前版本引入了以下变更:
5.2. 自 2023 年 2 月 21 日的第一个公开工作草案 以来的变更
- 将 animation-trigger-type 重命名为 animation-trigger-behavior
- 将对 start time 的描述更正为 current time
- 修正了 AnimationTrigger 接口 rangeStart、rangeEnd、exitRangeStart 和 exitRangeEnd 属性的语法 (议题 11624)
- 补充了 animation-trigger 属性,新增 AnimationTrigger 接口
- 将 progress 更名为 overallProgress (议题 8799)
- 规范了 Animation progress API (议题 9937)
- 明确动画的开始时间在未明确设置时会自动与动画范围边界对齐 (议题 9181)
- 修正了 KeyframeAnimationOptions 的 IDL 定义
- 扩展了 keyframes 的 offset 语法 (议题 7637)
- 为 Animatable 接口增加了 rangeStart/rangeEnd 属性 (议题 7589)
- 整理了效果栈的定义 (议题 8497)
6. 隐私注意事项
目前尚未收到与本模块相关的隐私注意事项报告。
7. 安全性注意事项
目前尚未收到与本模块相关的安全性注意事项报告。