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


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 相关文章推荐
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
Web开发之JavaScript
Mar 29 Javascript
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
Aug 14 Javascript
基于ajax实现文件上传并显示进度条
Aug 03 Javascript
jQuery实现的右下角广告窗体跟随效果示例
Sep 16 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
Angular指令之restict匹配模式的详解
Jul 27 Javascript
elementUI中Table表格问题的解决方法
Dec 04 Javascript
JavaScript原型对象原理与应用分析
Dec 27 Javascript
解决vue 单文件组件中样式加载问题
Apr 24 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 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
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
python控制台中实现进度条功能
2015/11/10 Python
wxpython实现图书管理系统
2018/03/12 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python中格式化字符串的四种实现
2020/05/26 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
科室工作个人总结的自我评价
2013/10/29 职场文书
求职信标题怎么写
2014/05/26 职场文书
志愿者活动总结报告
2014/06/27 职场文书
离婚案件答辩状
2015/05/22 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
一文搞懂MySQL索引页结构
2022/02/28 MySQL