浏览器的渲染页面过程和重排、重绘

渲染页面的过程:

1.解析html源码,创建dom树。每个标签都是一个节点。

2.解析css

3.构建dom树,并且计算出样式(padding、margin等),然后构建 渲染树。对于渲染树和dom树的不同是:dom树的每一个标签都是一个节点,但是渲染树会忽略掉不需要渲染的元素,例如head、display:none的元素。渲染树中的每一个节点都存储有对应的css属性。

4.渲染树创建好后,浏览器就可以根据渲染树直接把页面绘制到屏幕上。

重排和重绘:

重排:就是渲染树的一部分必须要更新 并且节点的尺寸发生了变化。这就会触发重排操作(相当于渲染树需要重新计算.....)。

重绘:部分节点需要更新,但是没有改变他的集合形状,比如改变了背景颜色,这就会触发重绘。

产生重排或重绘的操作:

(1)增加或删除DOM节点
(2)设置 display: none;(重排并重绘) 或者 visibility: hidden(只有重排)
(3)移动页面中的元素

(4)增删或者修改样式

(5)计算offsetWidth和offsetHeight

(6)用户 改变窗口大小,滚动页面等

浏览器的处理方案:

因为渲染树的改变导致的重绘或重排操作都可能代价很高,浏览器会对这个改动做很多优化。

一个策略就是不要立即做操作,而是批量进行。比如把你的脚本对DOM的修改放入一个队列,在队列所有操作结束后只需要进行一次绘制即可。

但是有的时候脚本可能会导致浏览器的批量优化无法进行,可能在清空队列之前就需要重新绘制(绘制意思是重绘或者重排)页面。比如你通过脚本获取这些样式:

offsetTop, offsetLeft, offsetWidth, offsetHeight
scrollTop/Left/Width/Height
clientTop/Left/Width/Height
getComputedStyle(), or currentStyle in IE

因为浏览器必须给你最新的值,所以当你进行这些取值操作的时候会立刻触发一次页面的绘制。这样本来可以批量修改样式然后一次性绘制的方法就无法使用了。

最后来说以下解决办法:

1.不要一个一个地单独修改属性,最好通过一个classname来定义这些修改

2.把对节点的大量修改操作放在页面之外,用 documentFragment来做修改,clone 节点,在clone之后的节点中做修改,然后直接替换掉以前的节点。
通过 display: none 来隐藏节点(直接导致一次重排和重绘),做大量的修改,然后显示节点(又一次重排和重绘),总共只会有两次重排。

3.不要频繁获取计算后的样式。如果你需要使用计算后的样式,最好暂存起来而不是直接从DOM上读取。

4.减少table布局(话说,很少有用table布局的了吧 现在,都过时了....)

5.避免css表达式,(因为每当文档重新加载或者部分文档重新加载的时候,CSS表达式都会重新计算一次,因此其性能会受到非常大的影响。)

6.总的来说,总是考虑到渲染树得存在,考虑到你的一次修改会导致多大的绘制操作。(比如绝对定位元素的动画就不会影响其他大部分元素)。

时间: 2024-10-07 23:49:47

浏览器的渲染页面过程和重排、重绘的相关文章

浏览器渲染页面的过程,以及重绘与重排

浏览器的渲染过程 1,浏览器解析html源码,然后创建一个 DOM树.在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点.DOM树的根节点就是 documentElement,对应的是html标签. 2,浏览器解析CSS代码,计算出最终的样式数据.对CSS代码中非法的语法她会直接忽略掉.解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置,用户设置,外链样式,内联样式,html中的style. 3,构建出DOM树,并且计算出样式数据后,下一步就是构

浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘。

一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DOM树的根节点就是documentElement,对应的是html标签. 2.浏览器解析CSS代码,计算出最终的样式数据. 对CSS代码中非法的语法它会直接忽略掉. 解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置,用户设置,外联样式,内联样式,html中的style(嵌在标签中的行间样式).

浏览器渲染页面过程

一.浏览器加载和渲染html的顺序 1.IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的.2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)3.如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载.4.并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载.阻塞加载5.样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲

页面优化,谈谈重绘(repaint)和回流(reflow)

一.前言 偶尔在面试过程中遇到过重汇与回流reflow的问题,毕竟页面优化也是考核一个开发者能力的关键之一,上篇文章聊了下documentfragment也是为了减轻回流问题,那么本篇文章好好介绍下重绘和回流. 二.重绘和回流是什么 怎么去理解这两个概念呢?从字面上理解,重绘,重新绘画,重新上色,较难产生联想的是回流. 我们都知道,一个页面从加载到完成,首先是构建DOM树,然后根据DOM节点的几何属性形成render树(渲染树),当渲染树构建完成,页面就根据DOM树开始布局了,渲染树也根据设置的

同一个页面多个CALayer重绘的办法

//知识点,CALayer的重绘,-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 方法,CALayer的渐变色.多个CALayer重绘的方法. //本例是一个,ViewController类,没有继承任何delegate, 也就是说下边的ca1,ca2,ca3的delegate直接设置为self,不用继承像<UITextFieldDelegate>这样的委托.CALyer好像没有委托,直接用就是了.不用搞清楚,直接写就

浏览器的重绘和重排的影响

浏览器下载完页面中全部的组件之后,会解析生成两个内部数据结构: 1.  DOM树:表示页面结构 2. 表示DOM节点怎样显示 当DOM和渲染树构建完毕之后,浏览器就開始显示(绘制)页面元素.当DOM的变化影响了元素的几何属性(如改变边框或者高度)浏览器须要又一次计算元素的几何属性.相同其它元素的几何属性和位置也会受到影响.浏览器会使中受到影响的部分失效,并又一次构造渲染树.这个过程被称为所谓的"重排".完毕重排后.浏览器会又一次绘制受影响的部分到屏幕中,这个过程被称为"重绘&

浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面

(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与回流? OK,兴致来了,我们就先从 浏览器解析 URL 看起,先来看看当用户输入 URL,到浏览器呈现给用户页面,经历了以下过程: 版本 A: 用户输入 URL 地址. 对 URL 地址进行 DNS 域名解析. 建立 TCP 连接(三次握手). 浏览器发起 HTTP 请求报文. 服务器返回 HTTP

浏览器渲染页面的流程

浏览器渲染流程如下图所示: 渲染的流程如下: 1. 解析HTML文件,创建 DOM 树 (自上而下,遇到任何样式(link.style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载).) 2. 解析CSS文件,构建 CSSOM Tree(CSS规则树) 优先级:浏览器默认设置<用户设置<外部样式<内联样式<HTML中的style样式:3. 将CSS与DOM合并,构建渲染树(Render Tree)4. reflow(重排):根据Render tree进行节点信息

页面重绘重排

1.重绘(Repaint) 重绘是一个元素外观的改变所触发的浏览器行为,例如改变outline.背景色等属性.浏览器会根据元素的新属性重新绘制, 使元素呈现新的外观.重绘不会带来重新布局,所以并不一定伴随重排. 2.重排(Reflow) 渲染对象在创建完成并添加到渲染树时,并不包含位置和大小信息.计算这些值的过程称为布局或重排 "重绘"不一定需要"重排",比如改变某个网页元素的颜色,就只会触发"重绘",不会触发"重排",因为布