移动端长列表滚动优化

简介: 当移动端无限加载列表的滚动的时候,如果不做处理就会出现性能问题,会出现卡顿等问题,这时候就需要去优化。思路可以把数据分成一屏一屏加载,初始化加载2屏数据往下滚动监测到滚动到底部后,添加一屏数据,同时把第一屏数据移除掉,并改变滚动条的位置往上滚动监测到滚动到顶部后,把之前移除掉的数据添加到...

当移动端无限加载列表的滚动的时候,如果不做处理就会出现性能问题,会出现卡顿等问题,这时候就需要去优化。

思路

  • 可以把数据分成一屏一屏加载,初始化加载2屏数据
  • 往下滚动监测到滚动到底部后,添加一屏数据,同时把第一屏数据移除掉,并改变滚动条的位置
  • 往上滚动监测到滚动到顶部后,把之前移除掉的数据添加到顶部,同时把最后一屏数据移除掉,并改变滚动条的位置
  • 无论往上还是往下,都确保只有两屏数据在页面内

完整代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>长列表滚动</title>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">

<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    *{
        margin: 0;
        padding: 0;
    }
    .page li{
        height: 50px;
        padding: 0 10px;
        /*background: #f2f2f2;*/
    }
</style>
</head>
<body>
    <div id="list"></div>

    <script type="text/javascript" src="../../js/lib/jquery-3.3.1.js"></script>
    <script type="text/javascript">
        var PAGE = 1; //初始化页数
        var PAGESIZE = 15; //每页展示几条数据

        var $list = $('#list'); //列表

        var preRemoveArray = []; //被移除的当前页面之前的页面
        var nextRemoveArray = []; //被移除的当前页面后面的页面

        var init = function() {
            initPage();
            initEvent();
        };

        var initPage = function() {
            renderData();
        };

        var initEvent = function() {
            var $page;
            var length;
            window.onscroll = function() {
                if (isTop()) {
                    if (preRemoveArray[0]) {
                        length = preRemoveArray.length;
                        $page = $($('.page')[$('.page').length - 1]); //获取当前列表中显示的最后一页
                        nextRemoveArray.push($page[0].outerHTML); //将最后一页内容数组
                        $list.prepend(preRemoveArray.pop(length - 1)); //将上一页内容添加进列表
                        console.log(document.documentElement.scrollTop)
                        document.documentElement.scrollTop = document.documentElement.scrollTop + $($('.page')[0]).height(); //设置滚动条位置
                        console.log(document.documentElement.scrollTop)
                        $page.remove(); //移除最后一页
                    }
                } else if (isBottom()) {

                    $page = $($('.page')[0]); //获取当前列表中显示的第一页
                    preRemoveArray.push($page[0].outerHTML); //将第一页内容数组

                    if (nextRemoveArray[0]) { //如果已经浏览过下面的内容
                        length = nextRemoveArray.length;
                        $list.append(nextRemoveArray.pop(length - 1)); //将下一页内容添加进列表
                    } else { //如果没有浏览过下面的内容
                        renderSinglePage();
                    }
                    console.log(document.documentElement.scrollTop)
                    document.documentElement.scrollTop = document.documentElement.scrollTop - $page.height(); //设置滚动条位置
                    console.log(document.documentElement.scrollTop)
                    $page.remove(); //移除第一页
                }
            };
        };

        var renderData = function() {
            var innerHTML = '';

            //我设定它永远只显示两页,所以一开始先加载两页数据出来
            for (var i = 0; i < 2; i++) {
                innerHTML += getData();
            }

            $list.append(innerHTML);
        };

        var renderSinglePage = function() {
            var innerHTML = '';
            innerHTML += getData();
            $list.append(innerHTML);
        };

        var getData = function() {
            var innerHTML = '';
            innerHTML += '<div class="page page-' + PAGE + '">';

            for (var i = 0; i < PAGESIZE; i++) {
                innerHTML += '<li>' + PAGE + '</li>'; //为方便看的清楚,我们给每行数据标记它是属于第几页的
            }

            innerHTML += '</div>';
            PAGE++;

            return innerHTML;
        };

        var isBottom = function() {
            return getScrollTop() + window.screen.height == document.body.clientHeight;
        };

        var isTop = function() {
            return getScrollTop() === 0;
        };
        function getScrollTop(){
            return document.documentElement.scrollTop || document.body.scrollTop;
        }

        init();
    </script>
</body>
</html>
AI 代码解读
相关文章
使用 openssl 生成证书
一、openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。官网:https://www.openssl.
8816 0
移动端滚动分页解决方案
移动端滚动分页解决方案
169 4
使用Kimi+Markmap总结文件内容生成思维导图原创
一份文件内容太长,完整阅读下来太费时间,但如果使用AI进行内容提炼,再总结成思维导图,方便快速看到这份文件的核心内容和主题结构,就会极大地节约时间,目前就可以使用Kimi+Markmap这两个工具,帮我们把ppt、word、pdf等文件内容快速总结成思维导图。
2009 8
使用Kimi+Markmap总结文件内容生成思维导图原创
uniapp 普通页面跳转到tabBar页面详解(附加代码+uni.switchTab使用)
uniapp 普通页面跳转到tabBar页面详解(附加代码+uni.switchTab使用)
962 1
深度优先遍历(DFS):探索图的奥秘
当进行深度优先遍历(DFS)时,我们需要按照一定的步骤来遍历图中的节点。 选择起始节点:选择图中的一个起始节点作为遍历的起点。 标记已访问:将起始节点标记为已访问,并将其放入数据结构中,比如栈或递归调用。 探索相邻节点:从起始节点开始,探索与其相邻的节点。这是通过查找邻接表来实现的,邻接表存储了每个节点的相邻节点信息。 深入探索:选择一个相邻节点,标记为已访问,并将其放入数据结构中。然后,从这个相邻节点出发,继续探索其相邻节点,形成一个深入的路径。这一步是递归的核心。 回溯:当没有未访问的相邻节点时,回溯到上一个节点,继续探索其他未访问的相邻节点。这可以通过从数据结构中弹出节点来实现,或者从递
464 0
多场景下 3-11 倍性能提升,Apache Doris 1.2 新版本性能揭秘!
多场景下 3-11 倍性能提升,Apache Doris 1.2 新版本性能揭秘!
289 0
AI助理
登录插画

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

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

你好,我是AI助理

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