FLIP 动画技术

作者: alue | 来源:发表于2022-06-29 21:14 被阅读0次

如果用 height, width, top, left等CSS属性来做动画,性能要远远差于用 transformopacity属性的动画。动画元素多的话,前者会带来页面卡顿。

这是因为不同的动画,涉及浏览器的不同阶段:Layout ➠ Pain ➠ Composite。如果单独触发 Composite,那么浏览器的负担就很小,动画会很丝滑。

When any property that triggers layout changes (such as height), the browser has to recursively check if any other element’s layout has changed as a result, and that can be expensive.

触发布局的属性一旦发生变化,浏览器就会非常忙碌.它需要递归的计算其它元素的布局是否会发生变动.

一旦这个计算时长超过1个动画帧(一般是60帧每秒,也就是说超过16.7ms), 那么这帧动画将不会绘制,产生页面卡顿。

FLIP动画技术,就是只利用transformopacity模拟布局变动的技巧,因为它不触发Layout,所以动画比较丝滑。

FLIP是 First, Last, Invert, Play的简称。

First

对应动画的Start阶段,用 element.getBoundingClientRect()记录初始位置。

Last

对应动画的End阶段,先执行触发layout变动的代码,记录元素的终止位置。

Invert

现在元素处于End位置,利用 transform 做一个逆运算,让添加了 transform 的元素回归到初始位置。

Play

真正需要执行动画时,将 transform 置为 None.

采用Web Animations API的代码示例如下

const elm = document.querySelector('.some-element');

// First: get the current bounds
const first = elm.getBoundingClientRect();

// execute the script that causes layout change
doSomething();

// Last: get the final bounds
const last = elm.getBoundingClientRect();

// Invert: determine the delta between the 
// first and last bounds to invert the element
const deltaX = first.left - last.left;
const deltaY = first.top - last.top;
const deltaW = first.width / last.width;
const deltaH = first.height / last.height;

// Play: animate the final element from its first bounds
// to its last bounds (which is no transform)
elm.animate([{
  transformOrigin: 'top left',
  transform: `
    translate(${deltaX}px, ${deltaY}px)
    scale(${deltaW}, ${deltaH})
  `
}, {
  transformOrigin: 'top left',
  transform: 'none'
}], {
  duration: 300,
  easing: 'ease-in-out',
  fill: 'both'
});

注意

  1. 要设置 transform-origin: top left
  2. 可以采用第三方动画库来实现FLIP

提出FLIP动画技术的大牛 David Khourshid 还专门编写了Flipping.js,可以更加方便的实现高性能FLIP动画。

相关文章

  • FLIP 动画技术

    如果用 height, width, top, left等CSS属性来做动画,性能要远远差于用 transform...

  • FLIP实现animation动画

    本文代码均放在git仓库 FLIP是什么 首先FLIP并不是一项新技术,可以把它理解为一种实现动画的新的理念或者新...

  • FLIP技术让动画更流畅

    前言 此篇文章实际上是《H5页面性能优化之加载篇》的姊妹篇。主要想从CSS 动画的角度给大家介绍下 FLIP 技术...

  • jquery2019.3.4滑动动画效果

    jquery2019.3.4滑动动画效果 $("#flip").click(function(){ $("#pa...

  • Flutter七种动画

    翻转的动画效果第三方,很有用: flip_card: ^0.6.0动画原理说明重要重要重要!!!!!!!!!!!...

  • CSS3动画(3):transform实现multi-flip动

    今天给大家带来自动轮播的multi-flip动画,o(▽)o,不知道什么是multi-flip没关系,来张效果图就...

  • opencv_learning

    1 flip flipCode:a flag to specify how to flip the array; ...

  • Quantum Kids (量子小孩)

    一群量子小孩翻动书页flip flip flip flip随即便说出书里那个小孩的故事闻闻纸张就说出故事里有牛奶有...

  • CUC-SUMMER-2-J

    J - Flip Game POJ - 1753 Flip game is played on a rectang...

  • Flutter 常用库

    1.flip_card[https://pub.flutter-io.cn/packages/flip_card/...

网友评论

    本文标题:FLIP 动画技术

    本文链接:https://www.haomeiwen.com/subject/kjsxbrtx.html