有关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 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
Nov 23 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
Sep 17 Javascript
vue获取data数据改变前后的值方法
Nov 07 Javascript
vue基于v-charts封装双向条形图的实现代码
Dec 09 Javascript
详解JavaScript作用域 闭包
Jul 29 Javascript
微信小程序实现自定义底部导航
Nov 18 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 常用的header头部定义汇总
2015/06/19 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Open and Print a Word Document
2007/06/15 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
JavaScript生成图形验证码
2020/08/24 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
Python多进程原理与用法分析
2018/08/21 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
Python爬取梨视频的示例
2021/01/29 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
法学个人求职信范文
2014/01/27 职场文书
青年文明号复核材料
2014/02/11 职场文书
自强之星事迹材料
2014/05/12 职场文书
五四演讲稿范文
2014/09/03 职场文书
出纳试用期自我评价
2015/03/10 职场文书
美德少年主要事迹材料
2015/11/04 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python