有关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 相关文章推荐
Jquery 设置标题的自动翻转
Oct 03 Javascript
jquery选择器-根据多个属性选择示例代码
Oct 21 Javascript
禁止页面刷新让F5快捷键及右键都无效
Jan 22 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
Sep 28 Javascript
seajs学习教程之基础篇
Oct 20 Javascript
JS设置时间无效问题的解决办法
Feb 18 Javascript
jquery.flot.js简单绘制折线图用法示例
Mar 13 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
微信小程序表单弹窗实例
Jul 19 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 Javascript
React实现todolist功能
Dec 28 Javascript
JavaScript异步操作中串行和并行
Nov 20 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示例代码(推荐)
2010/09/08 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
详解vue-cli官方脚手架配置
2018/07/20 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
python pandas时序处理相关功能详解
2019/07/03 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
一套SQL笔试题
2016/08/14 面试题
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL