页面优化之高性能滚动scroll(防抖和节流)
2017-07-06 20:50
531 查看
js相对于触发scroll和resize等类事件,触发频次非常高,涉及到大量DOM操作和渲染重绘。会影响用户体验。
页面渲染的原理
一个页面展示,主要经过以下步骤:
javascript来实现视觉变化效果
style主要用于匹配CSS样式
layout主要是布局确定每个元素的样式规则,进一步具体计算每个DOM元素最终在屏幕上显示的大小和位置,页面布局是相对的,一个元素变化有可能会联动其他元素的变化。
paint即是绘制的过程,即填充像素的过程,包括绘制文字,颜色,边框和阴影等。一般会在多个层中进行。
Composite即是渲染层合并,对页面中DOM元素的绘制是在多个层中进行的,在每个层完成绘制过程之后,浏览器按照合理的顺序合并成一个图层。
相对于解决高频率的触发事件,常用解决方式是防抖和节流。
防抖(Debouncing)
防抖技术即是可以把多个顺序地调用合并成一次,即规定事件被触发的次数。
节流函数即只允许函数在x毫秒内执行一次
两者优缺点:
防抖动:防抖技术即是可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数。
节流函数:只允许一个函数在 X 毫秒内执行一次,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。
转自博主http://www.cnblogs.com/coco1s/p/5499469.html
页面渲染的原理
一个页面展示,主要经过以下步骤:
javascript来实现视觉变化效果
style主要用于匹配CSS样式
layout主要是布局确定每个元素的样式规则,进一步具体计算每个DOM元素最终在屏幕上显示的大小和位置,页面布局是相对的,一个元素变化有可能会联动其他元素的变化。
paint即是绘制的过程,即填充像素的过程,包括绘制文字,颜色,边框和阴影等。一般会在多个层中进行。
Composite即是渲染层合并,对页面中DOM元素的绘制是在多个层中进行的,在每个层完成绘制过程之后,浏览器按照合理的顺序合并成一个图层。
相对于解决高频率的触发事件,常用解决方式是防抖和节流。
防抖(Debouncing)
防抖技术即是可以把多个顺序地调用合并成一次,即规定事件被触发的次数。
// 防抖动函数 function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; var myEfficientFn = debounce(function() { // 滚动中的真正的操作 }, 250); // 绑定监听 window.addEventListener('resize', myEfficientFn);
节流函数即只允许函数在x毫秒内执行一次
// 简单的节流函数 function throttle(func, wait, mustRun) { var timeout, startTime = new Date(); return function() { var context = this, args = arguments, curTime = new Date(); clearTimeout(timeout); // 如果达到了规定的触发时间间隔,触发 handler if(curTime - startTime >= mustRun){ func.apply(context,args); startTime = curTime; // 没达到触发间隔,重新设定定时器 }else{ timeout = setTimeout(func, wait); } }; }; // 实际想绑定在 scroll 事件上的 handler function realFunc(){ console.log("Success"); } // 采用了节流函数 window.addEventListener('scroll',throttle(realFunc,500,1000));
两者优缺点:
防抖动:防抖技术即是可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数。
节流函数:只允许一个函数在 X 毫秒内执行一次,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。
转自博主http://www.cnblogs.com/coco1s/p/5499469.html
相关文章推荐
- 高性能滚动 scroll 及页面渲染优化
- 高性能滚动 scroll 及页面渲染优化
- 前端高性能滚动 scroll 及页面渲染优化
- 【前端性能】高性能滚动 scroll 及页面渲染优化--转发
- 【前端性能】高性能滚动 scroll 及页面渲染优化
- 前端高性能滚动 scroll 及页面渲染优化
- 【前端性能】高性能滚动 scroll 及页面渲染优化
- 页面优化之高性能函数防抖与节流
- 高性能滚动 scroll 及页面渲染优化
- 高性能滚动 scroll 及页面渲染优化
- 【前端性能】高性能滚动 scroll 及页面渲染优化
- 分享一款页面视差滚动切换jquery.localscroll插件
- sharepoint 2010 页面刷新时滚动条位置保持不变 Controlling scrollbar position on postback
- scrollTop:页面垂直滚动的距离 浏览器兼容代码
- 高性能ASP.NET-常见页面优化
- 【惊天大秘密】才发现CSS设置overflow: scroll也可以实现局部页面滚动
- 浅谈jQuery页面的滚动位置scrollTop、scrollLeft
- 使用iframe window的scroll方法控制iframe页面滚动
- sharepoint 2010 页面刷新时滚动条位置保持不变 Controlling scrollbar position on postback
- jQuery页面的滚动位置scrollTop、scrollLeft