当前位置: 首页 > Web前端 > CSS

flipyouranimation

时间:2023-03-30 18:41:17 CSS

在vue官方文档上看到vue是用flip做动画的,于是就去研究了一下。这是协调js和css在动画上运行的指南。如果你看过我之前的文章,一篇讲解浏览器解析和CSS(GPU)动画优化的文章,理解这篇文章还是很简单的。flip概念首先说一下flip这几个字母的含义:F:首先,过渡元素的初始状态。L:last,元素的最终状态。I:invert,这是flip的核心。你使用元素的初始状态和最终状态来计算元素发生了什么变化,比如它的宽度、高度和透明度,然后你翻转这个变化;例如,如果一个元素的初始状态和最终状态偏移了90px,你应该设置这个元素变换:translateY(-90px)。该元素看似处于其初始位置,但实际上恰恰相反。P:播放,为您想要更改的任何css属性启用转换,并删除您的反转更改。此时您的元素将从起点到终点进行动画处理。这是一个代码示例://jsvarapp=document.getElementById('app');varfirst=app.getBoundingClientRect();app.classList.add('app-to-end');varlast=app.getBoundingClientRect();varinvert=first.top-last.top;//让元素看起来像是在起点app.style.transform=`translateY(${invert}px)`;requestAnimationFrame(function(){//启用转换并删除翻转的更改app.classList.add('animate-on-transforms');app.style.transform='';});app.addEventListener('transitionend',()=>{app.classList.remove('animate-on-transforms');})

这里可以看到使用flip的好处,如果你看过我之前的一篇文章说ClearbrowserparsingandCSS(GPU)animationoptimization,你就知道getBoundingClientRect()是一个昂贵的操作,强制浏览器回流焊。那么为什么我们可以做这个昂贵的操作呢?如上图所示,用户与网站交互后有100ms的空闲时间。如果我们用这100ms做预运算,然后用CSS3transform和opacity做动画,用户会觉得你的网站响应很快。注意事项1.不要超过100ms的空闲时间:一旦超过这个空闲时间,就会造成卡顿;使用开发人员工具来注意这一点。2.仔细安排你的动画:想象你正在表演你的一个动画,然后你在表演另一个;这需要大量的预计算。这会中断正在运行的动画,这很糟糕。关键是要确保您的预计算在用户响应的空闲时间内执行,以便两个动画不会发生冲突。3.使用transform和scale时,元素会变形;尽管可以重构标签以避免失真,但它们最终会相互影响。总结Flip是一种思考如何做动画的方式,是css和js很好的配合。计算用js,动画用css。使用css动画不是必须的,您也可以使用WebAnimationsAPI或仅使用JavaScript。关键是你必须降低每一帧的复杂性(推荐使用transform和opacity)。参考https://aerotwist.com/blog/fl...