javascript 实现html5 页面下拉刷新
--> -->
如何能像app一样实现下拉刷新,或者上推刷新.
我们试图用html5+css+javascript 来实现一下,没有用到任何第三方插件或者开源js包.
先看下效果:
--> -->
这是微信内置浏览器打开后的效果,
再看下从顶部按住下拉刷新的效果
--> -->
- 首先有一个目标div
这个 div 用来监听 touchstart ,touchmove ,touchend 三个事件.
这3个 事件分别表示 手指触摸屏幕开始, 手指在屏幕移动 , 手指触摸结束
那么这个 目标div 一旦被监听后,你的手指放在此div内,就会触发上面的事件.
2. 当触发某个事件时,我们希望看到上面一个下拉的拉伸效果,并且提示 "松开后刷新最新回复"
这个提示效果首先我们需要在 目标div 内方一段 html :
<div id="sd">
<div id="sd1">
<p>松开后刷新最新回复</p>
</div>
<div id="sd2">
<p><img src="/images/loading.gif" alt="玩命加载中.."/></p>
</div>
</div>
3 . 对应的我们需要一段css 来控制上面这个拉伸效果
#sd,#ud{margin-top: 0;width: 100%;}
#sd1,#sd2,#ud1,#ud2{width: 100%;height: 70px;background: #e9f4f7;display: none;}
#sd1,#ud2{height: 20px;}
#sd1>p,#sd2>p,#ud1>p,#ud2>p{margin: 20px auto;padding-top:8px;text-align:center;font-size: 14px;color: #37bbf5;}
上面为2个id定义了样式 ( #sd ,#ud)
是因为我在页面里同时实现了下拉和上推的效果,
而整个页面包括样式的命名都不规范,因为手机端访问,考虑到流量和网络制式的限制,能节约就节约,所以才会简化命名,所以才会全部手写 javascript 来实现,没有引入一个第三方包.
4. 上面选好了目标 div ,加上了松开刷新的ui效果,并且加上了css 样式控制.
这一步需要我们给目标div 加监听事件了.
function slideDownStep1(dist) {
var sd1 = document.getElementById("sd1"),
sd2 = document.getElementById("sd2");
sd2.style.display = "none";
sd1.style.display = "block";
sd1.style.height = 1 - parseInt(dist) + "px";
}
function slideDownStep2() {
var sd1 = document.getElementById("sd1"),
sd2 = document.getElementById("sd2");
sd1.style.display = "none";
sd1.style.height = "20px";
sd2.style.display = "block";
}
function slideDownStep3() {
var sd1 = document.getElementById("sd1"),
sd2 = document.getElementById("sd2");
sd1.style.display = "none";
sd2.style.display = "none";
}
上面三个方法都是控制 <div id="sd" > 的显示效果.
function kt_touch(contentId, way) {
var _start = 0,
_end = 0,
_content = document.getElementById(contentId);
_content.addEventListener("touchstart", touchStart, false);
_content.addEventListener("touchmove", touchMove, false);
_content.addEventListener("touchend", touchEnd, false);
function touchStart(event) {
event.preventDefault();
if (!event.touches.length) return;
var touch = event.touches[0];
if (way == "x") {
_start = touch.pageX;
} else {
_start = touch.pageY;
}
}
function touchMove(event) {
event.preventDefault();
if (!event.touches.length) return;
var touch = event.touches[0];
if (way == "x") {
_end = (_start - touch.pageX);
} else {
_end = (_start - touch.pageY);
if (_end < 0) {
slideDownStep1(_end);
}
}
}
function touchEnd(event) {
if (_end > 0) {
//左滑或上滑
slideDownStep2();
slideDownStep3();
getReplyList(++curPage);
}else{
slideDownStep2();
slideDownStep3();
getReplyList();
} //右滑下滑
}
}
kt_touch 核心函数接收2个参数 ,dom ID 和 控制方式 (x轴 或 y轴)
并且在目标 div 上注册了3个事件,并且在对应的事件上绑定了事件触发函数.就是当此事件触发时,对应的执行绑定函数.
5. 最后我们执行事件监听方法 kt_touch
kt_touch('ep','y');
第一个参数 ep 是目标div 的ID, 第二个参数 'y' 表示在y轴上的控制方式.