有关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基础整理1
Dec 06 Javascript
JS定时刷新页面及跳转页面的方法
Jul 04 Javascript
固定表格行列(expression)在IE下适用
Jul 25 Javascript
基于js与flash实现的网站flv视频播放插件代码
Oct 14 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
angular.js+node.js实现下载图片处理详解
Mar 31 Javascript
微信JS-SDK选取手机照片上传功能
Apr 21 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 Javascript
引用外部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
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
jquery 指南/入门基础
2007/11/30 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
vue.js实现双击放大预览功能
2020/06/23 Javascript
Python 常用 PEP8 编码规范详解
2017/01/22 Python
django和flask哪个值得研究学习
2020/07/31 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
安全检查汇报材料
2014/12/26 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
暑期家教宣传单
2015/07/14 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
Python time库的时间时钟处理
2021/05/02 Python
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技