有关javascript的性能优化 (repaint和reflow)


Posted in Javascript onApril 12, 2013
 repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲染。
reflow(渲染),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他本身与所有父辈元素(祖先),这种开销是非常昂贵的,导致性能下降是必然的,页面元素越多效果越明显。
何时发生:
. DOM元素的添加、修改(内容)、删除( Reflow + Repaint)
. 仅修改DOM元素的字体颜色(只有Repaint,因为不需要调整布局)
. 应用新的样式或者修改任何影响元素外观的属性
. Resize浏览器窗口、滚动页面
. 读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、 getComputedStyle()、currentStyle(in IE)) 
如何避免:
. 先将元素从document中删除,完成修改后再把元素放回原来的位置
. 将元素的display设置为”none”,完成修改后再把display修改为原来的值
. 如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document 

var fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode('keenboy test 111'));
fragment.appendChild(document.createElement('br'));
fragment.appendChild(document.createTextNode('keenboy test 222'));
document.body.appendChild(fragment);
. 集中修改样式 

4.1尽可能少的修改元素style上的属性 

4.2尽量通过修改className来修改样式

4.3通过cssText属性来设置样式值


element.style.width=”80px”;  //reflow


element.style.height=”90px”; //reflow


element.style.border=”solid 1px red”; //reflow


以上就产生多次reflow,调用的越多产生就越多


element.style.cssText=”width:80px;height:80px;border:solid 1px red;”; //reflow 

4.4缓存Layout属性值 


var left=elem.offsetLeft; 多次使用left也就产生一次reflow

4.5设置元素的position为absolute或fixed


元素脱离标准流,也从DOM树结构中脱离出来,在需要reflow时只需要reflow自身与下级元素

4.6尽量不要用table布局


table元素一旦触发reflow就会导致table里所有的其它元素 reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围

4.7避免使用expression,他会每次调用都会重新计算一遍(包括加载页面)
参考:
Yahoo! 性能工程师 Nicole Sullivan 在最新的文章 《Reflows & Repaints: CSS Performance making your JavaScript slow?》
Javascript 相关文章推荐
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
jquery操作select option 的代码小结
Jun 21 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
javascript跨浏览器的属性判断方法
Mar 16 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
Javascript基础教程之变量
Jan 18 Javascript
jquery插件qrcode在线生成二维码
Apr 26 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
继续学习javascript闭包
Dec 03 Javascript
vue源码解析之事件机制原理
Apr 21 Javascript
layui问题之模拟select点击事件的实例讲解
Aug 15 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
引用外部js乱码问题分析及解决方案
Apr 12 #Javascript
关于query Javascript CSS Selector engine
Apr 12 #Javascript
使用jQuery清空file文件域的解决方案
Apr 12 #Javascript
原生js实现查找/添加/删除/指定元素的class
Apr 12 #Javascript
jQuery contains过滤器实现精确匹配使用方法
Apr 12 #Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
Apr 12 #Javascript
Javascript实现滑块滑动改变值的实现代码
Apr 12 #Javascript
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
岗位职责的定义
2013/11/10 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
关于环保的建议书400字
2014/03/12 职场文书
助理政工师申报材料
2014/06/03 职场文书
医院标语大全
2014/06/23 职场文书
2019军训心得体会
2019/06/27 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server