当前位置: 首页 > news >正文

手机端轻应用模拟原生的下拉刷新效果(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]);
        }
    }
});

 

转载于:https://www.cnblogs.com/cindywww/p/5908433.html

相关文章:

  • 樱花漫地集于我心,蝶舞纷飞祈愿相随---总结 顕出:void-sampling 显示:void-sampling...
  • node.js基础 1之简单的nodejs模块
  • Xcode 8 支持 iOS 7 真机解决过程记录
  • ajax 页面加载
  • C++-Qt【2】-实现一个简单的记事本
  • Python 学习之---文件目录处理
  • bootstrap0
  • 常用快速原型设计工具大比拼、原型设计工具哪个好用
  • Spring注入方式(1)
  • JSTL自定义标签
  • WIN10使用管理员权限运行VS2013
  • jq宽高 详解
  • 转载:第二弹!全球首个微信小程序(应用号)开发教程!通宵吐血赶稿!每日更新!...
  • 完全错排问题
  • sql相关记录
  • 【Leetcode】104. 二叉树的最大深度
  • 【React系列】如何构建React应用程序
  • CSS居中完全指南——构建CSS居中决策树
  • Just for fun——迅速写完快速排序
  • Map集合、散列表、红黑树介绍
  • mockjs让前端开发独立于后端
  • Mysql5.6主从复制
  • Netty 4.1 源代码学习:线程模型
  • Vim 折腾记
  • 给github项目添加CI badge
  • 汉诺塔算法
  • 浏览器缓存机制分析
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习Vue.js的五个小例子
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 通过调用文摘列表API获取文摘
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #{}和${}的区别是什么 -- java面试
  • #QT(智能家居界面-界面切换)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (javascript)再说document.body.scrollTop的使用问题
  • (zhuan) 一些RL的文献(及笔记)
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十六)串口UART
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)3D模板阴影原理
  • (转)大道至简,职场上做人做事做管理
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 发展历程
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net的socket示例
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • /3GB和/USERVA开关
  • /bin/rm: 参数列表过长"的解决办法
  • ??eclipse的安装配置问题!??
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @Transient注解