一、前言
下拉刷新和上拉加载这两种交互方式通常出现在移动端中
本质上等同于PC网页中的分页,只是交互形式不同
二、实现原理
上拉加载及下拉刷新都依赖于用户交互
最重要的时要理解在什么场景,什么时机下触发交互动作。
1.上拉加载
上拉加载的本质是页面触底,或者快要触底时的动作
判断页面触底我们需要先了解一下下面的几个属性
- scrollTop:滚动视窗的高度距离window顶部的距离,他会随着往上滚动而不断增加,初始值是0,它是一个变化的值。
- clientHeight:它是一个定值,表示屏幕可视区域的高度。
- scrollHeight:页面不能滚动时时不存在的,body长度超过window时才会出现,所表示body所有元素的长度。
综上我们得出一个触底公式:
scrollTop + clientHeight >= scrollHeight
简单实现:
let clientHeight = document.documentElement.clientHeight; //浏览器高度
let scrollHeight = document.body.scrollHeight;
let scrollTop = document.documentElement.scrollTop;
let distance = 50; //距离视窗还用50的时候,开始触发;
if ((scrollTop + clientHeight) >= (scrollHeight - distance)) {
console.log("开始加载数据");
}
2.下拉刷新
下拉刷新的本质是页面本事置于顶部时,用户下拉时需要触发的动作。
关于下拉刷新的原生实现,主要分为三步:
- 监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY;
- 监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于0表示向下拉动,并借助CSS3的translateY属性使元素跟随手势向下滑动对应的差值,同时也应设置一个允许滑动的最大值;
- 监听原生touchend事件,若此时元素滑动达到最大值,则触发callback,同时将translateY重设为0,元素回到初始位置
从上面可以看到,在下拉到松手的过程中,经历了三个阶段:
- 当前手势滑动位置与初始位置差值大于零时,提示正在进行下拉刷新操作
- 下拉到一定值时,显示松手释放后的操作提示
- 下拉到达设定最大值松手时,执行回调,提示正在进行更新操作
小结
下拉刷新、上拉加载原理本身都很简单,真正复杂的是封装过程中,要考虑的兼容性、易用性、性能等诸多细节