首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >window resize和scroll事件性能优化

window resize和scroll事件性能优化

作者头像
前端迷
发布2019-05-28 19:40:20
1.8K0
发布2019-05-28 19:40:20
举报
文章被收录于专栏:前端迷前端迷前端迷

只要用户改变窗口大小,会对内部一些元素大小重新计算,可能导致整个页面重新渲染,最终导致大量消耗 CPU。比如调用 resize 方法,用户改变窗口大小时会不停的被触发, 低版本的IE 会可能陷入假死状态。window的scroll事件也是如此,鼠标滚动或拖动滚动条,就会不停的触发scroll事件,如果处理的东西多,低版本的IE也会陷入假死状态。

基本的优化思路:在一定的时间之内,只执行一次resize事件函数,建议使用requestAnimationFrame(https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), setTimeout 或者 customEvent(https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent), 比如:

requestAnimationFrame

var optimizedResize = (function() {    var callbacks = [],        running = false;    // fired on resize event    function resize() {        if (!running) {            running = true;            if (window.requestAnimationFrame) {                window.requestAnimationFrame(runCallbacks);            } else {                setTimeout(runCallbacks, 66);            }        }    }    // run the actual callbacks    function runCallbacks() {        callbacks.forEach(function(callback) {            callback();        });        running = false;    }    // adds callback to loop    function addCallback(callback) {        if (callback) {            callbacks.push(callback);        }    }    return {        // public method to add additional callback        add: function(callback) {            if (!callbacks.length) {                window.addEventListener('resize', resize);            }            addCallback(callback);        }    }}());// start processoptimizedResize.add(function() {    console.log('Resource conscious resize callback!')});
setTimeout
(function() {  window.addEventListener("resize", resizeThrottler, false);  var resizeTimeout;  function resizeThrottler() {    // ignore resize events as long as an actualResizeHandler execution is in the queue    if ( !resizeTimeout ) {      resizeTimeout = setTimeout(function() {        resizeTimeout = null;        actualResizeHandler();       // The actualResizeHandler will execute at a rate of 15fps       }, 66);    }  }  function actualResizeHandler() {    // handle the resize event    ...  }}());
requestAnimationFrame + customEvent
;(function() {    var throttle = function(type, name, obj) {        obj = obj || window;        var running = false;        var func = function() {            if (running) { return; }            running = true;             requestAnimationFrame(function() {                obj.dispatchEvent(new CustomEvent(name));                running = false;            });        };        obj.addEventListener(type, func);    };    /* init - you can init any event */    throttle("resize", "optimizedResize");})();// handle eventwindow.addEventListener("optimizedResize", function() {    console.log("Resource conscious resize callback!");});

scroll事件优化同理。

效果如图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端迷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • requestAnimationFrame
    • setTimeout
      • requestAnimationFrame + customEvent
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档