HTML5下拉刷新和上拉加载实现原理浅析
沉沙 2018-05-11 来源 : 阅读 983 评论 0

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

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

实现原理

下拉刷新

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

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

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

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

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

html

<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>

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。当scrollTop和clientHeight的值之和大于等于scrollHeight时,触发callback。

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

html

<main>

    <ul id="refreshContainer">

        <li>111</li>

        <li>222</li>

        <li>333</li>

        <li>444</li>

        <li>555</li>

        ...

    </ul>

    <p class="refreshText"></p></main>

(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', '<li>new add...</li>');

        }, 1000);

    }

    

    window.onscroll = function() {

      if (getScrollTop() + getClientHeight() == getScrollHeight()) {

        _text.innerText = '加载中...';

        throttle(fetchData);

      }

    };

 

})(window);

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


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

本文由职坐标整理发布,更多相关内容请关注职坐标WEB前端HTML5/CSS3频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved