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


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 写类方式之八
Jul 05 Javascript
jquery ui resizable bug解决方法
Oct 26 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
Jan 19 Javascript
JS模拟实现Select效果代码
Sep 24 Javascript
在AngularJS中使用jQuery的zTree插件的方法
Apr 21 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
Oct 29 jQuery
解决axios会发送两次请求,有个OPTIONS请求的问题
Oct 25 Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
浅谈angular2路由预加载策略
2017/10/04 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
python实现简单加密解密机制
2019/03/19 Python
Python函数和模块的使用总结
2019/05/20 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
init进程的作用
2015/08/20 面试题
社区工作者感言
2014/03/02 职场文书
三八节主持词
2014/03/17 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
2014年新生军训方案
2014/05/01 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
租房协议书范文
2014/08/20 职场文书
2014年技术部工作总结
2014/12/12 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers