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的要求越来越高了,用户体验,交互效果,视觉效果等等都有 ...
随机推荐
- Java部分总结图片版(已经加上原图链接下载!!!)
Java基础知识图片版(原图下载链接)
- Linux套接字编程
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- 一步步学敏捷开发:6、Scrum的3种工件
Scrum的3种工件包括:Product Blacklog.Sprint Backlog.完成标准. 1.产品待办事项列表(Product Backlog) 产品Blacklog是Scrum中的核心工 ...
- Effective Java 73 Avoid thread groups
Thread groups were originally envisioned as a mechanism for isolating applets for security purposes. ...
- C语言指针学习(续)
五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *ar ...
- nyoj 42 一笔画问题 欧拉路径
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...
- Linux 之创建工作目录-mkdir
在Linux下创建工作目录,一般使用 "mkdir" 指令,一下将介绍"mkdir"指令的使用方法,供大家参考. 一.使用帮助 在Linux终端(命令行)输入: ...
- spring mvc 和junit 4集成的注意点
常规步骤: 1.导入jar包,主要有两个,spring-test 和 junit4,主要用maven管理,直接依赖即可.可以在这个网站上进行查找或下载:http://mvnrepository.com ...
- scons使用
1.概述 scons是一个Python写的自动化构建工具,和GNU make相比优点明显: A.移植性:python能运行的地方,就能运行scons B. 扩展性:理论上scons只是提供 ...
- 移动web页面使用的字体的思考
前言 记得做PC端页面的时候,字体一般设置为微软雅黑,现在做起移动端页面来了,设计师们一般都还把字体设置为微软雅黑字体,但是做出来后,测试的时候发现页面中的字体不是微软雅黑,怎么办? 后来了解到的手机 ...