zoukankan      html  css  js  c++  java
  • 监听滚动条动态加载

    最近做了个聊天的项目所以需要向上滚动然后动态加载,于是我就把这一块单独提取出来弄成插件。

    下面就是实现的效果

    $.fn.extend({
            scrollDetect: function(path, callback){
                var self = this;
                self[0].nodeScrollArr = {
                    isLock: false,
                    noteContentH: self.get(0).scrollHeight,
                    nodeScrollTop: self.scrollTop()
                }
                // 直接弄在arr上面他重新取值的话会被覆盖this.nodeScrollArr
                self.bind('scroll',function() {
                    var scrollTop = self.scrollTop(),//滚动高度
                        viewH = self.height(),//可见高度
                        contentH = self.get(0).scrollHeight;//内容高度
                    if(!self[0].nodeScrollArr.isLock){            
                        if(path == 'top' && scrollTop <= 5 && contentH > viewH + 20 && self[0].nodeScrollArr.nodeScrollTop > scrollTop){  
                            self[0].nodeScrollArr.isLock = true;
                            //滚动条至页面 (滚动条存在)  noteScrollTop > scrollTop这个是为了确定他是向下滚动的
                            self[0].nodeScrollArr.noteContentH = contentH;//记录当前的内容高度
                            callback && callback();
                            self[0].nodeScrollArr.isLock = false;
                        } else if(path == 'bottom' && contentH - viewH - scrollTop <= 5 && contentH > viewH + 20 && self[0].nodeScrollArr.nodeScrollTop < scrollTop) {
                            self[0].nodeScrollArr.isLock = true;
                            //滚动条至页面 (滚动条存在)  noteScrollTop > scrollTop这个是为了确定他是向下滚动的
                            self[0].nodeScrollArr.noteContentH = contentH;//记录当前的内容高度
                            callback && callback();
                            self[0].nodeScrollArr.isLock = false;
                        }            
                    }
                    self[0].nodeScrollArr.nodeScrollTop = scrollTop;
    
                    return self;
                });
            }
        });
    

    调用

    $('#a1').scrollDetect('top', function(){
            var getArr = fnAdd();
            if(getArr) {
                // console.log(getArr)
                for(var i in getArr) {
                    arrAdd.unshift(getArr[i]);
                }
                draw('#a1',arrAdd);
                console.log($('#a1'))
                $('#a1').scrollTop($('#a1').get(0).scrollHeight - $('#a1')[0].nodeScrollArr.noteContentH);      
            } else {
                fnTip(document.getElementsByClassName('tip1')[0]);
            }
    
        })
    

    所有的代码模拟一下ajax请求:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript" src="jquery-3.1.0.min.js"></script>
    </head>
    <style type="text/css">
    *{margin: 0; padding: 0;}
    .scrollbox{ 300px; height: 400px; border:1px solid #999; margin: 50px auto; position: relative; overflow: hidden; }
    .scrollContext{ 100%; height: 100%; overflow-y: auto;}
    .font{padding: 5px; margin:10px 5px; border:1px solid #ccc; border-radius: 3px;  200px;}
    .tip1,.tip2{z-index: 10; position: absolute; top: 3px; left: 50%; margin-left: -47px;  94px; height: 22px; line-height: 22px; background-color: #eee;
        text-align: center; border-radius: 5px; color: #666; -webkit-transform-origin: top; -webkit-transform: scale(0); transition: 0.5s; opacity: 0; font-size: 12px;}
    </style>
    <body>
    <div class="scrollbox">
        <div class="tip1">没有更多消息</div>
        <div class="scrollContext" id="a1"></div>
    </div>
    <script type="text/javascript">
    (function(){
        // 滚动方法
        // 监控方向 目标 回调
        // 这里的pos记得在外面定义一个全局的变量 否者pos.nodeScrollArr在外面是null的,没有这东西
        $.fn.extend({
            scrollDetect: function(path, callback){
                var self = this;
                self[0].nodeScrollArr = {
                    isLock: false,
                    noteContentH: self.get(0).scrollHeight,
                    nodeScrollTop: self.scrollTop()
                }
                // 直接弄在arr上面他重新取值的话会被覆盖this.nodeScrollArr
                self.bind('scroll',function() {
                    var scrollTop = self.scrollTop(),//滚动高度
                        viewH = self.height(),//可见高度
                        contentH = self.get(0).scrollHeight;//内容高度
                    if(!self[0].nodeScrollArr.isLock){            
                        if(path == 'top' && scrollTop <= 5 && contentH > viewH + 20 && self[0].nodeScrollArr.nodeScrollTop > scrollTop){  
                            self[0].nodeScrollArr.isLock = true;
                            //滚动条(滚动条存在)  noteScrollTop > scrollTop这个是为了确定他是向下滚动的
                            self[0].nodeScrollArr.noteContentH = contentH;//记录当前的内容高度
                            callback && callback();
                            self[0].nodeScrollArr.isLock = false;
                        } else if(path == 'bottom' && contentH - viewH - scrollTop <= 5 && contentH > viewH + 20 && self[0].nodeScrollArr.nodeScrollTop < scrollTop) {
                            self[0].nodeScrollArr.isLock = true;
                            //滚动条(滚动条存在)  noteScrollTop > scrollTop这个是为了确定他是向下滚动的
                            self[0].nodeScrollArr.noteContentH = contentH;//记录当前的内容高度
                            callback && callback();
                            self[0].nodeScrollArr.isLock = false;
                        }            
                    }
                    self[0].nodeScrollArr.nodeScrollTop = scrollTop;
    
                    return self;
                });
            }
        });
        var arrAdd = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
        var arrchildAdd = [70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,90,91,92,93,94,95,23,24,25,26,27,28,29,30];
        function draw(tag,arr) {
            var html = '';
            for(var i in arr) {
                html += '<p class="font">'+arr[i]+'</p>';
            }
            $(tag).html(html);  
        }
        draw('#a1',arrAdd);
        $('#a1').scrollTop($('#a1').get(0).scrollHeight);//到底部
        $('#a1').scrollDetect('top', function(){
            var getArr = fnAdd();
            if(getArr) {
                // console.log(getArr)
                for(var i in getArr) {
                    arrAdd.unshift(getArr[i]);
                }
                draw('#a1',arrAdd);
                console.log($('#a1'))
                $('#a1').scrollTop($('#a1').get(0).scrollHeight - $('#a1')[0].nodeScrollArr.noteContentH);      
            } else {
                fnTip(document.getElementsByClassName('tip1')[0]);
            }
    
        })
    
    
        // 提示方法
        function fnTip(tip) {
            tip.style.WebkitTransform="scale(1)";
            tip.style.opacity=1;
            setTimeout(function(){
                tip.style.WebkitTransform="scale(0)";
                tip.style.opacity=0;
            },1000);
        }
    
        var add = 0;
      //模拟请求接口返回数据 function fnAdd(){ add++; if(add > 3) { return null; } else { var returnArr = []; for(var i = add*10 - 10; i < add*10;i++) { returnArr.push(arrchildAdd[i]); } return returnArr; } } })(); </script> </body> </html>

    //滚动条是否在底部

    dom[0].scrollTop + dom.height() === dom[0].scrollHeight

    滚动条在Y轴上的滚动距离 + 内容可视区域的高度 === 内容可视区域的高度加上溢出(滚动)的距离

    转载请注明出处http://www.cnblogs.com/matthew9298-Begin20160224/

  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议70:避免在调用栈较低的位置记录异常
    【转】编写高质量代码改善C#程序的157个建议——建议69:应使用finally避免资源泄漏
    【转】编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
    【转】编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常
    Arrays数组工具类中存在的坑!
    java.util.ArrayList
    java.util包下面的类---------01---示意图
    elasticsearch从入门到出门-08-Elasticsearch容错机制:master选举,replica容错,数据恢复
    elasticsearch从入门到出门-06-剖析Elasticsearch的基础分布式架构
    CentOS7.1安装 Vsftpd FTP 服务器
  • 原文地址:https://www.cnblogs.com/matthew9298-Begin20160224/p/6589846.html
Copyright © 2011-2022 走看看