有关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 相关文章推荐
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
Jul 29 Javascript
JS读取XML文件示例代码
Nov 15 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
全面介绍javascript实用技巧及单竖杠
Jul 18 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
Oct 25 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
浅析Vue 和微信小程序的区别、比较
Aug 03 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
每天学点Vue源码之vm.$mount挂载函数
Mar 11 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 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
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
es6数值的扩展方法
2019/03/11 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
mac系统安装Python3初体验
2018/01/02 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
学习两会精神心得范文
2014/03/17 职场文书
雷人标语集锦
2014/06/19 职场文书
授权委托书范文
2014/07/31 职场文书
演讲稿开场白台词
2014/08/25 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
导游词之江南周庄
2019/12/06 职场文书