问题是更改属性值和添加动画需要同时发生。
当用 C++ 重写 Core Animation 时,引入了 OSX 10.5 中不存在的竞争条件。当我对附加动画的实验产生相同的闪烁时,我了解到了这一点。我发现解决方法是 Core Animation 的 kCAFillModeBackwards。我还发现相同的解决方法对 CSS 转换很有效,方法是破解我自己的 WebKit 分支,重点是破解部分。但是猜想对 WebKit 开发者没有帮助,我不想再惹恼他们。我确实认为问题在于核心动画,而不是 WebKit。我猜他们应该在任何给定的 CATransaction 中使用从对 CACurrentMediaTime 的单个调用派生的相同 CFTimeInterval。
与过渡不同,CSS 动画确实允许填充模式。重现转换行为可能很困难,但这是一种选择。特别是,挑战将是用从前一个中断的地方开始的新动画替换中断的动画。换句话说,从 0 到 1 或 1 到 0 的不透明度进行动画制作很容易,但是如果用户想要在当前动画进度为 0.577564 时开始制作呢?这可能需要手动修改@keyframes 样式规则,这不是一件容易的事。
然后是适当的动画填充模式的问题。通常你不想使用前向填充动画来执行布局,你会使用 CSS 属性本身。但在这种情况下,不设置底层值可能很简单,而是仅使用前向填充 CSS 动画,该动画会被替换但在完成时不会被移除。另一种方法是通过 element.style 设置底层值,同时添加一个向后填充的 CSS 动画。
当然,如果 WebKit 不使用 Core Animation,闪烁也不会发生。到目前为止,在您的情况下防止闪烁的最简单方法是不启用硬件加速。
代替:
-webkit-transform: translate3d(100px, 100px, 0);
尝试:
-webkit-transform: translate(100px, 100px);
http://jsfiddle.net/z6ejt/9/