APP中javascript+css3实现下拉刷新效果


Posted in Javascript onJanuary 27, 2016

原生app里的数据列表都会使用下拉刷新的效果,在webapp里可以采用iscroll、swiper等插件或框架实现,那么如何自己编码实现类似的效果呢,下面介绍使用原生js+css3实现的简单效果。

html布局

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>test</title>
<style type="text/css" media="screen">
 body{margin: 0;}
 ul{list-style: none;padding: 0;}
 li{height: 30px;border-bottom: 1px solid #ddd;line-height: 30px;padding-left: 10px;}
 .scroller .loading{height: 60px;line-height: 60px;text-align: center;width: 100%;background-color: #f1f1f1;}
 .scroller{-webkit-overflow-scrolling:touch;}
</style> 
</head> 
<body > 
<div id="container" class="scroller" >
<div class="loading">
 下拉刷新数据
</div>
<ul>
 <li><a href="#">列表数据1</a></li>
 <li><a href="#">列表数据2</a></li>
 <li><a href="#">列表数据3</a></li>
 <li><a href="#">列表数据4</a></li>
 <li><a href="#">列表数据5</a></li>
 <li><a href="#">列表数据6</a></li>
 <li><a href="#">列表数据7</a></li>
 <li><a href="#">列表数据8</a></li>
 <li><a href="#">列表数据9</a></li>
 <li><a href="#">列表数据10</a></li>
 <li><a href="#">列表数据11</a></li>
 <li><a href="#">列表数据12</a></li>
 <li><a href="#">列表数据13</a></li>
 <li><a href="#">列表数据14</a></li>
 <li><a href="#">列表数据15</a></li>
 <li><a href="#">列表数据16</a></li>
 <li><a href="#">列表数据17</a></li>
 <li><a href="#">列表数据18</a></li>
 <li><a href="#">列表数据19</a></li>
 <li><a href="#">列表数据20</a></li>
 <li><a href="#">列表数据21</a></li>
 <li><a href="#">列表数据22</a></li>
 <li><a href="#">列表数据23</a></li>
 <li><a href="#">列表数据24</a></li>
 <li><a href="#">列表数据25</a></li>
 <li><a href="#">列表数据26</a></li>
 <li><a href="#">列表数据27</a></li>
 <li><a href="#">列表数据28</a></li>
 <li><a href="#">列表数据29</a></li>
 <li><a href="#">列表数据30</a></li>
</ul> 
</div>
<body>
</html>

js逻辑

var slide = function (option) {
 var defaults={
  container:'',
  next:function(){}
 }
 var start,
   end,
   length,
   isLock = false,//是否锁定整个操作
   isCanDo = false,//是否移动滑块
   isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
   hasTouch = 'ontouchstart' in window && !isTouchPad;
 var obj = document.querySelector(option.container);
 var loading=obj.firstElementChild;
 var offset=loading.clientHeight;
 var objparent = obj.parentElement;
 /*操作方法*/
 var fn =
 {
  //移动容器
  translate: function (diff) {
   obj.style.webkitTransform='translate3d(0,'+diff+'px,0)';
   obj.style.transform='translate3d(0,'+diff+'px,0)';
  },
  //设置效果时间
  setTransition: function (time) {
   obj.style.webkitTransition='all '+time+'s';
   obj.style.transition='all '+time+'s';
  },
  //返回到初始位置
  back: function () {
   fn.translate(0 - offset);
   //标识操作完成
   isLock = false;
  },
  addEvent:function(element,event_name,event_fn){
   if (element.addEventListener) {
    element.addEventListener(event_name, event_fn, false);
   } else if (element.attachEvent) {
    element.attachEvent('on' + event_name, event_fn);
   } else {
    element['on' + event_name] = event_fn;
   }
  }
 };

 fn.translate(0-offset);
 fn.addEvent(obj,'touchstart',start);
 fn.addEvent(obj,'touchmove',move);
 fn.addEvent(obj,'touchend',end);
 fn.addEvent(obj,'mousedown',start)
 fn.addEvent(obj,'mousemove',move)
 fn.addEvent(obj,'mouseup',end)

 //滑动开始
 function start(e) {
  if (objparent.scrollTop <= 0 && !isLock) {
   var even = typeof event == "undefined" ? e : event;
   //标识操作进行中
   isLock = true;
   isCanDo = true;
   //保存当前鼠标Y坐标
   start = hasTouch ? even.touches[0].pageY : even.pageY;
   //消除滑块动画时间
   fn.setTransition(0);
   loading.innerHTML='下拉刷新数据';
  }
  return false;
 }

 //滑动中
 function move(e) {
  if (objparent.scrollTop <= 0 && isCanDo) {
   var even = typeof event == "undefined" ? e : event;
   //保存当前鼠标Y坐标
   end = hasTouch ? even.touches[0].pageY : even.pageY;
   if (start < end) {
    even.preventDefault();
    //消除滑块动画时间
    fn.setTransition(0);
    //移动滑块
    if((end-start-offset)/2<=150) {
     length=(end - start - offset) / 2;
     fn.translate(length);
    }
    else {
     length+=0.3;
     fn.translate(length);
    }
   }
  }
 }
 //滑动结束
 function end(e) {
  if (isCanDo) {
   isCanDo = false;
   //判断滑动距离是否大于等于指定值
   if (end - start >= offset) {
    //设置滑块回弹时间
    fn.setTransition(1);
    //保留提示部分
    fn.translate(0);
    //执行回调函数
    loading.innerHTML='正在刷新数据';
    if (typeof option.next == "function") {
     option.next.call(fn, e);
    }
   } else {
    //返回初始状态
    fn.back();
   }
  }
 }
}
slide({container:"#container",next: function (e) {
 //松手之后执行逻辑,ajax请求数据,数据返回后隐藏加载中提示
 var that = this;
 setTimeout(function () {
  that.back.call();
 }, 2000);
}});

代码不是很多,细节还需完善。

Javascript 相关文章推荐
JavaScript基础知识之数据类型
Aug 06 Javascript
jquery获得页面元素的坐标值实现思路及代码
Apr 15 Javascript
使用闭包对setTimeout进行简单封装避免出错
Jul 10 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
Jan 04 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
基于Vue.js实现数字拼图游戏
Aug 02 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
webpack实现一个行内样式px转vw的loader示例
Sep 13 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 Javascript
vue动态绑定style样式
Apr 20 Vue.js
jQuery EasyUi实战教程之布局篇
Jan 26 #Javascript
jQuery Easyui实现左右布局
Jan 26 #Javascript
AngualrJS中的Directive制作一个菜单
Jan 26 #Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 #Javascript
详解javascript new的运行机制
Jan 26 #Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 #Javascript
基于JavaScript实现瀑布流布局(二)
Jan 26 #Javascript
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
php中iconv函数使用方法
2008/05/24 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python字符类型的一些方法小结
2016/05/16 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python使用selenium实现批量文件下载
2019/03/11 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
Numpy的简单用法小结
2019/08/28 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
python输出pdf文档的实例
2020/02/13 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
Python实现弹球小游戏
2020/08/01 Python
《黄河颂》教学反思
2014/02/07 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
会计专业导师推荐信
2014/03/08 职场文书
公证委托书大全
2014/04/04 职场文书
三字经教学反思
2014/04/26 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
购房委托书
2014/10/15 职场文书
奖学金感谢信
2015/01/21 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
HttpClient实现文件上传功能
2022/08/14 Java/Android