zoukankan      html  css  js  c++  java
  • 通过监测滚动条实现无限滚动

    本文的核心是检测滚动条的滑动:

      1.是否滚动到底部?

      2.上滚动还是下滚动?

    怎样检测浏览器是否滚动到底部?

      需要检测3个值:scrollTop(滚动区顶部到可视区顶部的距离),clientHeight(可视区高度),scrollHeight(滚动区总高度),下图很好的解释了各自位置:

    下面代码分别获取上述三个属性值:

    1  var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;          
    2   var clientHeight = document.documentElement.clientHeight;                
    3   var scrollHeight = document.body.scrollHeight;

    当这三个值获取到之后,通过下面代码计算差值来判断是否到底:

    1 if (scrollTop >= scrollHeight - clientHeight ) {
    2                    alert("到底!");  // 滚动到底部啦!!
    3                     }

    当然,实际应用中并不是滚动到底部才开始加载数据,这样就慢了一拍,常用的判断是快滚动到底部了就开始加载数据,那就设一个值吧,比如:离滚动条底部还差200px的时候就开始加载数据:

    1 if (scrollTop >= bodyHeight - clientHeight  -  200 ) {
    2                   
    3                     alert("据底部200px");  // 离底部还有200px!赶紧加载新数据吧!
    4                    
    5                     }

    上面就是滚动条检测的方法,其基本原理很简单,让哪个容器滚动就获取那个容器的scrollTop,clientHeight,scrollHeight即可,这里需要注意的是:在该容器的css代码中千万不要overflow:hidden;这样滚动条就不会出现了,overflow值要为auto或scroll。而我们要做的是无限滚动,也就是说在检测到底时添加新数据,公司代码一般会在此时发送ajax请求,本文后续的demo中就用插入新元素节点的方式代替吧。

    怎样检测浏览器是上滚动还是下滚动?

      这里需要引入一个临时变量temp来保存scrollTop的值,其核心思想是:当滚动时scrollTop是时刻更新的,往下滚动scrollTop增加,网上滚动scrollTop减小,把scrollTop赋给临时变量temp,然后用最新的scrollTop值与temp(旧的scrollTop值)比较大小,大于temp则上滚动,否则下滚动:

     1   var temp = 0;
     2    window.onscroll=function (){    
     3    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;        
     4    var clientHeight = document.documentElement.clientHeight;                
     5    var scrollHeight = document.body.scrollHeight;
     6         
     7         if (scrollTop <= temp) //起初只能下滚动,判断scrollTop小于则为向上滚动
     8                 { 
     9                     console.log("你在往上滚!");
    10                 } 
    11                 else 
    12                 {
    13                     console.log("你在往下滚!"); 
    14                 }
    15             temp = scrollTop; //最关键的一句代码,时刻更新temp的值
    16     };

    你看,原理就是这么简单。

    实例效果

      下面用jquery来实现一个类似效果的demo(目前还是不知道博客园中怎么开通“运行代码”功能,所以先上代码吧):

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>无限滚动加载</title>
        <script type="text/javascript" src="./jquery-1.7.2.js"></script>
        <script type="text/javascript" src="./chajian.js"></script>
        <style type="text/css" rel="stylesheet">
        *{margin: 0;padding: 0;}  
        #main {background-color: green;height: 900px; margin: 0 auto; overflow: auto;  800px;}
        #message{ 250px; height:100px;background-color: orange;position: fixed;top:0px;left:1080px;font-size: 20px;text-align: center;}
        li { background-color: purple; 500px;height: 100px; margin-top: 10px;color: #fff;font-size: 40px;text-align: center; list-style: none;line-height: 100px;}
        </style>
    
    <script type="text/javascript">
    $(function () {
        var num = 10;//创建新li的序列号初始值
        var temp = 0;//为判断上下滚动设置的临时参考值
    
        $("#main").scroll(function () {
    
         var scrollTop = $(this).scrollTop();
         var clientHeight = $(this).height();
         var bodyHeight = $(this).prop("scrollHeight"); // 或$(this)[0].scrollHeight;或$(this).get(0).scrollHeight;
    
        if (scrollTop <= temp) //起初只能下滚动,判断scrollTop小于则为向上滚动
        { 
            $("#message").html("上滚动!<br> scrollTop:"+scrollTop+"px<br/>"+"temp:"+temp+"px");
        } 
        else 
        {
            $("#message").html("下滚动!<br> scrollTop:"+scrollTop+"px<br/>"+"temp:"+temp+"px");    
        }
        temp = scrollTop; //最关键的一句代码,时刻更新参考temp的值
        
        if (scrollTop >= bodyHeight - clientHeight-10 ) {
            //也可在此处设置延迟,让用户更清晰的感到加载的瞬间,但在IE下会出现多次加载的问题
            /*setTimeout(function () {
                longer();  
             }, 300);*/
            longer();
            }            
        });
        //滚动到底部时执行,创建新结点插入到ul中
        function longer() {
            for (var i = 0; i < 10; i++) {
                num++;  //更新li标签序号
                $("ul").append("<li>" + num + "</li>");                 
            }
        }       
    })
    </script>
    </head>
    <body>
    <div id="message">滚动信息</div>
    <div id="main">
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>7</li>
            <li>8</li>
            <li>9</li>
            <li>10</li>
        </ul>
    </div>
    </body>
    </html>

    封装成插件

      其实没必要封装成插件,这样做的目的只是为了练练手,毕竟自己还没写过像样的插件,想了一下,该插件就命名为scrollToBottom.js,用法为 $("XX").scrollToBottom(200 , function(){........})。第一个参数200为距离底部的距离,第二个参数就是到底部要执行函数,当然也可只传入一个函数作为参数,那就默认滚动条完完全全滚动到底部才执行函数。下面是scrollToBottom.js源码,很少很简单,见笑啦:

    ;(function($){  //ps: 为什么开头要加分号? 是防止代码压缩合并后因没有;而出错
        $.fn.extend({
            "scrollToBottom" : function(distance,fn){
                    if(arguments.length === 1)
                    {
                        fn = arguments[0]; 
                        distance = 0;
                    }
    
                    $(this).scroll(function(){
                    var scrollTop = $(this).scrollTop();
                    var clientHeight = $(this).height();
                    var bodyHeight = $(this).prop("scrollHeight");
                    
                    if (scrollTop >= bodyHeight - clientHeight - distance){
                        fn&&fn();
                        }
                    });    
            }
        });
    })(jQuery)

    引入插件,这样用起来就方便多了:

    $("#main").scrollToBottom(200,function(){
              console.log("距离底部还有200px,想干什么就在这个函数里写吧!");
              //longer();
        }); 

    专业插件推荐:jquery.nicescroll.js 

      nicescroll.js是款专业的滚动条插件,简单易用,对导航条进行了美化,缓冲减速,全屏等特效,用法为:

    $('#main').niceScroll({
            cursorcolor:"orange", //控制滚动条颜色
            cursor"10" ,  //控制滚动条宽度,默认5px
            scrollspeed:90,   //滚动速度,默认60
            mousescrollstep: 40, //滚轮速度,默认40
            cursorborder: "2px solid red", //滚动条边框
            cursorborderradius:"15px",//圆角
            //touchbehavior:true, //拖拽主页滑动
            boxzoom:true //放大全屏
        });

    关于此插件的详细用法请点击这里,英语不要太差哦 。

    (完)

  • 相关阅读:
    二叉排序树
    C# 大端与小端
    【转】C#socket通信
    【转】Github 搜索技巧,快速找到好资源
    web api 跨域请求,ajax跨域调用webapi
    【转】Linux简介及最常用命令
    【转】带你吃透RTMP
    09-vuex基本应用之计数demo
    08-配置vue路由的步骤
    02-原型与原型链
  • 原文地址:https://www.cnblogs.com/chayangge/p/4251443.html
Copyright © 2011-2022 走看看