H5下拉刷新和上拉加載完成道理淺析

原文鏈接:justrockit.top

媒介

在挪動端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。當scrollTopclientHeight的值之和大於即是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事宜,須要注重的是頁面轉動時可能要斟酌函數撙節。

    原文作者:五月的星空
    原文地址: https://segmentfault.com/a/1190000014423308
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞