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 多级checkbox选择效果
Aug 20 Javascript
js实现将选中内容分享到新浪或腾讯微博
Dec 16 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
原生JS实现几个常用DOM操作API实例
Jan 19 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
Vue二次封装axios为插件使用详解
May 21 Javascript
Node.js Event Loop各阶段讲解
Mar 08 Javascript
vue中的inject学习教程
Apr 24 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
May 10 Javascript
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+Ajax实现表单验证的详解
2013/06/25 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
js实现拖拽功能
2017/03/01 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
建筑施工员岗位职责
2013/11/26 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
给朋友的道歉短信
2015/05/12 职场文书
python opencv通过4坐标剪裁图片
2021/06/05 Python
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
Spring 使用注解开发
2022/05/20 Java/Android
移除Selenium中window.navigator.webdriver值
2022/06/10 Python
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript