博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10行代码实现页面无限滚动
阅读量:5873 次
发布时间:2019-06-19

本文共 2614 字,大约阅读时间需要 8 分钟。

背景:

由于网页的执行都是单线程的,在JS执行的过程中,页面会呈现阻塞状态。因此,如果JS处理的数据量过大,过程复杂,可能会造成页面的卡顿。传统的数据展现都以分页的形式,但是分页的效果并不好,需要用户手动点击下一页,才能看到更多的内容。有很多网站使用无限分页的模式,即网页视窗到达内容底部就自动加载下一部分的内容...

原理:

实现无限分页的过程大致如下:   1 视窗滚动到底部;   2 触发加载,添加到现有内容的后面。   因此,可能会出现两种情况:   1 当页面的内容很少,没有出现滚动条;触发加载页面事件,直到加载到满足条件时停止加载;   2 当页面的内容很多,出现了滚动条复制代码

先说第一种传统的方法

需要理解的概念

scrollHeight即真实内容的高度;

clientHeight比较好理解,是视窗的高度,就是我们在浏览器中所能看到内容的高度;

scrollTop是视窗上面隐藏掉的部分。

实现思路:

1 如果真实的内容比视窗高度小,则一直加载到超过视窗

2 如果超过了视窗,则判断下面隐藏的部分的距离是否小于一定的值,如果是,则触发加载。(即滚动到了底部)

// 触发条件函数 function lowEnough(){            var pageHeight = Math.max(document.body.scrollHeight,document.body.offsetHeight);            var viewportHeight = window.innerHeight ||                 document.documentElement.clientHeight ||                document.body.clientHeight || 0;            var scrollHeight = window.pageYOffset ||                document.documentElement.scrollTop ||                document.body.scrollTop || 0;            return pageHeight - viewportHeight - scrollHeight < 20;  // 通过 真实内容高度 - 视窗高度 - 上面隐藏的高度 < 20,作为加载的触发条件        }复制代码

第二种方法:IntersectionObserver(简单、但对浏览器有要求)

一、API

它的用法非常简单。

var io = new IntersectionObserver(callback, option);// 开始观察io.observe(document.getElementById('example'));// 停止观察io.unobserve(element);// 关闭观察器io.disconnect();复制代码

上面代码中,IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:callback是可见性变化时的回调函数,option是配置对象(该参数可选)。

构造函数的返回值是一个观察器实例。实例的observe方法可以指定观察哪个 DOM 节点。

二、callback 参数

目标元素的可见性变化时,就会调用观察器的回调函数callback。

callback一般会触发两次。一次是目标元素刚刚进入视口(开始可见),另一次是完全离开视口(开始不可见)。

var io = new IntersectionObserver(  entries => {    console.log(entries);  });复制代码

上面代码中,回调函数采用的是箭头函数的写法。callback函数的参数(entries)是一个数组,每个成员都是一个IntersectionObserverEntry对象。举例来说,如果同时有两个被观察的对象的可见性发生变化,entries数组就会有两个成员。

三、IntersectionObserverEntry 对象

IntersectionObserverEntry对象提供目标元素的信息,一共有六个属性。

每个属性的含义如下。

time:可见性发生变化的时间,是一个高精度时间戳,单位为毫秒target:被观察的目标元素,是一个 DOM 节点对象rootBounds:根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回nullboundingClientRect:目标元素的矩形区域的信息intersectionRect:目标元素与视口(或根元素)的交叉区域的信息intersectionRatio:目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0复制代码

上图中,灰色的水平方框代表视口,深红色的区域代表四个被观察的目标元素。它们各自的intersectionRatio图中都已经注明。

实例:

    
Title
loading
loading
loading
loading
没有内容了
复制代码

当然也可以实现懒加载:

    
Title
loading
loading
loading
loading
loading
loading
loading
loading
loading
loading
复制代码

最后说一下各个浏览器对这个API的支持,使用前需谨慎哦:

另外文中部分文字借鉴了大神——阮一峰的

转载地址:http://hvhnx.baihongyu.com/

你可能感兴趣的文章
Visual Studio常用快捷键
查看>>
关于单点登录的简单原理和实现步骤
查看>>
让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求--转载
查看>>
【C++】CCFCSP201803-1跳一跳
查看>>
在CentOS下为sqlplus和rman 添加rlwrap
查看>>
jenkins的使用
查看>>
CSS-滤镜 -webkit-filter
查看>>
python高级-------python2.7教程学习【廖雪峰版】(四)
查看>>
【译】回调地狱 Callback Hell
查看>>
Tripwire安装
查看>>
linux
查看>>
HDU 2552 A simple problem
查看>>
高仿富途牛牛-组件化(五)-如何去管理炒鸡多的小窗口
查看>>
解决 RaspberryPi 树莓派 NTP服务异常 无法自动同步时间
查看>>
Linux 搭建SVN服务器
查看>>
2018-2019 20165208 网络对抗 Exp8 Web基础
查看>>
软工概论第十周总结
查看>>
CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
查看>>
jQuery - 删除元素
查看>>
Could not find the main class: org.apache.catalina.startup.Bootstrap. Program will exit.
查看>>