有关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 相关文章推荐
display和visibility的区别示例介绍
Feb 26 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
Jan 20 Javascript
JS身份证信息验证正则表达式
Jun 12 Javascript
详解vue-cli 脚手架项目-package.json
Jul 04 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
Oct 26 Javascript
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
在NPM发布自己造的轮子的方法步骤
Mar 09 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
原生JavaScript实现购物车
Jan 10 Javascript
jQuery treeview树形结构应用
Mar 24 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
PHP生成月历代码
2007/06/14 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
Python读写ini文件的方法
2015/05/28 Python
详解Python发送邮件实例
2016/01/10 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
python 常见的排序算法实现汇总
2020/08/21 Python
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
方正Java笔试题
2014/07/03 面试题
初中地理教学反思
2014/01/11 职场文书
校本教研工作方案
2014/01/14 职场文书
班班通校本培训方案
2014/03/12 职场文书
国际金融专业自荐信
2014/07/05 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
学籍证明模板
2015/06/18 职场文书
新年祝酒词大全
2015/08/11 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
Linux中各个目录的作用与内容
2022/06/28 Servers