移动端如何用下拉刷新的方式实现上拉加载


Posted in Javascript onDecember 10, 2018

实现上拉加载最普遍的方式就是监听滚动条的滚动事件,而移动端的下拉刷新利用的是transform属性来进行位移,那用下拉刷新的方式实现上拉加载怎么样?

html结构

<div class="main-box" id="box1">
  <div class="popup-box">
  </div>
</div>
<div class="main-box" id="box2">
  <div class="popup-box">
  </div>
</div>

这里我们做了两个主要的盒子,在两个盒子内实现上拉加载。结构很简单。

css样式

* {
      margin: 0;
      padding: 0;
    }
    .main-box {
      background: skyblue;
      width: 100%;
      height: 300px;
      overflow: hidden;
    }
    .popup-box {
      width: 100%;
    }
    .item {
      width: 100%;
      line-height: 40px;
      text-align: center;
      padding: 20px;
      box-sizing: border-box;
    }
    .tips{
      text-align: center;
    }
    #box2 {
      margin-top: 50px;
    }

最外面的盒子设置overflow: hidden;中间盒子不设置高度,靠子盒子item撑起。

js代码

/*下拉加载*/
  function tDscroll(obj) {
    this.key = true;         //防止重复的请求
    this.dom = obj.dom;        //传入的dom
    this.fn = obj.fn;         //回调函数
    this.outDom = this.dom.querySelector(".popup-box"); //获取内容盒子
    this.showHeight = dom.offsetHeight;         //显示的高度
    this.actualHeight = this.outDom.offsetHeight;       //获取实际高度的内容
    this.startY = 0;                //起始点击位置
    this.changedY = 0;               //手指移动的距离
    this.originY = 0;               //偏移量
    var that = this;
    this.dom.addEventListener("touchstart",function (ev) {
      that.onStart(ev);
    });
    this.dom.addEventListener("touchmove",function (ev) {
      that.onMove(ev);
    });
    this.dom.addEventListener("touchend",function (ev) {
      that.onEnd(ev);
    });
    this.fn.call(this,this.outDom);
  };

  tDscroll.prototype.onStart = function (ev) {
    this.startY = ev.targetTouches[0].clientY;
    var tempArr = window.getComputedStyle(this.outDom).transform.split(",");
    if (tempArr.length > 2) {
      this.originY = parseInt(tempArr[tempArr.length - 1]) || 0;
    }
  };

  tDscroll.prototype.onMove = function (ev) {
    this.changedY = ev.touches[0].clientY - this.startY;
    var changNum = (this.originY + this.changedY);
    var scrollHeight = -changNum + this.showHeight;
    if (changNum > 50)return;
    if (scrollHeight > this.actualHeight + 50)return;
    if (scrollHeight > this.actualHeight - 50 && this.key) {
      this.fn.call(this,this.outDom);
    }
    this.outDom.style.cssText = "transform: translateY(" + changNum + "px);";
  };

  tDscroll.prototype.onEnd = function() {
    if ((this.originY + this.changedY) > 50 ) {
      this.outDom.style.cssText = "transform: translateY(0px);transition:all .3s";
    }
    if (-(this.originY + this.changedY) + this.showHeight > this.actualHeight + 50) {
      this.outDom.style.cssText = "transform: translateY(-"+(this.actualHeight - this.showHeight)+"px);transition:all .3s";
    }
  };


  var dom = document.querySelector("#box1");  //获取dom
  var dom2 = document.querySelector("#box2");  //获取dom
  var obj = {
    dom : dom,
    fn : add
  };
  var obj2 = {
    dom : dom2,
    fn : add
  };
  new tDscroll(obj);
  new tDscroll(obj2);
  var page = 0;          //当前的页数(模拟用)

  // 模拟ajax
  function add(outDom) {
    var that = this;
    this.key = false;
    var str = "";
    for (var i = 1;i < 11;i++) {
      str+="<div class='item'>"+(i+((page)*10))+"</div>"
    }
    page++;
    setTimeout(function () {
      var tips = outDom.querySelector(".tips");       //获取提升
      tips && outDom.removeChild(tips); //如果不是第一次 添加
      str += "<div class='tips'>加载更多</div>";
      outDom.innerHTML += str;
      that.actualHeight = outDom.offsetHeight;
      that.key = true;
    },2000)
  }

原理也是很简单,监听手势事件判断是否距离足够,足够就可以添加数据啦~~~

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

Javascript 相关文章推荐
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
JS 类型转换常见方法小结
May 31 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
js+html5操作sqlite数据库的方法
Feb 02 Javascript
举例讲解如何判断JavaScript中对象的类型
Apr 22 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
Angularjs 实现一个幻灯片示例代码
Sep 08 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
Oct 16 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 Javascript
AJAX在JQuery中的应用详解
Jan 30 jQuery
在Vue里如何把网页的数据导出到Excel的方法
Sep 30 Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 #Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 #jQuery
微信小程序实现动态获取元素宽高的方法分析
Dec 10 #Javascript
PM2自动部署代码步骤流程总结
Dec 10 #Javascript
vue路由前进后退动画效果的实现代码
Dec 10 #Javascript
Vue.js子组件向父组件通信的方法实例代码详解
Dec 10 #Javascript
vue 基于element-ui 分页组件封装的实例代码
Dec 10 #Javascript
You might like
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
静态变量和实例变量的区别
2015/07/07 面试题
生产总经理岗位职责
2013/12/19 职场文书
教师节表彰会主持词
2015/07/06 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
python中的plt.cm.Paired用法说明
2021/05/31 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android