前言

本系列主要整理前端面试中需要掌握的知识点。本节介绍如何实现上拉加载和下拉刷新。

文章目录

  • 前言
  • 一、介绍
  • 二、实现原理
    • 1、上拉加载
    • 2、下拉刷新

一、介绍

  • 下拉刷新和上拉加载这两种交互方式通常出现在移动端中;
  • 本质上等同于PC网页中的分页,只是交互形式不同;
  • 开源社区也有很多优秀的解决方案,如iscroll、better-scroll、pulltorefresh.js库等等,这些第三方库使用起来非常便捷;
  • 这里我们通过原生的方式实现一次上拉加载,下拉刷新,有助于对第三方库有更好的理解与使用

二、实现原理

1、上拉加载

属性 含义
offsetTop 元素的上外边框至包含元素的上内边框之间的像素距离,其他方向相同
offsetWidth 元素两端算上外边框的宽度,其他方向相同
scrollLeft 和 scrollTop 既可以确定当前元素的滚动状态,也可以设置元素的滚动位置
scrollWidth 和 scrollHeight 确定元素内容的实际大小
clientWidth 元素内容区宽度加上左右内边距宽度,即clientWidth = content + padding
clientHeight 元素内容区高度加上上下内边距高度,即clientHeight = content + padding

上拉加载的本质是页面触底,或者快要触底时的动作
触底公式:scrollTop + clientHeight >= offsetTop

let clientHeight  = document.documentElement.clientHeight; //浏览器高度
let scrollHeight = document.body.scrollHeight;
let scrollTop = document.documentElement.scrollTop;let distance = 50;  //距离视窗还用50的时候,开始触发;if ((scrollTop + clientHeight) >= (scrollHeight - distance)) {console.log("开始加载数据");
}

2、下拉刷新

下拉刷新的本质是页面本身置于顶部时,用户下拉时需要触发的动作,主要分为三个步骤:

  • 监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY;
  • 监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于0表示向下拉动,并借助CSS3的translateY属性使元素跟随手势向下滑动对应的差值,同时也应设置一个允许滑动的最大值;
  • 监听原生touchend事件,若此时元素滑动达到最大值,则触发callback,同时将translateY重设为0,元素回到初始位置。
<main><p class="refreshText"></p ><ul id="refreshContainer"><li>111</li><li>222</li><li>333</li><li>444</li><li>555</li>...</ul>
</main>

监听touchstart事件,记录初始的值

var _element = document.getElementById('refreshContainer'),_refreshText = document.querySelector('.refreshText'),_startPos = 0,  // 初始的值_transitionHeight = 0; // 移动的距离_element.addEventListener('touchstart', function(e) {_startPos = e.touches[0].pageY; // 记录初始位置_element.style.position = 'relative';_element.style.transition = 'transform 0s';
}, false);

监听touchmove移动事件,记录滑动差值

_element.addEventListener('touchmove', function(e) {// e.touches[0].pageY 当前位置_transitionHeight = e.touches[0].pageY - _startPos; // 记录差值if (_transitionHeight > 0 && _transitionHeight < 60) { _refreshText.innerText = '下拉刷新'; _element.style.transform = 'translateY('+_transitionHeight+'px)';if (_transitionHeight > 55) {_refreshText.innerText = '释放更新';}}
}, false);

监听touchend离开的事件

_element.addEventListener('touchend', function(e) {_element.style.transition = 'transform 0.5s ease 1s';_element.style.transform = 'translateY(0px)';_refreshText.innerText = '更新中...';// todo...}, false);

【前端知识之JS】如何实现上拉加载和下拉刷新相关推荐

  1. better-scroll 上拉加载,下拉刷新(解决移动端长页面卡顿)

    一.Better Scroll 滚动原理 1.下图能直观的表示better-scroll的滚动原理 2.html设置 <div class="wrapper"> < ...

  2. 基于iSroll 5.0实现的上拉加载和下拉刷新插件

    Updownload.js 基于iSroll 5.0实现的上拉加载和下拉刷新插件 移动端效果比较好,开发者工具打开后,需要刷新下页面. [演示地址:] https://chenyk2016.githu ...

  3. 让你的微信小程序对用户更加友好:上拉加载和下拉刷新就是关键

    前言 上拉加载和下拉刷新是小程序开发的常见需求.本文将介绍如何在微信小程序中实现上拉加载和下拉刷新的功能,为用户带来更加流畅.便捷的使用体验. 实现效果如下: 实现思路: 1. 首先需要在使用到的 j ...

  4. 如何实现上拉加载,下拉刷新?

    如何实现上拉加载,下拉刷新? 一.前言 二.实现原理 上拉加载 下拉刷新 三.案例 小结 一.前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页,只是交互形式不同 ...

  5. 如何实现上拉加载和下拉刷新

    下拉刷新和上拉加载这两种交互⽅式通常出现在移动端中 本质上等同于PC⽹⻚中的分⻚,只是交互形式不同 开源社区也有很多优秀的解决⽅案,如 iscroll . better-scroll . pullto ...

  6. 面试官:JavaScript如何实现上拉加载,下拉刷新?

    一.前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页,只是交互形式不同 开源社区也有很多优秀的解决方案,如iscroll.better-scroll.pullto ...

  7. html5上拉下拉刷新,APP 上拉加载,下拉刷新 介绍

    开发APP时,很多时候都会用上,上拉加载数据,下拉刷新等功能,本文件介绍两种. 一种是原生APP自带的上拉加载,下拉刷新功能,一种是用JS 插件写的上拉加载,下拉刷新. 1.原生APP 的 上拉加载, ...

  8. 小程序上拉加载,下拉刷新

    小程序上拉加载,下拉刷新 data: {collectinformation: null,number: 1,size: 10,isOpenLoading: true,isEmpty: true,is ...

  9. tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...

    废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" ...

最新文章

  1. Maven -- 使用Myeclipse创建Maven项目
  2. YOLOv3: 训练自己的数据(绝对经典版本1)
  3. tesklink 管理员项目角色被修改后的解决方法
  4. Codeforces 746 G. New Roads
  5. swarm 本地管理远程_带有WildFly Swarm的远程JMS
  6. 实现对gridview删除行时弹出确认对话框的四种方法
  7. 英语学习笔记2019-12-06
  8. android 更新apk 应用为安装,应用未安装!从Android Studio构建安装APK时出错 - java
  9. php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码
  10. 单网卡同时上内外网_Win10双网卡上网冲突(内网、外网)
  11. python包 —rdkit 安装
  12. 渗透测试技术_Nessus工具(一)Linux centos7下 Nessus8.13的下载、安装
  13. gimp 抠图_GIMP006:从简单抠图了解GIMP的浮动选区功能
  14. 云计算淡定从容的大局观
  15. Hadoop完全分布式搭建全过程
  16. 航信软件里面的虚拟服务器,航天信息网络应用平台
  17. vue中的观察者模式
  18. 【环境搭建】Docker镜像相关操作(切换镜像源、查询、获取、查看、创建、上传、保存、删除等)
  19. Jquery实现AJAX异步通信
  20. 分子间相互作用力——氢键,卤键,硫键,π-π堆积,盐桥,阳离子-π,疏水作用力

热门文章

  1. linux中dup2函数,dup与dup2函数
  2. Cisco Packet Tracer_实验四_使用两台二层交换机配置vlan
  3. 微信BUG之微信内置的浏览器中window.location.href 不跳转
  4. Linux应用程序简介
  5. 几大高薪安全认证,考取一个离娶“白富美”就不远了!!
  6. linux inittab文件在哪,详解Linux系统中的进程初始化配置文件inittab
  7. vue2项目使用element-ui的el-tabs组件导致浏览器崩溃卡死
  8. ERP下会计信息系统的探索
  9. java 足球比赛小游戏
  10. Web前端进阶:学Web前端应了解的知识