CSS动画

浏览器渲染过程

  • 根据 HTML 构筑 HTML 树(DOM)

  • 根据 CSS 构筑 CSS 树(CSSDOM)

  • 将两棵树合并成一棵渲染树(render tree)

    pic5

  • LAYOUT 布局(文档流、盒模型、计算大小和位置)

  • paint 绘制(把边框颜色、文字颜色、阴影等画出来)

  • composite 合成(根据层叠关系展示画面)

  • 三种更新方式

    pic6

    1. 例如 div.remove()全部走一遍

    2. 改变 background,没有 layout 一步

    3. transform 只需要 composite,不需要 reflow 和 repaint,所以相对来说在性能上更优

      reflow 在布局发生变化之后进行,而 repaint 仅在例如背景颜色和边框颜色等没有发生布局变化的情况下进行,优化 reflow 和 repaint 可以 GOOGLE。

    4. 每个属性都触发什么渲染流程可以参考此网站:CSS Triggers

    5. 关于 CSS 动画的优化,详见:坚持仅合成器的属性和管理层计数 | Web | Google Developers

      pic7

transform

inline 元素不支持 transform,需要先转成 block,具体语法可以直接看 MDN:transform - CSS(层叠样式表) | MDN (mozilla.org)

  • translate 位移
    • 绝对定位和 translate(-50%,-50%)配合使用可以实现元素的居中
  • scale 缩放
  • rotate 旋转
  • skew 倾斜

transition

过渡,补充中间帧

  • transition:属性 时长 过渡方式 延迟

  • 多个属性用逗号隔开

  • all 表示所有属性

  • 过渡方式有很多,默认是 ease,具体查 MDN

  • 注意点

    • 并非所有属性都可以过渡,比如 display:none=>block 就不能过渡,可以使用 visibility:hidden=>visible,关于这两者的区别就是 display:none 的元素从文档流中消失了,而 visibility:hidden 则是文档流中保留原占据空间,知识看不见了
    • 颜色和透明度都是可以过渡的
    • 过渡必须要有起始状态和结束状态
  • 如果有两次过渡怎么办?

    pic8

animation

本次实践写在 饥人谷 JS Bin (jirengu.com)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!