原文鏈接: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
。當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
事宜,須要注重的是頁面轉動時可能要斟酌函數撙節。