无限分页的设计与实现

最近接手一个微信端的的项目,客户要求在文章列表页面不要用分页。然后项目经理就交代下来,用瀑布流吧(他对前端并不了解),开发组的顿姐姐就说是不是无限分页呀... 然后我就开始自行脑补瀑布流,无限分页,原理不还是一样嘛。自行研究了一下,就开始了造轮子之路...
当然,欢迎来原文看看,原文

1.基本思路

1.1 概述

无限分页,就是说页面在不显示页码,不需要用户去点击页码,使用技术手段实现页面滚动到某一时刻进行加载下一页内容,并且陈列到页面上。这不就是赤裸裸的瀑布流一样的原理么。

1.2 脑补一下

先来补充一个sql语句知识,当然这里只做MySQL的实例

select * from imgs limit 0,8;

查询语句的意思:查询imgs表的所有内容,显示第一页的8条内容从第一条数据开始算起
那么第二页怎么写呢:(直接写出前四页的sql语句,一起来找规律)

第一页     select * from imgs limit 0,8;
结果:     
+----+------------+
| id | src        |
+----+------------+
|  1 | img/01.jpg |
|  2 | img/02.jpg |
|  3 | img/03.jpg |
|  4 | img/01.jpg |
|  5 | img/01.jpg |
|  6 | img/01.jpg |
|  7 | img/01.jpg |
|  8 | img/01.jpg |
+----+------------+
第二页     select * from imgs limit 8,8;
结果:
+----+------------+
| id | src        |
+----+------------+
|  9 | img/01.jpg |
| 10 | img/01.jpg |
| 11 | img/01.jpg |
| 12 | img/01.jpg |
| 13 | img/01.jpg |
| 14 | img/02.jpg |
| 15 | img/02.jpg |
| 16 | img/02.jpg |
+----+------------+
第三页     select * from imgs limit 16,8;
结果:
+----+------------+
| id | src        |
+----+------------+
| 17 | img/02.jpg |
| 18 | img/02.jpg |
| 19 | img/02.jpg |
| 20 | img/02.jpg |
| 21 | img/02.jpg |
| 22 | img/02.jpg |
| 23 | img/02.jpg |
| 24 | img/03.jpg |
+----+------------+
第四页     select * from imgs limit 24,8;
结果:
+----+------------+
| id | src        |
+----+------------+
| 25 | img/03.jpg |
| 26 | img/03.jpg |
| 27 | img/03.jpg |
| 28 | img/03.jpg |
| 29 | img/03.jpg |
| 30 | img/03.jpg |
| 31 | img/02.jpg |
| 32 | img/02.jpg |
+----+------------+

好了,规律想必已经找到了。不过还是要大致说一下这个sql语句意思。
‘limit’后面有两个数字,这就输关键所在,第一个数字是开始的索引值,0代表第一个开始,8代表显示条数,根据第二个数字有规律的改变第一个数字,分页效果就出来了。

1.3 js设计原理

页面总是有个宽度高度的,页面加载完毕,上下滚动页面,有个触发事件,每次到一个合适的条件,就触发事件进行ajax的请求,并将返回的数据加进页面内,就完成一次加载(或者说完成一次加载下一页数据的请求),在代码行内的注释进行更详细的说明

2.代码

2.1 html代码

<div class="container">
    <div class="wrap">
<!--    这里放加载的数据-->
    </div>
    <div class="loader">
<!--    这里放加载时候的加载动画,还有加载完毕后提示信息  -->
    </div>
</div>

2.2 css代码

     * {
            margin: 0;
            padding: 0;
        }
        
        .container {
            width: 640px;
            margin: 0 auto;
            background: #FFF;
        }
        
        .container a {
            display: inline-block;
            margin: 10px;
        }
        
        .container a img {
            width: 100%;
        }
        
        .loader {
            width: 100%;
            text-align: center;
            height: 50px;
            line-height: 50px;
        } 
/* 预设加载动画,css3做的动画效果 */
        .dot {
            width: 18px;
            height: 18px;
            background: #3ac;
            border-radius: 100%;
            display: inline-block;
            animation: slide 1s infinite;
            -webkit-animation: slide 1s infinite;
            margin-left:5px;
            margin-right:5px;
        } 
        .dot:nth-child(1) {
            animation-delay: 0.1s;
            -webkit-animation-delay: 0.1s;
            background: #ccc;
        }
        
        .dot:nth-child(2) {
            animation-delay: 0.2s;
            -webkit-animation-delay: 0.2s;
            background: #ccc;
        }
        
        .dot:nth-child(3) {
            animation-delay: 0.3s;
            -webkit-animation-delay: 0.3s;
            background: #ccc;
        }
        .dot:nth-child(4) {
            animation-delay: 0.4s;
            -webkit-animation-delay: 0.4s;
            background: #ccc;
        }
        
        .dot:nth-child(5) {
            animation-delay: 0.5s;
            -webkit-animation-delay: 0.5s;
            background: #ccc;
        }
        
        @-webkit-keyframes slide {
            0% {
                transform: scale(1);
                -webkit-transform: scale(1);
            }
            50% {
                opacity: 0.3;
                transform: scale(1.2);
                -webkit-transform: scale(1.2);
            }
            100% {
                transform: scale(1);
                -webkit-transform: scale(1);
            }
        }
        
        @keyframes slide {
            0% {
                transform: scale(1);
                -webkit-transform: scale(1);
            }
            50% {
                opacity: 0.3;
                transform: scale(1.2);
                -webkit-transform: scale(1.2);
            }
            100% {
                transform: scale(1);
                -webkit-transform: scale(1);
            }
        }
        

这里放了一个css3做的加载动画,也是在其他博客上看到的,挺好玩,拿来用用

2.3 js代码

$(function () {
            //预设全局变量page,就是用来当做'limit'后面的第一个数字
            var page = 0;
            //给预设一个全局变量,判断一次请求是否完毕,完毕后才能进行下一次请求,防止多次重复进行请求
            var status = true;
            //给预设一个全局变量,判断数据是否已经完全加载完毕,并且已经没有可以再次加载的数据,防止已经没有可加载后还会进行请求,
            var dataStatu = true;
            $(window).scroll(function () {
                //滚动的高度
                var scrollTop = $(window).scrollTop();
                //浏览器可视区域的高度
                var screenHei = $(window).height();
                //文档的总高度
                var bodyHei = $(document).height();
                //计算一个差值,通过这个差值,判断是否进行ajax请求
                var c = bodyHei - screenHei - scrollTop;
                if (c < 100) {
                    //判断是否可以加载数据
                    if (dataStatu == true && status == true) {
                        //可以加载数据,把status状态修改为false
                        status = false;
                        //重置容器‘.loader’为空白
                        $('.loader').html('');
                        //往容器‘.loader’加进加载动画
                        var str = '<div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="dot"></div>';
                        $('.loader').html(str);
                        //调用加载数据的函数
                        getData();
                    }

                }

            });
            //页面加载时先进行一次数据请求
            getData();

            function getData() {
                //引用jq的ajax方法,不解释,好用就行
                $.ajax({
                        //看清楚url带的get参数
                        url: './control/getData.php?page=' + page + '&pageNum=8',
                        type: 'get',
                        dataType: 'text',
                        success: function (data) {
                            //处理返回的json数据
                            var data = JSON.parse(data);
                            //请求已经发送,并且请求的数据已经返回,重置状态码status为false,准备下一次的请求
                            status = true;
                            //sql语句原理说过‘limit’后第一个数字有规律变化,就在这里
                            page += 8;
                            //让数据有个缓冲的过程去过渡一下,给两秒时间,两秒后把请求的数据放进网页里
                            setTimeout(function(){
                                    //重置容器‘.loader’为空白
                                    $('.loader').html(' ');
                                    //判断返回的数据是否为空,由于是处理json后的数据,当然是数组,判断 数组长度是否为0即可
                                    if (data.length == 0) {
                                        //当所有数据已经加载完毕,没有可以在加载的数据,将状态码dataStatu设置为false,不再进行数据请求
                                        dataStatu = false;
                                        console.log('没有数据加载了');
                                        //容器‘.loader’填写数据已经加载完毕的提示
                                        var str = '没有可加载数据了';
                                        $('.loader').html(str);
                                    } else {
                                        console.log('还有数据加载呢.......');
                                    }
                                    //将请求的数据遍历出来,拼接进字符串
                                    var str = '';
                                    for (var i = 0; i < data.length; i++) {
                                        str += '<a href="">';
                                        str += '<img src="' + data[i].src + '" alt="">';
                                        str += '</a>';
                                    }
                                    //将凭借出来的字符串追加进容器内
                                    $('.wrap').append(str);
                            },2000)
                                    
       
                                },
                                error: function (statuCode) {
                                    console.log(statuCode);
                                }
                            });
                    }



                })

3、补充说明

对于page,我这里是get传递0,8,16,24...实际环境下,需要问一下后台人员有木有对page在后台处理,他们可能需要1,2,3,4,5.....就好了;
还有ajax的url参数‘pageNum=8’,后台直接设置的话,前端就不需要传送;
总而言之,实际操作时,还得和后台人员沟通,原理就是这么个原理,有不恰当的地方,希望过路的大神们不吝赐教

4、在线演示

在线演示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,051评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,497评论 18 399
  • 今天,我想矫情一把。 大学的时候,我参与了一本校园杂志的创立,主编是我的好朋友L先生。L先生对我说,我们杂志的第一...
    劲风在路上阅读 568评论 3 1
  • 给童童童的一封信我的小可爱: 你好!请允许我用“我的”作为小可爱的形容词。因为你确确实实地活在我的生活里将近...
    何先生与潘先生阅读 409评论 3 3
  • 一直都在 因为一直爱你 从没有离开 因为 从没有停止想念 不能说 这想念是翻涌的 这翻涌于你太不够温柔 不能说 这...
    懒萌萌阅读 331评论 0 0