简单说:浏览器渲染与CSS动画及CSS性能优化

399 阅读2分钟

一、浏览器渲染原理

  1. 浏览器在接收到服务器返回的html页面后,
  2. 浏览器开始构建DOM树DOM TREE,遇到CSS样式会构建CSS规则树CSS RULE TREE
  3. 遇到javascript会通过DOM APICSSDOM API来操作DOM TreeCSS Rule Tree,解析完成后,
  4. 浏览器引擎会通过DOM Tree 和CSS Rule Tree 来构造 Rendering Tree(渲染树),
  5. 最后,渲染树构建完成后就是  "布局"  处理,也就是确定每个节点在屏幕上的确切显示位置
  6. 下个步骤(渲染之后),开始  "绘制"  ,遍历渲染树,并用UI后端层,将每一个节点绘制出来。 简单说:
    根据HTML构建HTML树(DOM);
    根据CSS构建CSS树(CSSOM);
    将两棵树合并成一颗渲染树(render tree);
    Layout布局(文档流、盒模型、计算大小和位置);
    Paint绘制(把边框颜色、文字颜色、阴影等画出来);
    Compose合成(根据层叠关系展示画面)。

1.1谈一下层叠上下文的概念

我们假定用户正面向(浏览器)视窗或网页,而 HTML 元素沿着其相对于用户的一条虚构的 z 轴排开,层叠上下文就是对这些 HTML 元素的一个三维构想。众 HTML 元素基于其元素属性按照优先级顺序占据这个空间。
附上图与链接:developer.mozilla.org/zh-CN/docs/…

image.png 这就是一个层叠上下文大概的结构了。

二、CSS动画及CSS性能优化

这里就不得不说一个css很yue的东西了:当你尝试改变样式的时候,你会发现你不知道这个属性会触发上面渲染的哪几个流程,这就导致你需要一个个试验!!(⓿_⓿)
还好还好(^///^)有大佬-->>csstriggers.com/ 这位大佬已经将他试验结果分享了出来🤙👍👍👍
果然程序员都爱分享!
这样一来,当你需要的时候,去上面查询一下就知道啦。

2.1 CSS动画

只说做法,一般分两种(transition 和 animation)
1.transition:

    .container{
      transition: all 1s; 
    }
    .container:hover{
      transform: scale(1.5);
    } 

2.animation:

    .container{
      animation: jump 1.5s infinite alternate;
    }
    @keyframes jump {
      0%{transform: scale(1.0);}
      100%{transform: scale(1.5);}
    }

(自己可以试验一下 多动手 说多无益 它本来也就没道理)

2.2 CSS性能

也许你会问我,怎么去看性能呢==》信我 浏览器啥也给你了。
好的,简单说几个优化的方向,具体演练就自己尝试吧。

  • 能用transform就不要用left
  • JS优化,使用requestAnimationFrame代替setTimeout或setInterval
  • css优化,使用will-change或translate ok,就说到这里。