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


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 相关文章推荐
Jquery事件的连接使用示例
Jun 18 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
Apr 29 Javascript
封装好的javascript前端分页插件pagination
Jan 04 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
headjs实现网站并行加载但顺序执行JS
Nov 29 Javascript
简单实现js放大镜效果
Jul 24 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
深入剖析Node.js cluster模块
May 23 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 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批量生成静态HTML的简单原理和方法
2014/04/20 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
python实现字典嵌套列表取值
2019/12/16 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
教师求职推荐信范文
2013/11/20 职场文书
房地产出纳岗位职责
2013/12/01 职场文书
音乐教学案例
2014/01/30 职场文书
商场促销活动策划方案
2014/08/18 职场文书
学校安全管理制度
2015/08/06 职场文书
python flappy bird小游戏分步实现流程
2022/02/15 Python
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers