window resize和scroll事件性能优化

简介: window resize和scroll事件性能优化

只要用户改变窗口大小,会对内部一些元素大小重新计算,可能导致整个页面重新渲染,最终导致大量消耗 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 process
optimizedResize.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 event
window.addEventListener("optimizedResize", function() {
    console.log("Resource conscious resize callback!");
});

scroll事件优化同理。

效果如图:

1f3a8c336a51b69795fab6601531572f_640_wx_fmt=gif&wxfrom=5&wx_lazy=1.gif


目录
打赏
0
0
0
0
22
分享
相关文章
|
9月前
|
vertx的学习总结7之用kotlin 与vertx搞一个简单的http
本文介绍了如何使用Kotlin和Vert.x创建一个简单的HTTP服务器,包括设置路由、处理GET和POST请求,以及如何使用HTML表单发送数据。
123 2
vertx的学习总结7之用kotlin 与vertx搞一个简单的http
Lettuce的特性和内部实现问题之Lettuce的多连接模式与连接池模式有何不同
Lettuce的特性和内部实现问题之Lettuce的多连接模式与连接池模式有何不同
224 2
阿里云服务器租用价格表,2024年5月最新报价整理
2024年5月,阿里云发布了最新的服务器租用价格表。其中,ECS云服务器2核2G3M带宽年费99元,ECS u1实例2核4G5M年费199元。轻量应用服务器香港30M带宽月费24元,年费288元。此外,还提供4核16G10M和8核32G10M的不同配置选项,价格分别为30元/月和109元/月起。阿里云服务器分为ECS和轻量应用服务器,当前优惠主要针对ECS。更多详细配置和价格可在官方页面查看。同时,阿里云有多种优惠活动,包括免费试用、学生优惠等,可在活动中心了解。
1092 9
不使用el-form仅仅单独给el-input设置表单校验
不使用el-form仅仅单独给el-input设置表单校验
662 0
Monorepo,大型前端项目管理模式实践
阅读本文您将了解到:什么是 monorepo、为什么要 monorepo、如何实践 monorepo。
7759 50
Monorepo,大型前端项目管理模式实践
移动端H5不能自由选中文本进行复制的问题
移动端H5不能自由选中文本进行复制的问题
347 0
一文搞懂Vue3中watch和watchEffect区别和用法!
前言 使用过 Vue 的小伙伴,不管时 Vue2 还是 Vue3,我相信你都用过 Vue 中的监听器。监听器的作用就和它的名字一样:用来监听某个东西是否发生变化!我们很多需求都会用到监听器 watch,但是 Vue2 和 Vue3 中的监听器的用法有些许不一样,这就让一些从 Vue2 转 Vue3 的小伙伴不太适应,所以,我们今天就来好好学一学 Vue3 中的监听器如何使用!
1863 0
一文搞懂Vue3中watch和watchEffect区别和用法!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问