js实现滚动条滚动到页面底部继续加载


Posted in Javascript onDecember 19, 2015

这个实例应该说可以很简单,直接使用jQuery的方法来处理也是可以的。但本文底层使用原生的js来处理,遇到一些小知识点可以分析一下也算有所得。

原理很简单,就是为window添加一个scroll事件,浏览器每次触发scroll事件时判断是否滚动到了浏览器底部,如果到了底部则加载新数据。关键是计算滚动条是否滚动到了浏览器底部,算法如下

滚动条卷起来的高度 + 窗口高度 > 文档的总高度 + 50/*我这里将滚动响应区域高度取50px*/;如果这个判断为true则表示滚动条滚动到了底部。

实例

<style type="text/css">
 html,body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td{
  margin: 0;
  padding:0;
 }
 *{
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
 }
  .waterfllow-loading{
  z-index: 2000;
  display:none;
 }
 .waterfllow-loading.active{
  display:block;
 }
 .waterfllow-loading img.loading-progress{
  position: fixed;
  /*设置等待条水平居于窗口正中*/
  margin-left: auto;
  margin-right: auto;
  left: 0;
  right: 0;

  /*不能设置margin-top:auto和margin-bottom:auto否则IE下bottom就不顶用了*/
  bottom: 30px;
 } 
 </style>
 <div class="waterfllow-loading">
  <img class="loading-progress" src="busy.gif">
 </div>
 <script type="text/javascript">
 //图片查询中正对浏览器主页面滚动事件处理(瀑布流)。只能使用window方式绑定,使用document方式不起作用
 $(window).on('scroll',function(){
 if(scrollTop() + windowHeight() >= (documentHeight() - 50/*滚动响应区域高度取50px*/)){
  waterallowData();
 }
 });

 function waterallowData(){
 $('.waterfllow-loading').addClass('active');
 
 /*$.ajax({
  url:url,
  type:"post",
  data: params,
  success:function(data,textStatus,jQXHR){
  //添加数据
  ...

  //隐藏加载条
  $('.waterfllow-loading.active').removeClass('active');
  }
 });*/
 }

获取页面顶部被卷起来的高度函数

//获取页面顶部被卷起来的高度
 function scrollTop(){
 return Math.max(
  //chrome
  document.body.scrollTop,
  //firefox/IE
  document.documentElement.scrollTop);
 }

chrome浏览器和Firefox/IE对滚动条是属于body还是html理解不同导致处理不同。

获取页面文档的总高度

//获取页面文档的总高度
 function documentHeight(){
 //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以
 return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
 }

这个算法和jQuery计算文档高度的方法一致。

获取页面浏览器视口的高度

function windowHeight(){
 return (document.compatMode == "CSS1Compat")?
 document.documentElement.clientHeight:
 document.body.clientHeight;
 }

这里需要说明的是document.compatMode这个东东。很陌生,一般情况貌似没有遇到过。

document.compatMode有两个取值"BackCompat"和"CSS1Compat"。官方解释是BackCompat:标准兼容模式关闭。CSS1Compat:标准兼容模式开启。

IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。

举个例子说明两种模式之间的差别有多大。

当document.compatMode等于"BackCompat"时,浏览器客户区宽度是document.body.clientWidth;

当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。

还有其他属性类似。这里不说了,但是我们可以预见两种模式导致IE渲染的基石都更改了,可想而知构建出来的建筑物差别当有多大。

所以请为每一个页面声明Doctype不仅仅是一个好习惯,而且是一个必要的处理。Quirks Mode可以进垃圾堆了。

好了下面附上完整的代码,有一个小例子(没有后台刷数据,只是显示等待条)

<!DOCTYPE html>
<html lang="ch-cn">
 <head>
<meta charset="utf-8">

<script type="text/javascript" src='jquery-1.9.1.js'></script>
 <style type="text/css">
 html,body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td{
  margin: 0;
  padding:0;
 }
 *{
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
 }
  .waterfllow-loading{
  z-index: 2000;
  display:none;
 }
 .waterfllow-loading.active{
  display:block;
 }
 .waterfllow-loading img.loading-progress{
  position: fixed;
  /*设置等待条水平居于窗口正中*/
  margin-left: auto;
  margin-right: auto;
  left: 0;
  right: 0;

  /*不能设置margin-top:auto和margin-bottom:auto否则IE下bottom就不顶用了*/
  bottom: 30px;
 } 
 </style>
 </head>
 <body style="background:#ff0;height:1000px;">
 <div class="waterfllow-loading">
  <img class="loading-progress" src="busy.gif">
 </div>
 </body>
 <script type="text/javascript">

 //获取页面顶部被卷起来的高度
 function scrollTop(){
 return Math.max(
  //chrome
  document.body.scrollTop,
  //firefox/IE
  document.documentElement.scrollTop);
 }
 //获取页面文档的总高度
 function documentHeight(){
 //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以
 return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
 }
 //获取页面浏览器视口的高度
 function windowHeight(){
 //document.compatMode有两个取值。BackCompat:标准兼容模式关闭。CSS1Compat:标准兼容模式开启。
 return (document.compatMode == "CSS1Compat")?
 document.documentElement.clientHeight:
 document.body.clientHeight;
 }
 </script>
 <script type="text/javascript">
 //图片查询中正对浏览器主页面滚动事件处理(瀑布流)。只能使用window方式绑定,使用document方式不起作用
 $(window).on('scroll',function(){
 if(scrollTop() + windowHeight() >= (documentHeight() - 50/*滚动响应区域高度取50px*/)){
  waterallowData();
 }
 });

 function waterallowData(){
 $('.waterfllow-loading').addClass('active');
 
 /*$.ajax({
  url:url,
  type:"post",
  data: params,
  success:function(data,textStatus,jQXHR){
  //添加数据
  ...

  //隐藏加载条
  $('.waterfllow-loading.active').removeClass('active');
  }
 });*/
 }
 </script> 
</html>

里面的加载条图片为

js实现滚动条滚动到页面底部继续加载

以上就是滚动条滚动到页面底部继续加载的处理实例,希望对大家的学习有所帮助。

Javascript 相关文章推荐
jquery 可排列的表实现代码
Nov 13 Javascript
jquery 事件执行检测代码
Dec 09 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
jQuery之选择组件的深入解析
Jun 19 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
javascript特殊日历控件分享
Mar 07 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
JavaScript实现简单拖拽效果
Sep 15 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 #Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 #Javascript
jQuery中trigger()与bind()用法分析
Dec 18 #Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 #Javascript
js获取url传值的方法
Dec 18 #Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 #Javascript
jquery获取css的color值返回RGB的方法
Dec 18 #Javascript
You might like
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
PHP实现把数字ID转字母ID
2013/08/12 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
js表单验证实例讲解
2016/03/31 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python计算两个地址之间的距离方法
2018/06/09 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
化学教师教学反思
2014/01/17 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
学生手册评语
2014/05/05 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
导游词之海南天涯海角
2019/12/05 职场文书