有关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写的一个链表实现代码
Oct 25 Javascript
jquery css 设置table的奇偶行背景色示例
Jun 03 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
Javascript基础教程之变量
Jan 18 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
js中实现字符串和数组的相互转化详解
Jan 24 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
简单实现js拖拽效果
Jul 25 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
Vue脚手架的简单使用实例
Jul 10 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
一个改进的UBB类
2006/10/09 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
深入理解js promise chain
2016/05/05 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
Python异常处理总结
2014/08/15 Python
Python中常见的异常总结
2018/02/20 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python实现多线程的两种方式分析
2018/08/29 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
盛大笔试题
2016/11/05 面试题
给领导的致歉信范文
2014/01/13 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
企业法人代表证明书
2014/09/27 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
台风停课通知
2015/04/24 职场文书