监听滚动条动态加载
最近做了个聊天的项目所以需要向上滚动然后动态加载,于是我就把这一块单独提取出来弄成插件。
下面就是实现的效果
$.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{width: 300px; height: 400px; border:1px solid #999; margin: 50px auto; position: relative; overflow: hidden; } .scrollContext{width: 100%; height: 100%; overflow-y: auto;} .font{padding: 5px; margin:10px 5px; border:1px solid #ccc; border-radius: 3px; width: 200px;} .tip1,.tip2{z-index: 10; position: absolute; top: 3px; left: 50%; margin-left: -47px; width: 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/