chrome 中使用自定义时间线的 Waapi 缓动被窃听

Waapi easing useing custom timeline in chrome is bugged

简介

TLDR:https://codesandbox.io/s/elated-jennings-6budz。为什么红色与 chrome 中的蓝色 不一样?这是一个错误吗?

使用 chrome 版本:76.0.3809.132。在 Firefox 中,一切都按预期工作。

问题

我正在使用 waapi 实现依赖自定义时间轴的动画(例如滚动位置作为时间轴)。概念如下:

waapi 允许您通过将 iterationStart 选项设置在 0 和 1 之间的某处(假设动画只有一次迭代)来中途启动动画。当动画立即暂停时,我们得到请求的帧。当下一个输入进入时,我们覆盖最后一帧。

所以当我们得到 0.5 的输入时,我们将使用以下代码:

//           test keyframes
elem.animate({marginLeft: ["0px", "600px"]}, {
  duration: 100, 
  easing: "linear",
  fill: "both", 
  iterations: 1, 
  iterationStart: 0.5 // input
}).pause()

即使我们每 1/60 秒设置这样一个帧,这也能完美运行。然而,问题出现了,因为我们想要缓和动画(例如 easing: "ease" 而不是 linear)。这引入了奇怪的故障,动画每次都以 相同的进度跳来跳去 (进度 = iterationSatrt / 输入)。例如,第一次跳转是在 0.148 使用 ease 作为缓动函数。有人可以解释这种行为吗?这是一个错误吗?

我遇到了以下相关性。 0.148 * 2 使用 ease 功能轻松完成 0.5。为了计算这个,我使用 bezier-easing 库。这里的例子:https://runkit.com/embed/1wetjf7jjb2s。我不知道这是否相关,但我想我会分享我的发现。

这里的代码框 link 显示了问题:https://codesandbox.io/s/elated-jennings-6budz。请注意不要让它 运行 一次太长而不重新加载。

蓝色 div 使用修复来显示预期结果。为此,我保留了 easeing: "linear" 但自定义地使用 bezier-easing 库简化了每个输入,如上所示(以及代码中)。

这是一个错误,但显然已修复