方案一:使用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)的更多相关文章

  1. 移动端上拉加载,下拉刷新效果Demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. [Swift通天遁地]二、表格表单-(4)使用系统自带的下拉刷新控件,制作表格的下拉刷新效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. [Swift通天遁地]二、表格表单-(6)创建美观的表格弹性下拉刷新效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. 关于h5手机端上拉加载和下拉刷新效果-1

    1.手机端目前很火的效果,上拉加载,和下拉刷新.目前主要使用 iscroll 框架来实现.先推荐一个iscroll中文学习的网站,不要感谢,我是雷锋. 2.https://iiunknown.gitb ...

  5. react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)

    1.下拉刷新/上拉加载更多 组件(RefreshListView) src/components/RefreshListView/index.js /** * 下拉刷新/上拉加载更多 组件(Refre ...

  6. android使用PullToRefresh实现上拉加载和下拉刷新效果

    其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...

  7. Swift 自定义炫酷下拉刷新效果

    先来看下效果 下拉刷新 其实下拉刷新没大家想得那么难.本文已第二个为例子.给大家讲解下下拉刷新的做法(完整代码后面会放上) 首先,先搞一个single View Application .然后进Mai ...

  8. Android下拉刷新效果实现

    本文主要包括以下内容 自定义实现pulltorefreshView 使用google官方SwipeRefreshLayout 下拉刷新大致原理 判断当前是否在最上面而且是向下滑的,如果是的话,则加载数 ...

  9. 代码实现Android5.0的下拉刷新效果

    如图所示,实现类似与gmail的下拉刷新. 项目地址:https://github.com/stormzhang/SwipeRefreshLayoutDemo 一.在xml文件中定义 这个控件在sup ...

随机推荐

  1. $apply() $digest()

    理解Angular中的$apply()以及$digest() <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  2. 《C#并行编程高级教程》第3章 命令式任务并行 笔记

    Task的使用 var t1 = new Task(() => GenerateAESKeys());var t2 = new Task(() => GenerateMD5Hashes() ...

  3. [BILL WEI]一些经常用到的SQL函数

    截取时间 --convert可以截取特点值 convert(varchar(10),getdate(),120) 截取2012-11-11 11:11:11 前10位,得到日期2012-11-11

  4. [Tommas] UNION 和 UNION ALL 的区别

    UNION指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看,UNION跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料.UNION的一个限制是两个 SQL 语句所产生的 ...

  5. 安装qc 出现error An error occurred while attempting to connect to the database.

    When trying to install mercury quality center starter edition 9.0 on Windows XP media center, I am g ...

  6. Javascript检测浏览器对CSS属性的支持 /* supports */

    //检测浏览器对CSS属性的支持 supports = (function() { var div = document.createElement('div'), vendors = 'Khtml ...

  7. 无法连接 mysql

    ==================================================================================================== ...

  8. Recommended add-ons/plugins for Microsoft Visual Studio [closed]

    SmartPaster - (FREE) Copy/Paste code generator for strings AnkhSvn - (FREE) SVN Source Control Integ ...

  9. poj 1273 Drainage Ditches【最大流入门】

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63924   Accepted: 2467 ...

  10. java实现文件复制功能

    原理:把原文件读入到输入流里,然后利用输出流写入到新的文件. 代码如下: /** * 复制文件 * @param fromFile * @param toFile * <br/> * 20 ...