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

无限滚动功能问题:滚动时浏览器频繁卡顿求解

无限滚动功能优化求助

我为项目开发了一个无限滚动功能(index.php),当用户滚动到页面底部时,会从带offset参数的load.php加载内容。目前遇到两个问题:

  • 移动设备浏览器(iOS端Firefox和Safari)滚动时会短暂卡顿1-2秒,之后才能继续滚动,体验很差
  • 笔记本/PC端(Win10系统的Firefox和Edge)功能正常,但加载新内容时滚动条会快速上下跳动,无法稳定,观感不佳

原代码片段

HTML(index.php)

<!-- Fallback -->
<div id="no" style="display:none">
   No Content found...
</div>

<!-- Infinity -->
<div id="inf-0"></div><div id="inf-3" style="display:none"></div><div id="inf-6" style="display:none"></div><div id="inf-9" style="display:none"></div><div id="inf-12" style="display:none"></div><div id="inf-15" style="display:none"></div><div id="inf-18" style="display:none"></div><div id="inf-21" style="display:none"></div><div id="inf-24" style="display:none"></div><div id="inf-27" style="display:none"></div><div id="inf-30" style="display:none"></div><div id="inf-33" style="display:none"></div><div id="inf-36" style="display:none"></div><div id="inf-39" style="display:none"></div><div id="inf-42" style="display:none"></div><div id="inf-45" style="display:none"></div> ...

<!-- Spinner -->
<center><i class="fas fa-spinner fa-pulse fa-2x" id="spinner"></i></center>

JavaScript

var end = 0;
var infinity = 0;

window.addEventListener('load', function () {
    feed(infinity);
    infinity = infinity+3;
});

$(window).scroll(function() { 
    if(end == 0) {
        if($(window).scrollTop() + $(window).height() > $(document).height() - 75) {
            document.getElementById("inf-"+infinity).style.display = "block";
            feed(infinity);
            infinity = infinity+3;
        }
    }
});

function feed(infinity) {
    $("#inf-" + infinity).load("load.php?off="+infinity+"&url="+encodeURIComponent(window.location.href), function( response, status, xhr ) {
        if (response == "") {
            document.getElementById("spinner").style.display = "none";
            document.getElementById("inf-"+infinity).style.display = "none";
            end = 1;
        } else {
            if (response == "no") {
                document.getElementById("spinner").style.display = "none";
                document.getElementById("inf-"+infinity).style.display = "none";
                document.getElementById("no").style.display = "block";
                end = 1;
            } else {
                document.getElementById("spinner").style.display = "block";
            }
        }  
    });
}

优化方案

1. 防抖处理滚动事件

滚动事件会高频触发,直接绑定会导致多次执行加载逻辑,引发卡顿和滚动条跳动。添加防抖函数限制触发频率:

// 防抖函数:延迟执行,避免高频触发
function debounce(func, delay) {
  let timer;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(func, delay);
  };
}

// 替换原滚动事件监听
$(window).scroll(debounce(function() { 
    if(end === 0 && !isLoading) {
        const scrollBottom = $(window).scrollTop() + $(window).height();
        const pageHeight = document.documentElement.scrollHeight;
        if(scrollBottom > pageHeight - 75) {
            isLoading = true;
            // 动态创建容器替代提前写死的div
            const container = $('<div id="inf-' + infinity + '"></div>').appendTo('#infinite-container');
            feed(infinity, container);
            infinity += 3;
        }
    }
}, 150)); // 150ms延迟,可根据需求调整

2. 新增加载锁避免重复请求

添加全局变量isLoading,确保同一时间只有一个加载请求在进行:

var end = 0;
var infinity = 0;
var isLoading = false; // 加载锁

function feed(offset, container) {
    container.load("load.php?off="+offset+"&url="+encodeURIComponent(window.location.href), function( response, status, xhr ) {
        isLoading = false; // 请求完成后解锁
        if (response === "") {
            $("#spinner").hide();
            container.remove();
            end = 1;
        } else if (response === "no") {
            $("#spinner").hide();
            container.remove();
            $("#no").show();
            end = 1;
        } else {
            $("#spinner").show();
        }  
    });
}

3. 优化DOM结构,动态创建容器

原代码提前创建大量空div,增加DOM节点数量影响性能。改为动态创建容器:

<!-- 简化HTML结构 -->
<div id="infinite-container"></div>
<div id="no" style="display:none">No Content found...</div>
<center><i class="fas fa-spinner fa-pulse fa-2x" id="spinner"></i></center>

4. 修正滚动位置计算逻辑

移动端浏览器地址栏动态变化会导致$(document).height()计算不准,改用document.documentElement.scrollHeight获取准确页面高度:

const scrollBottom = $(window).scrollTop() + $(window).height();
const pageHeight = document.documentElement.scrollHeight;
if(scrollBottom > pageHeight - 75) {
    // 加载逻辑
}

5. 移动端滚动性能优化

给内容容器添加CSS开启硬件加速,减少滚动卡顿:

#infinite-container {
    will-change: transform;
    transform: translateZ(0);
    backface-visibility: hidden;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:40:42