JS 之性能优化(2)
继续上一篇的JS性能优化之后,下面接着讲关于前端性能优化的内容。如果有不对的地方欢迎纠正。
1.避免过多的重排与重绘操作。
尽量将DOM中的多个读操作放一起,中间不要插入写的操作,因为写操作会导致浏览器迅速的重排,从而影响性能。将DOM中的多个写操作放一起,不要插入读的操作,如果插入读操作会导致浏览器多次重排。也就是DOM中读写操作分开。
2.缓存重排获取的值
避免下次用到该值的时候,浏览器又需要重排。
3.通过设置样式名来修改元素样式
通过改变元素的class,或者csstext属性来改变元素的样式。
4.尽量使用离线DOM来操作节点
例如操作Document Fragment对象,完成后把这个对象插入到实际的DOM中。或者cloneNode()方法,在克隆的节点上操作,再用克隆的节点替换原节点。
5.对操作频繁的元素使用display:none,然后对其操作,操作完后恢复显示display:block
这样处理的话,浏览器相当于渲染页面只有两次(隐藏或显示)。不可见的元素不影响重排或重绘。
6.将元素设为position:fixed或absolute,重排的开销会很小
因为被定位的元素不会影响其他元素的布局。
7.使用虚拟DOM的脚本库
比如React等。
8.使用window.requestAnimationFrame(),window.requestIdleCallback()
这两个方法调节重新渲染。
requestAnimationFrame(func),传一个函数进去当作参数,这个函数是一个屏幕重绘前被调用的函数,等下次浏览器渲染时执行函数里的操作。其实这个跟setTimeout()类似,只是间隔时间是由浏览器自己(下次渲染)来决定。这个方法解决了浏览器不知道Javascript动画正在执行和不知道多少才是合适的间隔的问题。
兼容写法:mozRequestAnimationFrame() || msRequestAnimationFrame() || weibkitRequestAnimationFrame() || oRequestAnimationFrame()
使用场景比如:重复执行的函数,JS动画(滑动),页面滚动,页面放大缩小等。
案例:
<script>
function scroll(elem){
var hei = elem.clientHeight;
window.requestAnimationFrame(function(){
elem.style.height = (hei*2) + 'px';
})
}
function scroll2(elem){
var hei = elem.clientHeight;
elem.style.height = (hei*2) + 'px';
} elem = document.getElementById('elem');
console.time('a');
for(var i=0;i<100000;i++){
scroll(elem);
}
console.timeEnd('a'); console.time('b');
for(var i=0;i<100000;i++){
scroll2(elem);
}
console.timeEnd('b');
</script>
log里输出:
a: 389.112ms
b: 3922.486ms
很明显,使用requestAnimationFrame()方法后执行更有效率。不过该方法也有兼容性问题,是否使用还得看项目而定。
参考:http://www.ruanyifeng.com/blog/2015/09/web-page-performance-in-depth.html
JS 之性能优化(2)的更多相关文章
- Babylon.js官方性能优化文档中文翻译
在这里列出Babylon.js官方性能优化文档的中英文对照,并在CardSimulate项目里对其中的一些优化方法进行实践. How To 如何 Optimize your scene 优化你的场景 ...
- 多个JS文件性能优化
页面中引入的JS文件是阻塞式加载的,这样会影响页面性能.以下是JS文件性能优化方法: 一:将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在 ...
- JS 之性能优化(1)
了解JS性能优化是学习前端必备的一项技能.下面就简单的列出几点: 1.注意作用域,避免全局查找. 访问全局变量比访问局部变量慢,是因为需要遍历作用域链,查找作用域链需要额外的时间.所以在一个函数中,将 ...
- [Ext JS 4]性能优化
一般的优化技巧 1. 检查你定义的时间监听器 正确的设置事件监听器对性能会有很大的影响. 举例来说, 在定义一个store的时候,设置一个load 的事件去触发从后台读取数据,如果设置single 的 ...
- js前端性能优化之函数节流和函数防抖
前言:针对一些会频繁触发的事件如scroll.resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能 节流: 节流:使得一定时间内只触发一次函数. 它和防抖动最 ...
- [js] 前端性能优化
原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html 链接:http://www.zhihu.com/question/21658448/answe ...
- js代码性能优化的几个方法
相信写代码对于大部分人都不难,但想写出高性能的代码就需要一定的技术积累啦,下面是一些优化JavaScript代码性能的常见方法. 一.注意作用域 1.避免全局查找 使用全局变量和函数肯定要比局部的开销 ...
- Ext.js性能优化漫谈
Ext.js是一个用于建立企业级应用的纯JS框架.毫无疑问,它为我们提供了大量的组件,比如container,panel,field,grid,这些组件使用起来很方便,不需要去写js和html,但是e ...
- js加载优化三
Javascript性能优化之异步加载和执行 Author:小欧2013-09-17 随着科技的发展,如今的网站和五六年前相比,现在的人们对web的要求越来越高了,用户体验,交互效果,视觉效果等等都有 ...
随机推荐
- Objective-C之优雅的命名
There are only two hard things in Computer Science: cache invalidation and naming things.在计算机科学中只有两件 ...
- UIWebView用法详解及代码分享
今天我们来详细UIWebView用法.UIWebView是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件. 用UIWebView我们就 ...
- 自增build ID配置
本文转载出自:http://blog.sina.com.cn/s/blog_13ec67adc0102wimg.html Build在plist文件中的key是“CFBundleVersion”, ...
- 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话
背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...
- Effective Java 58 Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
Three kinds of throwables Throwables Checked Recoverable checked exceptions Y Y runtime exceptions N ...
- Force.com平台基础
当我开始写这篇博客的时候,<Force.com Platform Fundamentals>的PDF版本我还没看到十分之一.由于PDF全部是英文的,所以我看起来比较吃力.我尝试过边看边做笔 ...
- 大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
大数据架构-使用HBase和Solr将存储与索引放在不同的机器上 摘要:HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索 ...
- 20150912华为机考1之"输入一个字符串,将其中出现次数最多的字符输出"
不吐槽华为的服务器了,直接上正文 输入:字符串(英文字母),长度不超过128 输出:出现频率最高的字母 思路写在注释文档 /* Input a string * Output the most fre ...
- 使用selenium实现右键另存为保存文件
1.需要借住autoit工具和Robot类,下载地址:https://www.autoitscript.com/site/autoit/downloads/ 2.autoit的使用不再详细讲解.如下图 ...
- 2016.6.12 codevs搜索练习
1.codevs 3143 二叉树的序遍历 /*只要把输出根节点的位置调换一下就可以了*/ #include<iostream> using namespace std; #include ...