本文主要是介绍浏览器渲染流程和重绘,回流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、渲染大致流程
渲染引擎首先通过网络获得所请求文档的内容,渲染引擎在取得内容之后的基本流程:
①解析html以构建dom树
②构建render树 (render tree一般翻译为渲染树)
③布局render树
④绘制render树
2、渲染具体流程
1. ①浏览器会将HTML解析成一个DOM树,DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去 构建当前节点的下一个兄弟节点。
②将CSS解析成 CSS Rule Tree 。
2. 根据DOM树和CSS Rule Tree来构造 Render Tree(渲染树)。
注意:Render Tree 渲染树并不等同于 DOM 树,因为一些像Header或display:none的东西就没必要放在渲染树中了。
3. 有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。这一步操作称之为layout,顾名思义就是计算出每个节点在屏幕中的位置进行布局操作。
4. 接下来就是绘制,即遍历render树,并使用UI后端层绘制每个节点。
注意:上述这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
3、webkit的主要流程:(才疏学浅,不对请指出)
4、reflow与repaint
reflow(回流):当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,就称这个回退的过程叫 reflow。reflow 会从 <html> 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置。reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。
repaint(重绘):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。
注意:(1)display:none 的节点不会被加入Render Tree,而visibility: hidden 则会,所以,如果某个节点最开始是不显示的,设为display:none是更优的。
(2)display:none 会触发 reflow和repaint,而 visibility:hidden 只会触发 repaint,因为没有发现位置变化。
(3)有些情况下,比如修改了元素的样式,浏览器并不会立刻reflow 或 repaint 一次,而是会把这样的操作积攒一批,然后做一次 reflow,这又叫异步 reflow 或增量异步 reflow。但是在有些情况下,比如resize 窗口,改变了页面默认的字体等。对于这些操作,浏览器会马上进行 reflow。
这篇关于浏览器渲染流程和重绘,回流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!