一、前言# X6 Z" l" N3 w w* s
下拉刷新和上拉加载这两种交互方式通常出现在移动端中,本质上等同于PC网页中的分页,只是交互形式不同,开源社区也有很多优秀的解决方案,如iscroll、better-scroll、pulltorefresh.js库等等。* T( c( G( P, M, d* T; l# I
这些第三方库使用起来非常便捷,我们通过原生的方式实现一次上拉加载、下拉刷新,有助于对第三方库有更好的理解与使用。 Q2 r% t% M' z7 C5 r% p 二、实现原理0 o, \, Z5 J5 `2 K
上拉加载及下拉刷新都依赖于用户交互,最重要的是要理解在什么场景,什么时机下触发交互动作。 9 r# t. g* q: f/ i6 j* Z! @上拉加载 $ C6 f4 u( R y s 首先可以看一张图 % W0 } b$ q7 Z6 ~# i c
! K' f9 w i6 F8 B+ y
上拉加载的本质是页面触底,或者快要触底时的动作,判断页面触底我们需要先了解一下下面几个属性:# o- [9 q" J+ g6 P
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("开始加载数据");
}
下拉刷新 , J; f; R ?$ S$ Y. c 下拉刷新的本质是页面本身置于顶部时,用户下拉时需要触发的动作,关于下拉刷新的原生实现,主要分成三步:1 X7 j8 }# Y& I3 s8 a, Y8 y
监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY; 7 D0 K) C @0 t. T: \+ Y监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于0表示向下拉动,并借助CSS3的translateY属性使元素跟随手势向下滑动对应的差值,同时也应设置一个允许滑动的最大值;7 ^. e# o: S l m: j. y' j
监听原生touchend事件,若此时元素滑动达到最大值,则触发callback,同时将translateY重设为0,元素回到初始位置2 W. t/ M6 r: U) I8 \
举个例子:' D" y8 m: @0 t. D5 B
Html结构如下3 y8 \5 w) Q- F: L
import BScroll from "@better-scroll/core";
import PullDown from "@better-scroll/pull-down";
import PullUp from '@better-scroll/pull-up';
BScroll.use(PullDown);
BScroll.use(PullUp);