资讯专栏INFORMATION COLUMN

H5下拉刷新和上拉加载实现原理浅析

Bmob / 2921人阅读

摘要:原文链接前言在移动端网页中,下拉刷新和上拉加载更多数据的交互方式出现频率很高,开源社区也有很多类似的解决方案,如,库等。

原文链接:justrockit.top

前言

在移动端H5网页中,下拉刷新和上拉加载更多数据的交互方式出现频率很高,开源社区也有很多类似的解决方案,如iscroll,pulltorefresh.js库等。下面是对这两种常见交互基本实现原理的阐述。

实现原理 下拉刷新

实现下拉刷新主要分为三步:

监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY

监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于0表示向下拉动,并借助CSS3的translateY属性使元素跟随手势向下滑动对应的差值,同时也应设置一个允许滑动的最大值;

监听原生touchend事件,若此时元素滑动达到最大值,则触发callback,同时将translateY重设为0,元素回到初始位置。

示例。查看链接:下拉刷新demo(PC浏览器需调成手机模拟器模式查看)

html

  • 111
  • 222
  • 333
  • 444
  • 555
  • ...

javascript

(function(window) {
    var _element = document.getElementById("refreshContainer"),
      _refreshText = document.querySelector(".refreshText"),
      _startPos = 0,
      _transitionHeight = 0;

    _element.addEventListener("touchstart", function(e) {
        console.log("初始位置:", e.touches[0].pageY);
        _startPos = e.touches[0].pageY;
        _element.style.position = "relative";
        _element.style.transition = "transform 0s";
    }, false);
    
    _element.addEventListener("touchmove", function(e) {
        console.log("当前位置:", 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);

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

        // todo...

    }, false);
})(window);

在下拉到松手的过程中,经历了三个状态:

当前手势滑动位置与初始位置差值大于零时,提示正在进行下拉刷新操作;

下拉到一定值时,显示松手释放后的操作提示;

下拉到达设定最大值松手时,执行回调,提示正在进行更新操作。

上拉加载

上拉加载更多数据是在页面滚动时触发的动作,一般是页面滚动到底部时触发,也可以选择在滚动到一定位置的时候触发。

以滚动到页面底部为例。实现原理是分别获得当前滚动条的scrollTop值、当前可视范围的高度值clientHeight以及文档的总高度scrollHeight。当scrollTopclientHeight的值之和大于等于scrollHeight时,触发callback

示例。查看链接:上拉加载demo

html

  • 111
  • 222
  • 333
  • 444
  • 555
  • ...

(function(window) {
    // 获取当前滚动条的位置 
    function getScrollTop() { 
        var scrollTop = 0; 
        if (document.documentElement && document.documentElement.scrollTop) { 
            scrollTop = document.documentElement.scrollTop; 
        } else if (document.body) { 
            scrollTop = document.body.scrollTop; 
        } 
        return scrollTop; 
    } 
    
    // 获取当前可视范围的高度 
    function getClientHeight() { 
        var clientHeight = 0; 
        if (document.body.clientHeight && document.documentElement.clientHeight) { 
            clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight); 
        } 
        else { 
            clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight); 
        } 
        return clientHeight; 
    } 
    
    // 获取文档完整的高度 
    function getScrollHeight() { 
        return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); 
    }
    
    var _text = document.querySelector(".refreshText"),
      _container = document.getElementById("refreshContainer");
    
    // 节流函数
    var throttle = function(method, context){
      clearTimeout(method.tId);
      method.tId = setTimeout(function(){
        method.call(context);
      }, 300);
    }
    
    function fetchData() {
        setTimeout(function() {
            _container.insertAdjacentHTML("beforeend", "
  • new add...
  • "); }, 1000); } window.onscroll = function() { if (getScrollTop() + getClientHeight() == getScrollHeight()) { _text.innerText = "加载中..."; throttle(fetchData); } }; })(window);

    页面绑定onscroll事件时加入了节流函数,其作用就是忽略滚动条300毫秒内的连续多次触发。

    小结

    上拉刷新的实现主要依靠的是touch事件的三个阶段,以及借助CSS3动画效果;下拉加载主要依靠页面的onscroll事件,需要注意的是页面滚动时可能要考虑函数节流。

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/113082.html

    相关文章

    • H5下拉刷新和上拉加实现原理浅析

      摘要:原文链接前言在移动端网页中,下拉刷新和上拉加载更多数据的交互方式出现频率很高,开源社区也有很多类似的解决方案,如,库等。 原文链接:justrockit.top 前言 在移动端H5网页中,下拉刷新和上拉加载更多数据的交互方式出现频率很高,开源社区也有很多类似的解决方案,如iscroll,pulltorefresh.js库等。下面是对这两种常见交互基本实现原理的阐述。 实现原理 下拉刷新...

      X1nFLY 评论0 收藏0
    • 总结开发过程踩到的坑(五)(小程序篇)

      摘要:最近开始接触了小程序的开发,由于时间问题,文档阅读的并不完备,也踩了很多坑。的使用微信小程序不支持原生页面跳转,包括和,若要跳转小程序应用内页面,需要使用,详见。参考文献微信小程序开发者文档 最近开始接触了小程序的开发,由于时间问题,文档阅读的并不完备,也踩了很多坑。不得不说,微信的野心真是越来越大了,但是它超高的流量注定了它有这个资本。 原文地址:mini programs 目...

      young.li 评论0 收藏0
    • 总结开发过程踩到的坑(五)(小程序篇)

      摘要:最近开始接触了小程序的开发,由于时间问题,文档阅读的并不完备,也踩了很多坑。的使用微信小程序不支持原生页面跳转,包括和,若要跳转小程序应用内页面,需要使用,详见。参考文献微信小程序开发者文档 最近开始接触了小程序的开发,由于时间问题,文档阅读的并不完备,也踩了很多坑。不得不说,微信的野心真是越来越大了,但是它超高的流量注定了它有这个资本。 原文地址:mini programs 目...

      Cympros 评论0 收藏0

    发表评论

    0条评论

    Bmob

    |高级讲师

    TA的文章

    阅读更多
    最新活动
    阅读需要支付1元查看
    <