硬件加速动画
WAAPI 相比基于 requestAnimationFrame 的动画,其最大的优势之一在于能够脱离主线程运行动画。这不仅能在 CPU 繁忙时保持动画流畅,还能降低功耗,从而延长电池续航时间。
需要注意的是,并非所有属性都能进行硬件加速。目前在所有浏览器中,只有少数几个属性可以创建新的合成层并脱离主线程运行。
所有主流浏览器均支持硬件加速的属性
- opacity
- transform
- translate
- scale
- rotate
部分浏览器支持硬件加速的属性
- clip-path
- filter
如果动画使用了自定义的 'linear()' 缓动函数,Safari(桌面端和移动端)目前不会触发硬件加速。这意味着自定义幂函数缓动(如 'out(3)'、'in(3)'、'inOut(3)')以及所有传递给 waapi.animate() 的 JavaScript 缓动函数,都会阻止动画进行硬件加速,即使该属性本身支持硬件加速。
硬件加速动画代码示例
import { animate, waapi, createTimer, utils, cubicBezier } from 'animejs';
const [ $block ] = utils.$('.button');
const waapiAnim = waapi.animate('.waapi.square', {
translate: 270,
rotate: 180,
alternate: true,
loop: true,
ease: 'cubic-bezier(0, 0, .58, 1)',
});
const jsAnim = animate('.js.square', {
x: 270,
rotate: 180,
ease: cubicBezier(0, 0, .58, 1),
alternate: true,
loop: true,
});
const blockCPUTimer = createTimer({
onUpdate: () => {
const end = Date.now() + 100;
while(Date.now() < end) {
Math.random() * Math.random();
}
},
autoplay: false
});
let isBusy = false;
const toggleCPU = () => {
blockCPUTimer[isBusy ? 'pause' : 'play']();
$block.innerText = (isBusy ? 'block' : 'free') + ' CPU';
isBusy = !isBusy;
}
$block.addEventListener('click', toggleCPU);
<div class="medium row">
<div class="waapi square"></div>
<span class="padded label">WAAPI</span>
</div>
<div class="medium row">
<div class="js square"></div>
<span class="padded label">JS</span>
</div>
<div class="medium row">
<fieldset class="controls">
<button class="button">Block CPU</button>
</fieldset>
</div>