You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何衡量/对比滚动事件中JS元素可见性判断函数的性能

jQuery vs 原生JS滚动元素可见性判断函数性能对比

我写了两个用于判断滚动时元素是否可见的布尔型函数,分别基于jQuery和原生JS,目标是对比两者的执行效率与性能影响。一开始觉得performance.now()直接在滚动事件里调用不合适,于是改用for循环反复调用函数的方式测量整体执行耗时。

测试结果

多次测试数据一致:原生JS版本5000次调用耗时约15ms,jQuery版本耗时约135ms。进一步排查发现,jQuery的offset()方法是主要性能瓶颈,将其替换为原生JS等效逻辑后,耗时可减少约100ms。

jQuery版本函数代码

function isVisible( scrollDistance, element ) {
    let wrapperOffset = $('#scroll-wrapper').offset().top;
    var elemOffset = element.offset().top;
    var top = elemOffset - wrapperOffset - wh;
    var btm = elemOffset - wrapperOffset + element.outerHeight();
    if ( scrollDistance > top && scrollDistance < btm ) {
        return true;
    }
}

原生JS版本函数代码

function isVisible( scrollDistance, element ) {
    let elem = element[0];
    var wrapperOffset = document.getElementById("scroll-wrapper").getBoundingClientRect().top + window.scrollY;
    var elemOffset = elem.getBoundingClientRect().top + window.scrollY;
    var top = elemOffset - wrapperOffset - wh;
    var btm = elemOffset - wrapperOffset + elem.offsetHeight;
    if ( scrollDistance > top && scrollDistance < btm ) {
        return true 
    }
}

测试循环代码

let start = performance.now(); // start time
for (x = 0; x < 5000; x++) {
    isVisible( 0, element );
    if ( x == 4999 ) {
        let stop = performance.now(); // end time
        console.log( stop-start )
    }
}

结论

从测试数据可以明确,原生JS版本的性能远优于jQuery版本。核心原因在于jQuery的offset()方法内部做了大量兼容性处理与封装逻辑,相比原生getBoundingClientRect()直接获取位置信息,额外开销显著。如果需要在高频触发的滚动事件中使用这类判断逻辑,优先选择原生JS实现能有效降低性能损耗。

内容的提问来源于stack exchange,提问作者Toki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:18:31