有关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面向对象编程(二) 构造函数的继承
Aug 28 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
深入学习JavaScript对象
Oct 13 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
Angularjs的ng-repeat中去除重复数据的方法
Aug 05 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
js事件冒泡与事件捕获详解
Feb 20 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 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
PHP执行速率优化技巧小结
2008/03/15 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
Python 监测文件是否更新的方法
2019/06/10 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python二元表达式用法
2019/12/04 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
开放系统互连参考模型
2016/06/29 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
大学生职业生涯规划书汇总
2014/03/20 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
《社戏》教学反思
2016/02/22 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python