说说下拉刷新,上拉加载的原理
# 是什么
- 上拉加载: 页面内容触底时,加载服务器数据,显示更多内容
- 下拉刷新: 在页面顶部,下拉页面,加载服务器数据,显示最新内容
# 上拉加载
触底公式: 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("开始加载数据");
}
# 下拉刷新
- 监听 touchstart 事件,记录初始值
e.touches[0].pageY - 监听 touchmove 事件,借助 translateY 属性是元素向下滑动,并显示释放刷新元素
- 监听 touchend 事件,若达到阈值时,进行回调处理,并让元素回到初始位置
<main>
<p class="refreshText"></p>
<ul id="refreshContainer">
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
<li>555</li>
...
</ul>
</main>
var _element = document.getElementById("refreshContainer"),
_refreshText = document.querySelector(".refreshText"),
_startPos = 0, // 初始的值
_transitionHeight = 0; // 移动的距离
_element.addEventListener(
"touchstart",
function(e) {
_startPos = e.touches[0].pageY; // 记录初始位置
_element.style.position = "relative";
_element.style.transition = "transform 0s";
},
false
);
_element.addEventListener(
"touchmove",
function(e) {
// e.touches[0].pageY 当前位置
_transitionHeight = e.touches[0].pageY - _startPos; // 记录差值
if (_transitionHeight > 0 && _transitionHeight < 60) {
_refreshText.innerText = "下拉刷新";
_element.style.transform = "translateY(" + _transitionHeight + "px)";
if (_transitionHeight > 55) {
_refreshText.innerText = "释放更新";
}
}
},
false
);
_element.addEventListener(
"touchend",
function(e) {
_element.style.transition = "transform 0.5s ease 1s";
_element.style.transform = "translateY(0px)";
_refreshText.innerText = "更新中...";
// todo...
},
false
);
# 第三方库
- iscroll
- better-scroll
- pulltorefresh.js
上次更新: 2021/12/19, 18:05:42