手机端轻应用模拟原生的下拉刷新效果(JavaScript)
方案一:使用iscoll等有下拉功能的框架。
分析:因为项目的结构已经基本完成,再使用框架,会与原来的结构互相影响;
方案二:用JavaScript、Jquery写。
分析:可能没有直接使用框架的效果好,但可以尽量使效果贴近原生。
综合考虑,采用方案二。
/////////////////////////////////////////////////////////////////////////////////////////////////
参考博客:http://www.cnblogs.com/tqlin/archive/2013/03/04/2942789.html
1、index.html
refreshFeedback:刷新状态提示语
loading:箭头和loading的gif图
tasks:刷新的内容
<div id="wrapper"> <div id="list">
<div id="refreshFeedback" style="width:100%;height:36px;position:absolute;z-index:9;background-color:orange;top:40px;"><p></p></div>
<div>
<div id="loading" style="width:92%;height:70px;position:absolute;z-index:0;top:-60px">
<p></p>
</div> <div class="list-group" id="tasks">
<!-- 内容动态生成-->
</div>
</div>
</div> </div>
2、app.js
searchTasks():刷新tasks内容的函数
//返回角度
function GetSlideAngle(dx, dy) {
return Math.atan2(dy, dx) * 180 / Math.PI;
}
//根据起点和终点返回方向 1:向上,2:向下,0:未滑动
function GetSlideDirection(startX, startY, endX, endY) {
var dy = startY - endY;
var dx = endX - startX;
var result = 0; //如果滑动距离太短
if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
return result;
}
var angle = GetSlideAngle(dx, dy);
if (angle >= 45 && angle < 135) {
result = 1;
}
else if (angle >= -135 && angle < -45) {
result = 2;
}
else {
return result;
}
return result;
}
var startX, startY;
var judge =0;
document.getElementById("list").addEventListener('touchstart', function (ev) {
ev = ev || window.event; //兼容IE
startX = ev.touches[0].pageX;
startY = ev.touches[0].pageY; //初始化动画时间
$("#tasks").css("transition","0s");
$("#loading").css("transition","0s");
//初始化向下的箭头
$("#loading p").css("transform","rotate(0deg)");
$("#loading p").html('<span class="glyphicon glyphicon-arrow-down"></span>'); }, false); document.getElementById("list").addEventListener('touchmove', function (ev) {
judge = 0;
ev = ev || window.event; //兼容IE
var shift=event.touches[0].pageY-startY; //手指在屏幕上划动的距离
var realShift=shift/2; //元素实际位移的距离
if( $('#wrapper #list').scrollTop()>0){
judge = 1; //说明滚动条不在顶部,不需要触发下拉刷新
return;
}
else{
if(shift>0){
//只有滚动条在顶部,且下划时,才阻止滚动的默认行为(不影响滚动条的正常行为)
event.preventDefault();
if(shift<260){ //移到一定位置就不移了
$("#loading").css("transform","translateY("+realShift+"px"+")");
$("#tasks").css("transform","translateY("+realShift+"px"+")");
} if(shift>=90){ //移到一定位置箭头垂直翻转
$("#loading p").css("transform","rotate(-180deg)");
}
else{
$("#loading p").css("transform","rotate(0deg)");
} }
}
}, false);
//手指离开屏幕,元素回到原位
document.getElementById("list").addEventListener('touchend', function (ev) {
ev = ev || window.event; //兼容IE
var endX, endY;
endX = ev.changedTouches[0].pageX;
endY = ev.changedTouches[0].pageY;
var direction = GetSlideDirection(startX, startY, endX, endY);
switch (direction) {
case 0:
break;
case 1: //向上
break;
case 2: //向下
if(judge==1){
return;
}
else{
$("#loading").css("transition","0.2s");
$("#tasks").css("transition","0.2s"); //还原的时候稍微慢一些 $("#loading").css("transform","translateY("+0+"px"+")");
$("#tasks").css("transform","translateY("+0+"px"+")"); if ((endY-startY)>90){
//$("#tasks").empty();
$("#loading p").html('<img src="img/loading2.gif">');//loading的gif图片
$("#loading").css("transition-delay","0.8s");//延迟0.8秒,模拟“思考”的效果
$("#tasks").css("transition-delay","0.8s");
whichPage = dataGroupPage[whichMemory];
whichPage.pageNo = 1;
searchTasks(dataGroupPage[whichMemory], memory[whichMemory]).then(function(data) {
if(data==1){
$("#refreshFeedback p").html("刷新成功");
}
else{
$("#refreshFeedback p").html("刷新失败");
}
$("#refreshFeedback").css("display","block").hide().delay(800).fadeIn().delay(1200).fadeOut();
}); }
}
break;
default:
}
}, false);
3、app.css
#loading p{
width:100%;
position:absolute;
bottom:30px;
padding:0px;
margin-left:auto;
margin-right:auto;
text-align:center;
transition:0.2s;
font-size: larger;
color:grey;
} #loading p img{
width:20px;
height:20px;
}
#refreshFeedback{
display: none;
}
#refreshFeedback p{
margin:auto;
text-align: center;
line-height: 36px;
color:white;
}
4、另外,还有下滑翻页的部分
$('#wrapper #list').bind('scroll', function () {
if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
//如果上一次刷新得到的数据数小于一次刷新默认得到的数据数,说明这次刷新之后数据已经加载完毕,再滑动不再向数据库请求数据。
if(lastPageSize<dataGroupPage[whichMemory].pageSize){
return;
}
else{
dataGroupPage[whichMemory].pageNo += 1;
searchTasks(dataGroupPage[whichMemory], memory[whichMemory]);
}
}
});
手机端轻应用模拟原生的下拉刷新效果(JavaScript)的更多相关文章
- 移动端上拉加载,下拉刷新效果Demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [Swift通天遁地]二、表格表单-(4)使用系统自带的下拉刷新控件,制作表格的下拉刷新效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]二、表格表单-(6)创建美观的表格弹性下拉刷新效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 关于h5手机端上拉加载和下拉刷新效果-1
1.手机端目前很火的效果,上拉加载,和下拉刷新.目前主要使用 iscroll 框架来实现.先推荐一个iscroll中文学习的网站,不要感谢,我是雷锋. 2.https://iiunknown.gitb ...
- react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
1.下拉刷新/上拉加载更多 组件(RefreshListView) src/components/RefreshListView/index.js /** * 下拉刷新/上拉加载更多 组件(Refre ...
- android使用PullToRefresh实现上拉加载和下拉刷新效果
其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...
- Swift 自定义炫酷下拉刷新效果
先来看下效果 下拉刷新 其实下拉刷新没大家想得那么难.本文已第二个为例子.给大家讲解下下拉刷新的做法(完整代码后面会放上) 首先,先搞一个single View Application .然后进Mai ...
- Android下拉刷新效果实现
本文主要包括以下内容 自定义实现pulltorefreshView 使用google官方SwipeRefreshLayout 下拉刷新大致原理 判断当前是否在最上面而且是向下滑的,如果是的话,则加载数 ...
- 代码实现Android5.0的下拉刷新效果
如图所示,实现类似与gmail的下拉刷新. 项目地址:https://github.com/stormzhang/SwipeRefreshLayoutDemo 一.在xml文件中定义 这个控件在sup ...
随机推荐
- file_operations结构体解析 1
注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看 ...
- Oracle查询经典
.检索部门编号.部门名称.部门所在地及其每个部门的员工总数. select d.deptno,d.dname,d.loc,count(*) from emp e,dept d where e.dept ...
- C#面向对象编程实例-猜拳游戏
1.需求 现在要制作一个游戏,玩家与计算机进行猜拳游戏,玩家出拳,计算机出拳,计算机自动判断输赢. 2.需求分析 根据需求,来分析一下对象,可分析出:玩家对象(Player).计算机对象(Comput ...
- BZOJ_1618_ [Usaco2008_Nov]_Buying_Hay_购买干草(动态规划,完全背包)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1618 有n种物品,每种物品有价值和重量,可以无限拿.现在要满足价值之和大于等于h,问最小重量. ...
- 转自 z55250825 的几篇关于FFT的博文(一)
关于FFT,咱们都会迫不及待地 @ .....(大雾)(貌似被玩坏了...) .....0.0学习FFT前先orz FFT君. 首先先是更详细的链接(手写版题解点赞0v ...
- [转] POJ 题目分类
转载来自http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法: (1)枚举. (poj1753,p ...
- css滑动门制作圆角按钮
之前做项目的时候,基本都是将圆角背景图切成三块,故而每次用的标签都超级多,a标签中总是包含三个span,然后里面还得放按钮,导航冗余标签极多. 事实上是之前理解的滑动门的精髓不够到位. 现在有两种方式 ...
- Linux下的nginx启动、重新启动
nginx的启动命令是: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -c制定配置文件的路径,不加-nginx会自动 ...
- NESPER的大体结构 z
NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll. (1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块. (2)NEs ...
- [原]loadrunner中数据库数据参数化
作者:liuheng123456 发表于2013-11-25 14:11:10 原文链接 阅读:228 评论:0 查看评论