浏览器渲染机制
style样式渲染:
- style标签中的样式由html解析器进行解析;
- style标签内的样式是异步解析的(分组解析渲染,容易出现闪屏现象)
link样式渲染:
- link引入的样式由stylesheet解析器解析
- 同步解析(css解析器会阻塞页面的渲染,但不干扰解析过程)
- 推荐使用link引入样式
- js对渲染的影响:
JS会阻塞渲染
浏览器的渲染过程
- 请求(HTML request)并接收到HTML文件(receive Response;receive Data),解析转化为DOM树
- 将CSS文件转换为CSSOM样式树
在这一过程中,浏览器会确定下每一个节点的样式到底是什么,并且这一过程其实是很消耗资源的。
- 遇到 script 标签时调用JavaScript引擎 执行JS代码,绑定事件,修改 dom 树和 css 树
- 生成渲染树(依赖GPU)
渲染树只会包括需要显示的节点和这些节点的样式信息。
比如说,如果某个节点是
display: none
的,那么就不会在渲染树中显示。 - 会根据渲染树来进行布局(也可以叫做回流);然后调用 GPU 绘制(paint),合成图层(composite),显示在屏幕上。
阻塞
css阻塞:
style标签:
- 由html解析
- 不阻塞浏览器渲染
- 不阻塞 DOM 解析
link引入css:(推荐使用)
- 由 css 解析器进行解析
- 阻塞浏览器渲染
- 阻塞 script 标签中 js 执行
- 不阻塞 DOM 解析
优化的核心理念:尽可能提高外部 css 加载速度
- 优化 css 代码
- 通过合并css文件,减少http请求数
- 对css进行压缩
JS阻塞
- 阻塞后续DOM解析
- 阻塞渲染
- 阻塞后续JS执行
图层
浏览器渲染DOM所做的实际工作是:
- 获取dom,分割成多个图层
- recalculate style :重新计算每个图层样式
- layout:回流(生成布局)
- paint:重绘(绘制图形)
- composite Layers:组合多个图层,呈现在页面上
回流(重排)和重绘
- 回流:布局或者几何属性需要改变就称为回流。
重绘:当节点需要更改外观而不会影响布局的,比如改变
color
就叫称为重绘可能触发重绘的操作:
- 浏览器窗口大小改变
- dom 尺寸、位置、内容发生改变
- 元素字体大小变化
- 添加或者删除可见的 dom 元素
- 查询某些属性时(例如clientWidth)
- 回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多。
优化方法:
js:
- 尽量使用
class
进行样式修改 - 减少
dom
的增删次数,可使用 字符串 或者documentFragment
一次性插入
- 尽量使用
css:
- 避免使用
table
布局 - 将动画效果应用到
position
属性为absolute
或fixed
的元素上
- 避免使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。