Firefox 上的 react-spring 和 framer-motion 滞后

Posted

技术标签:

【中文标题】Firefox 上的 react-spring 和 framer-motion 滞后【英文标题】:react-spring and framer-motion laggy on firefox 【发布时间】:2020-09-20 09:30:43 【问题描述】:

我对两个动画库(react-spring、framer-motion)有疑问。我试图在组件第一次可见时制作简单的动画。 (是简化版)

<motion.div initial=x: -25, opacity: 0 animate=x: 0, opacity: 1 transition=duration: 2.5 className="App-logo">NAME</motion.div>

Github project

它在 Chrome、Brave、Edge 上看起来非常流畅,但在 Firefox 上它在动画结束时看起来很滞后。 此示例基于 framer-motion,但在 react-spring 中看起来相同。当 transition-duration 更短而 translateX 更长时,它看起来更好,但仍然不是流畅的动画(并且更改适用于其他浏览器的属性不是解决此问题的方法)。 火狐(76.0.1)(OS Win10)。

我尝试使用 clear css 制作相同的动画,并且它在每个浏览器上看起来都很流畅。我正在寻找解决问题的方法,但没有找到任何特定的答案。

【问题讨论】:

【参考方案1】:

我认为这是 Firefox 和 Chrome 的渲染引擎的区别。 Firefox 只是逐像素定位 div 而不进行子像素渲染。如果你对 div 进行轻微的旋转,它会使 FF 引擎跳过优化。

<motion.div initial=x: -25, opacity: 0, rotation: 0.02 animate=x: 0, opacity: 1, rotation: 0.02 transition=duration: 2.5 className="App-logo">NAME</motion.div>

更新:根据您的 git 存储库,我添加了一个示例。如果我为前两行添加旋转,则 Firefox 中的动画明显比最后一行更流畅。

https://codesandbox.io/s/happy-cannon-tew1f

【讨论】:

我添加了这个轻微的旋转,但老实说它并没有改变任何东西。它仍然看起来像衣衫褴褛的动画。我想知道为什么相同的动画,但在清晰的 css 中看起来完全平滑,但在 framer-motion / react-spring 中却完全滞后。 dropbox.com/s/ag6h21yyzuuz9mr/2020-06-02%2013-53-45.mkv?dl=0 在这个视频中,我展示了相同的动画,但在清晰的 css 中可以很流畅。我不确定 FF 是否有问题,但也许这些库有一些问题?要在 css 中制作动画,我使用的是 translateX。 我不确定平滑度的差异。对我来说,你的视频上的两个动画都很流畅。宽松政策略有不同。 Framer 动作开始得更快一点,并减慢 css 动画缓动对我来说似乎是线性的。但它必须独立于浏览器。 好吧。就像你说的“如果你向 div 添加轻微的旋转,它会使 FF 引擎跳过优化”。现在我看到这个轻微的旋转真的很顺利。在我的情况下,它应该大于 0.01 度但小于 0.1(约 0.06 度)。也许在未来 Firefox 会改变你的渲染引擎。感谢 Peter Ambruzs 的帮助。

以上是关于Firefox 上的 react-spring 和 framer-motion 滞后的主要内容,如果未能解决你的问题,请参考以下文章

React JS:如何在 react-spring 中使用响应式样式

如何使用 react-spring 滚动到元素?

如何将 react-spring 动画组件添加到 React 延迟加载?

react-spring 中的“动画”做啥?

react-spring 插值函数不适用于打字稿

将 react-spring 用于 react-native