有关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 相关文章推荐
JS获取父节点方法
Aug 20 Javascript
js获取客户端外网ip的简单实例
Nov 21 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
温习Javascript基础语法之词法结构
May 31 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
浅析从vue源码看观察者模式
Jan 29 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模拟HTTP认证
2006/10/09 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
javascript中的this详解
2014/12/08 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python的绘图工具matplotlib使用实例
2014/07/03 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python微信好友数据分析详解
2018/11/19 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
中科创达面试题
2016/12/28 面试题
介绍一下XMLHttpRequest对象
2012/02/12 面试题
我未来的职业规划范文
2014/01/11 职场文书
个人委托书
2014/07/31 职场文书
师德师风学习材料
2014/12/19 职场文书
技术员个人工作总结
2015/03/03 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
js 实现验证码输入框示例详解
2022/09/23 Javascript