IScroll5实现下拉刷新上拉加载的功能实例


Posted in Javascript onAugust 11, 2017

声明:虽然本文章为原创,但是很大部分参考了博客园博主MRxia的一篇iscroll的下拉刷新的实现方式,我个人把demo简化了一下。

实现效果:类似网易新闻加载新闻列表(好吧,我的只能算是基础版,如要添加动图或者css样式或者canvas效果请自行脑补)

外部引入js文件,必须是iscroll-probe.js,这点是很重要的,因为基础版的 iscroll.js 插件并不支持实例化的IScroll对象的on事件绑定,当然还是要引入jQuery简化一下开发

以下是全局的css样式,当然你也可以直接复制过去,前面的是默认的iscroll的demo的样式,后面的pulldown-tips样式是作为绝对定位,当用户下拉不超过40px时显示“下拉刷新”的提示,下拉刷新后会被隐藏起来

<style type="text/css"> 
* { 
  -webkit-box-sizing: border-box; 
  -moz-box-sizing: border-box; 
  box-sizing: border-box; 
} 
 
html { 
  -ms-touch-action: none; 
} 
 
body,ul,li { 
  padding: 0; 
  margin: 0; 
  border: 0; 
} 
 
body { 
  font-size: 12px; 
  font-family: ubuntu, helvetica, arial; 
  overflow: hidden; /* this is important to prevent the whole page to bounce */ 
} 
 
#header { 
  position: absolute; 
  z-index: 2; 
  top: 0; 
  left: 0; 
  width: 100%; 
  height: 45px; 
  line-height: 45px; 
  background: #CD235C; 
  padding: 0; 
  color: #eee; 
  font-size: 20px; 
  text-align: center; 
  font-weight: bold; 
} 
 
#footer { 
  position: absolute; 
  z-index: 2; 
  bottom: 0; 
  left: 0; 
  width: 100%; 
  height: 48px; 
  background: #444; 
  padding: 0; 
  border-top: 1px solid #444; 
} 
 
#wrapper { 
  position: absolute; 
  z-index: 1; 
  top: 45px; 
  bottom: 48px; 
  left: 0; 
  width: 100%; 
  background: #ccc; 
  overflow: hidden; 
} 
 
#scroller { 
  position: absolute; 
  z-index: 1; 
  -webkit-tap-highlight-color: rgba(0,0,0,0); 
  width: 100%; 
  -webkit-transform: translateZ(0); 
  -moz-transform: translateZ(0); 
  -ms-transform: translateZ(0); 
  -o-transform: translateZ(0); 
  transform: translateZ(0); 
  -webkit-touch-callout: none; 
  -webkit-user-select: none; 
  -moz-user-select: none; 
  -ms-user-select: none; 
  user-select: none; 
  -webkit-text-size-adjust: none; 
  -moz-text-size-adjust: none; 
  -ms-text-size-adjust: none; 
  -o-text-size-adjust: none; 
  text-size-adjust: none; 
} 
 
#scroller ul { 
  list-style: none; 
  padding: 0; 
  margin: 0; 
  width: 100%; 
  text-align: left; 
} 
 
#scroller li { 
  padding: 0 10px; 
  height: 40px; 
  line-height: 40px; 
  border-bottom: 1px solid #ccc; 
  border-top: 1px solid #fff; 
  background-color: #fafafa; 
  font-size: 14px; 
} 
#pullDown,#pullUp,.pulldown-tips{ 
  height:40px; 
  line-height:40px; 
  text-align:center; 
} 
  .pulldown-tips{ 
    position:absolute; 
    top:-40px; 
    left:0; 
    width:100%; 
  } 
 
</style>

html结构在默认demo的基础上在scoller里面添加刷新/加载数据提示

<body onload="load()"> 
<div id="header">iScroll</div> 
<div id="wrapper"> 
  <div id="scroller"> 
  <div id="pullDown" class=""><div class="pullDownLabel"></div></div> 
    <div class="pulldown-tips">下拉刷新</div> 
    <ul id="list"> 
      <li>Pretty row 1</li> 
      <li>Pretty row 2</li> 
      <li>Pretty row 3</li> 
      <li>Pretty row 4</li> 
      <li>Pretty row 5</li> 
      <li>Pretty row 6</li> 
      <li>Pretty row 7</li> 
      <li>Pretty row 8</li> 
      <li>Pretty row 9</li> 
      <li>Pretty row 10</li> 
      <li>Pretty row 11</li> 
      <li>Pretty row 12</li> 
      <li>Pretty row 13</li> 
      <li>Pretty row 14</li> 
      <li>Pretty row 15</li> 
      <li>Pretty row 16</li> 
      <li>Pretty row 17</li> 
      <li>Pretty row 18</li> 
      <li>Pretty row 19</li> 
      <li>Pretty row 20</li> 
    </ul> 
    <div id="pullUp" class=""> 
    <div class="pullUpLabel">加载更多</div> 
    </div> 
  </div> 
</div> 
 
<div id="footer"></div> 
 
</body>

js需要说明的是,这里的scroll事件当然不是原生dom的scroll事件,而是IScroll对象的滚动事件,类似touchmove事件,scrollEnd事件也类似touchend事件,在滚动结束后执行

<script type="text/javascript"> 
 
  function load () { 
    var myScroll, 
          pullDown = $("#pullDown"), 
          pullUp = $("#pullUp"), 
          pullDownLabel = $(".pullDownLabel"), 
          pullUpLabel = $(".pullUpLabel"), 
          container = $('#list'), 
          loadingStep = 0;//加载状态0默认,1显示加载状态,2执行加载数据,只有当为0时才能再次加载,这是防止过快拉动刷新 
 
      pullDown.hide(); 
      pullUp.hide(); 
 
      myScroll = new IScroll("#wrapper", { 
        scrollbars: true, 
        mouseWheel: false, 
        interactiveScrollbars: true, 
        shrinkScrollbars: 'scale', 
        fadeScrollbars: true, 
        scrollY:true, 
        probeType: 2, 
        bindToWrapper:true 
      }); 
      myScroll.on("scroll",function(){ 
        if(loadingStep == 0 && !pullDown.attr("class").match('refresh|loading') && !pullUp.attr("class").match('refresh')){ 
          if(this.y > 40){//下拉刷新操作 
            $(".pulldown-tips").hide(); 
            pullDown.addClass("refresh").show(); 
            pullDownLabel.text("松手刷新数据"); 
            loadingStep = 1; 
            myScroll.refresh(); 
          }else if(this.y < (this.maxScrollY - 14)){//上拉加载更多 
            pullUp.addClass("refresh").show(); 
            pullUpLabel.text("正在载入"); 
            loadingStep = 1; 
            pullUpAction(); 
          } 
        } 
      }); 
      myScroll.on("scrollEnd",function(){ 
        if(loadingStep == 1){ 
          if( pullDown.attr("class").match("refresh") ){//下拉刷新操作 
            pullDown.removeClass("refresh").addClass("loading"); 
            pullDownLabel.text("正在刷新"); 
            loadingStep = 2; 
            pullDownAction(); 
          } 
        } 
      }); 
 
    function pullDownAction(){ 
      setTimeout(function(){ 
        var li, i; 
        for (i = 0,li = ""; i < 3; i++) { 
          li += "<li>" + "new Add " + new Date().toLocaleString() + " !" + "</li>"; 
        } 
        container.prepend(li); 
        pullDown.attr('class','').hide(); 
        myScroll.refresh(); 
        loadingStep = 0; 
        $(".pulldown-tips").show(); 
      },1000); 
    } 
    function pullUpAction(){ 
      setTimeout(function(){ 
        var li, i; 
        for (i = 0,li = ""; i < 3; i++) { 
          li += "<li>" + "new Add " + new Date().toLocaleString() + " !" + "</li>"; 
        } 
        container.append(li); 
        pullUp.attr('class','').hide(); 
        myScroll.refresh(); 
        loadingStep = 0; 
      },1000); 
    } 
 
    document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 
    } 
 
 
</script>

如有出错,欢迎指正  PS:测试环境在firefox的响应式开发环境下运行

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
使用javascript做的一个随机点名程序
Feb 13 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
Node.js 实现简单小说爬虫实例
Nov 18 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
vue里面使用mui的弹出日期选择插件实例
Sep 16 Javascript
vue基于两个计算属性实现选中和全选功能示例
Feb 08 Javascript
JS实现的字符串数组去重功能小结
Jun 17 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
vuex state中的数组变化监听实例
Nov 06 Javascript
jQuery实现计算器功能
Oct 19 jQuery
详谈JS中数组的迭代方法和归并方法
Aug 11 #Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 #Javascript
laydate 显示结束时间不小于开始时间的实例
Aug 11 #Javascript
JS非空验证及邮箱验证的实例
Aug 11 #Javascript
vue如何获取点击事件源的方法
Aug 10 #Javascript
Vue单文件组件基础模板小结
Aug 10 #Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 #Javascript
You might like
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP实现懒加载的方法
2015/03/07 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
vuex 中插件的编写案例解析
2019/06/10 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
Python 除法小技巧
2008/09/06 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
python 判断网络连通的实现方法
2018/04/22 Python
opencv实现简单人脸识别
2021/02/19 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Python多线程thread及模块使用实例
2020/04/28 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
几道PHP面试题
2013/04/14 面试题
如何掌握自荐信格式呢
2013/11/19 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
毕业典礼邀请函
2015/01/31 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript