合理的动画是良好用户体验的重要组成部分。我们平时是怎么写动画的?CSS中的动画和过渡,以及requestAnimationFrame?示例请看下面的示例:这是一个可以添加的随机打乱的数字列表。首先想一想,我们的第一直觉可能是这样做:用绝对定位对这些数字的DOM节点进行布局,计算数字变化后top和left的值,然后配合transition来实现动画。这种方式看似简单,但实际上需要在内部维护各种位置信息,所有坐标都需要手动管理,相当复杂,非常不利于后期扩展。如果将这些节点换成高度不固定的图片,计算量可想而知。那么有没有更好的方法来实现呢?当然,这里有一个闪亮的概念:FLIP。提前预览:https://minjieliu.github.io/react-flip-demoFLIPFLIP其实是几个词的缩写:First,Last,Invert,Play。让我们分解一下:首先涉及动画元素的初始状态(如位置、比例、透明度等)。Last指的是被动画化的元素的最终状态。Invert这一步是核心,就是找出这个元素是怎么变化的。比如元素在First和Last之间向右移动50px,需要在X方向平移X(-50px),让元素看First的位置。这里有一个知识点值得注意。DOM元素属性(如left、right、transform等)的变化会集中延迟到浏览器下一帧统一渲染出来,所以我们可以得到这样一个中间时间点:DOM位置信息发生了变化,但浏览器尚未呈现它[1]。也就是说在一定时间内,我们可以获取到DOM变化的位置,但是在浏览器中的位置没有变化。经测试,这个过程超过10ms就会变得不稳定。所以setTimeout(fn,0)、ReactuseEffect和Vue$nextTick都可以实现Invert过程。Play从Invert返回到最终状态。有了两点的位置信息,就可以使用transition实现中间的过渡动??画了。本文使用WebAnimationAPI[2]实现,动画执行时不会在DOM中加入CSS,相当干净。这里的实现主要是使用React的方式来实现这个效果,其他框架原理相同,供参考。一个连续有5个孩子的列表:.list{display:flex;弹性包装:包装;宽度:400px;}.item{显示:flex;对齐项目:居中;证明内容:居中;宽度:80px;高度:80px;border:1pxsolid#eee;}functionListShuffler(){const[data,setData]=useState([0,1,2,3,4,5]);}constlistRef=useRef
