问题描述
一般的经验法则是,如果动画可能在接下来的200毫秒内触发 [...] ,那么对动画元素进行更改会是个好主意。在大多数情况下,无论您打算更改哪个属性,应用程序当前视图中要设置动画的任何元素都应启用will-change。
所以我的问题是,will-change
是否可以在对任何属性进行实际动画处理之前通过Web动画API进行应用,并且会产生所需的效果吗?还是为了使will-change
正常运行而在幕后发生的一切生命周期太晚了?
似乎通过此API修改的属性实际上并没有在DevTools中反映为CSS属性,因此我无法验证它是否实际上甚至应用了will-change
。
想法示例:
this.animation = document.querySelector('#my-element').animate(
[
{
willChange: 'opacity',// will-change applied before any animated property has been changed
opacity: 'initial',},{
willChange: 'opacity',opacity: 'initial',offset: 0.01,// 1% of the way through the animation
},opacity: 0.5,offset: 0.5,// 50% of the way through the animation
},{
willChange: 'initial',opacity: 'initial'
},],1000
);
解决方法
是的,它将达到预期的效果。
动画会影响元素的计算样式,但是许多DevTools面板会显示元素的指定样式,因此为什么您在此处看不到它。
另一种方法是简单地向动画添加短暂的延迟。在动画的延迟阶段,要求浏览器应用will-change: opacity
(或其他要动画的属性)。 (Spec reference)
也就是说,这样做真的没有优势。应用will-change
的目的是让浏览器准备要进行动画处理的内容(例如,通过将其重新栅格化为单独的图层),以便动画开始时没有延迟。如果您只是正常启动动画,浏览器将根据需要重新光栅化,然后从头开始动画。
使用will-change
的好处是,如果您知道之前,则需要开始动画要制作动画的元素,则可以让浏览器提前进行准备。
使用WAAPI(Web动画API)时,看来will-change
实际上是完全不必要的。
如果您的动画制作有延迟,则无需担心会使用变更。 -Source
来自规范作者之一:
如果延迟时间为正值,则无需更改意愿,因为浏览器会在延迟开始时分层,并且在动画开始播放时就可以使用了。