repaint和reflow的相关知识

文章简介:页面重构应注意的repaint和reflow.

最近了解了下repaint和reflow的相关知识,觉得在页面重构过程中就应该考虑前端开发(js)人员对dom进行操作,能够减轻客户浏览器的鸭梨。
在这里整理了一下相关资料,推荐看帖子底部的文章,如果觉得排版不够好请移步我的博客围观。这是一个讨论帖,抛砖引玉,大家说说自己工作中的经验~

1. 什么是 repaint 和 reflow?

一个页面由两部分组成:
DOM:描述该页面的结构
render:描述 DOM 节点 (nodes) 在页面上如何呈现

当 DOM 元素的属性发生变化 (如 color) 时, 浏览器会通知 render 重新描绘相应的元素, 此过程称为 repaint。

如果该次变化涉及元素布局 (如 width), 浏览器则抛弃原有属性, 重新计算并把结果传递给 render 以重新描绘页面元素, 此过程称为 reflow。

这两个过程是很耗费浏览器性能的, 从 IE 系列和 Chrome 渲染页面速度上的差距即可看出渲染引擎计算对应值和呈现并不一定高效, 而每次对元素的操作都会发生 repaints 或 reflow, 因此编写 DOM 交互时如果不注意就会导致页面性能低下.
页面渲染的过程如下:

1.解析HTML代码并生成一个 DOM 树。

2.解析CSS文件,顺序为:浏览器默认样式->自定义样式->页面内的样式。

3.生成一个渲染树(render tree)。这个渲染树和DOM树的不同之处在于,它是受样式影响的。它不包括那些不可见的节点。

4.当渲染树生成之后,浏览器就会在屏幕上“画”出所有渲染树中的节点。

2. 什么情况下会触发浏览器的repaint/reflow?

除了页面在首次加载时必然要经历该过程之外,还有以下行为会触发这个行为:
引用:
1. DOM元素的添加、修改(内容)、删除( Reflow + Repaint)
2. 仅修改DOM元素的字体颜色(只有Repaint,因为不需要调整布局)
3. 应用新的样式或者修改任何影响元素外观的属性
4. Resize浏览器窗口、滚动页面
5. 读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、 getComputedStyle()、currentStyle(in IE))
3. 怎么优化?

1. 避免在document上直接进行频繁的DOM操作,如果确实需要可以采用off-document的方式进行,具体的方法包括但不完全包括以下几种:

引用:
1. 先将元素从document中删除,完成修改后再把元素放回原来的位置
2. 将元素的display设置为”none”,完成修改后再把display修改为原来的值
3. 如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document
2. 集中修改样式

引用:
       1. 尽可能少的修改元素style上的属性
       2. 尽量通过修改className来修改样式
       3. 通过cssText属性来设置样式值
3. 缓存Layout属性值

引用:
       对于Layout属性中非引用类型的值(数字型),如果需要多次访问则可以在一次访问时先存储到局部变量中,之后都使用局部变量,这样可以避免每次读取属性时造成浏览器的渲染。
4. 设置元素的position为absolute或fixed

引用:
       在元素的position为static和relative时,元素处于DOM树结构当中,当对元素的某个操作需要重新渲染时,浏览器会渲染整个页 面。将元素的position设置为absolute和fixed可以使元素从DOM树结构中脱离出来独立的存在,而浏览器在需要渲染时只需要渲染该元素 以及位于该元素下方的元素,从而在某种程度上缩短浏览器渲染时间,这在当今越来越多的Javascript动画方面尤其值得考虑。
5. 权衡速度的平滑

引用:
       比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。
6. 不要用tables布局

引用:
       不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素 reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围
7. 不要在css里面写expression

引用:
       很多情况下都会触发reflow,如果css里有expression,每次都会重新计算一遍
参考文章:

       1. 如何减少浏览器repaint和reflow
       2. Repaint, reflow/relayout, restyle
       3. Reflows & Repaints: CSS Performance making your JavaScript slow?
       4. Repaint 跟踪浏览器的渲染[如果你的FF是3.5beta+监听网页的重绘情况]

时间: 2024-11-01 06:59:11

repaint和reflow的相关知识的相关文章

有关javascript的性能优化 (repaint和reflow)_基础知识

复制代码 代码如下:  repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲染. reflow(渲染),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他本身与所有父辈元素(祖先),这种开销是非常昂贵的,导致性能下降是必然的,页面元素越多效果越明显. 何时发生:. DOM元素的添加.修改(内容).删除( Ref

JavaScript中的Repaint和Reflow用法详解_基础知识

你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *,CSS选择器层叠不能超过三层,CSS尽量使用类选择器,书写HTML少使用table,结构要尽量简单-DOM树要小....等这些忠告,以前我就大概知道使用通配符或者CSS选择器层次过多可能会降低性能,至于为什么不使用table标签我一直是迷迷糊糊,也就跟着那样做了,但我认识了Repain和 Reflow之后,原来这些还真不能用太多. ok,希望这篇文章对你有帮助! 1.什么是Repaint/Reflow? 好,先上一张图:浏览器解析大概的工

关于数值分析的实验程序,用c语言c++均可,需要用到数值分析课相关知识,我可以提供部分资料

问题描述 关于数值分析的实验程序,用c语言c++均可,需要用到数值分析课相关知识,我可以提供部分资料 解决方案 我只想说 数据分析 不应该用MATLAB更方便吗? 解决方案二: http://wenku.baidu.com/link?url=ZAScYogajXHrTTRa5xjpUPtS7OQQXZ_LfXaWNkczTtWf2MJgx0RZFUuca4iRGUcPwtr4Um4AJObpWKl8dg5WS6fZdx6lfoES8JYcsJtcdgi 解决方案三: 数值分析各种算法C语言数值分

求射频、IC相关知识解析

问题描述 求射频.IC相关知识解析 什么是射频? 射频的频率范围是什么? 射频与无线,wlan,WiFi,蓝牙关系是什么? 移动通信用的都是射频么?手机的GSM,CDMA等也是用的射频技术么? IC/ID 卡用的射频技术么?卡中的线圈是什么作用?有源IC卡有线圈么,它是怎样应用射频技术达到的? 另外射频技术除射频识别外还有哪些方面的应用? 解决方案 这个问题建议你将问题一个一个的去 Google 等查找一下,都会有答案的.

讲解Python中面向对象编程的相关知识

  这篇文章主要介绍了深入讲解Python中面向对象编程的相关知识,是Python入门学习中的基础知识,需要的朋友可以参考下 Python从第一天开始就是面向对象的语言.正因为如此,创建和使用类和对象是非常地容易.本章将帮助您在使用Python面向对象编程的技术方面所有提高. 如果没有任何以往面向对象(OO)的编程的经验,那么可能要了解一些基本的入门课程就可以了,或者至少某种形式的教程,让你有了解基本概念. 但是,这里会比较少地介绍面向对象编程(OOP): OOP术语概述 类: 用户定义的原型对

小技巧:打印样式的相关知识

打印|技巧 今天有个朋友问我关于打印样式的问题,当时正是工作时间一时不好回答,只好在工作完成后整理,总结一下打印样式的相关知识. 先来了解一下什么叫打印样式?打印样式也就是说通过CSS指定给打印机来识别的打印时的输出样式.在HTML中链接的打印样式是:<link rel="stylesheet" rev="stylesheet" type="text/css" media="print" href="css/p

非窗口类中使用定时器的方法及相关知识的介绍

本文代码运行效果图如下: 摘 要:本文主要通过一些简单的例子,介绍了如何在Visual C++的窗口和非窗口类中使用定时器.重点介绍了如何用静态成员函数和静态数据成员在非窗口类中使用定时器,同时,又介绍了与定时器相关的知识,例如回调函数,C++类中的静态成员,以及模板类中的映射类等. 关键字 C++ 类 定时器 静态函数 静态成员函数 静态数据成员 回调函数 映射类 摘 要:This page introduce how to use timer in window class and none

计算机网络与路由器故障诊断的相关知识

路由器故障诊断是一门综合性技术,涉及网络技术的各个面.下面,我们就来简单回顾一下网络和路由器的基本概念. 一.计算机网络 计算机网络的发展,导致网络之间各种形式的连接.计算机网络按其计算机分布范围通常被分为局域网和广域网.广域网覆盖地理范围较大,如校园.城市之间.乃至全球;局域网覆盖地理范围较小,一般在数米到数十公里之间. 计算机网络是由计算机集合加通信设施组成的系统,即利用各种通信手段,把地理上分散的计算机连在一起,达到相互通信而且共享软件.硬件和数据等资源的系统. 二.因特网 采用统一协议实

Go语言中的Interface相关知识

一件作品的诞生,通常是一个设计师独立完成的.因为这样,一件建筑也好,画作或者音乐舞蹈也好,才能真实反映出 其个性.而正是这种不同于其他同类的独特一面,正是这种发自创造者的灵光一现.但又不会背离创作目的和原始架构的新 颖实用之处,才使得创新尤为难得. Go语言的诞生,是三个有很强个性的设计师共同完成的.Go语言的定位,就象 三维坐标系中的一个点,在强类型.动态和并发这三个特性维度上,分别代表了Ken.Robert和Rob三人的创造思维的投影. 当然,这样描述不仅是为了表达Go语言有这三个特性,也是