jQuery模拟原生态App上拉刷新下拉加载更多页面及原理


Posted in Javascript onAugust 10, 2015

很多App中,新闻或者展示类都存在下拉刷新和上拉加载的效果,网上提供了实现这种效果的第三方类(详情请见MJRefresh和EGOTableViewPullRefresh),用起来很方便,但是闲暇之余,我们可以思考下,这种效果实现的原理是什么,我以前说过,只要是动画都是骗人的,只要不是硬件问题大部分效果都能在系统UI的基础上做出来.
下面通过jQuery手机端上拉下拉刷新页面代码,很像QQ空间客户端或者微信下拉刷新页面特效代码。
请看下面效果图:

jQuery模拟原生态App上拉刷新下拉加载更多页面及原理

在线预览    源码下载

html代码:

<div id="wrapper">
 <ul>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
  <li>row </li>
 </ul>
 </div>
 <script>
 for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) {
  document.querySelectorAll("#wrapper ul li")[i].colorfulBg();
 }
 refresher.init({
  id: "wrapper",//<------------------------------------------------------------------------------------┐
  pullDownAction: Refresh,
  pullUpAction: Load
 });
 var generatedCount = ;
 function Refresh() {
  setTimeout(function () { // <-- Simulate network congestion, remove setTimeout from production!
  var el, li, i;
  el = document.querySelector("#wrapper ul");
  el.innerHTML = '';
  for (i = ; i < ; i++) {
   li = document.createElement('li');
   li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
   el.insertBefore(li, el.childNodes[]);
  }
  wrapper.refresh();/****remember to refresh after action completed! ---yourId.refresh(); ----| ****/
  for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) {
   document.querySelectorAll("#wrapper ul li")[i].colorfulBg();
  }
  }, );
 }
 function Load() {
  setTimeout(function () {// <-- Simulate network congestion, remove setTimeout from production!
  var el, li, i;
  el = document.querySelector("#wrapper ul");
  for (i = ; i < ; i++) {
   li = document.createElement('li');
   li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
   el.appendChild(li, el.childNodes[]);
  }
  wrapper.refresh();/****remember to refresh after action completed!!! ---id.refresh(); --- ****/
  for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) {
   document.querySelectorAll("#wrapper ul li")[i].colorfulBg();
  }
  }, );
 }
 </script>

下拉刷新和上拉加载更多原理详解,具体介绍通过代码分析。

代码如下:

// 下拉刷新的原理 
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
 if (scrollView.contentOffset.y < - 100) { 
  
 [UIView animateWithDuration:1.0 animations:^{ 
  
  // frame发生偏移,距离顶部150的距离(可自行设定) 
  self.tableView.contentInset = UIEdgeInsetsMake(150.0f, 0.0f, 0.0f, 0.0f); 
 } completion:^(BOOL finished) { 
  
  /** 
  * 发起网络请求,请求刷新数据 
  */ 
 
 }]; 
 } 
} 

// 上拉加载的原理 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
 NSLog(@"%f",scrollView.contentOffset.y); 
 NSLog(@"%f",scrollView.frame.size.height); 
 NSLog(@"%f",scrollView.contentSize.height); 
 /** 
 * 关键--> 
 * scrollView一开始并不存在偏移量,但是会设定contentSize的大小,所以contentSize.height永远都会比contentOffset.y高一个手机屏幕的 
 * 高度;上拉加载的效果就是每次滑动到底部时,再往上拉的时候请求更多,那个时候产生的偏移量,就能让contentOffset.y + 手机屏幕尺寸高大于这 
 * 个滚动视图的contentSize.height 
 */ 
 if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) { 
 NSLog(@"%d %s",__LINE__,__FUNCTION__); 
 [UIView commitAnimations]; 
 [UIView animateWithDuration:1.0 animations:^{ 
  // frame发生的偏移量,距离底部往上提高60(可自行设定) 
  self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 60, 0); 
 } completion:^(BOOL finished) { 
  /** 
  * 发起网络请求,请求加载更多数据 
  * 然后在数据请求回来的时候,将contentInset改为(0,0,0,0) 
  */ 
 }]; 
 } 
}

以上内容就是本文针对jQuery模拟原生态App上拉刷新下拉加载更多页面及原理详解,希望对大家有所帮助。

Javascript 相关文章推荐
javascript编程起步(第四课)
Jan 10 Javascript
javascript开发随笔二 动态加载js和文件
Nov 25 Javascript
js单例模式详解实例
Nov 21 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
关于延迟加载JavaScript
May 05 Javascript
利用Node.js制作爬取大众点评的爬虫
Sep 22 Javascript
jQuery删除当前节点元素
Dec 07 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
javascript中数组的常用算法深入分析
Mar 12 Javascript
用jQuery实现抽奖程序
Apr 12 jQuery
jQuery 判断图片是否加载完成方法汇总
Aug 10 #Javascript
javascript实现连续赋值
Aug 10 #Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 #Javascript
js中的内部属性与delete操作符介绍
Aug 10 #Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
Aug 09 #Javascript
javascript中对变量类型的判断方法
Aug 09 #Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 #Javascript
You might like
PHP开发过程中常用函数收藏
2009/12/14 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
html读出文本文件内容
2007/01/22 Javascript
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
vue实现分页的三种效果
2020/06/23 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
Python中使用中文的方法
2011/02/19 Python
Python性能优化技巧
2015/03/09 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
Python eval函数介绍及用法
2020/11/09 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
开办加工厂创业计划书
2014/01/03 职场文书
2015年项目工作总结
2015/04/29 职场文书
2015年档案室工作总结
2015/05/23 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python