話不多說(shuō),直接上代碼:
//可滾動(dòng)容器的高度
let innerHeight = document.querySelector('#app').clientHeight;
//屏幕尺寸高度
let outerHeight = document.documentElement.clientHeight;
//可滾動(dòng)容器超出當(dāng)前窗口顯示范圍的高度
let scrollTop = document.documentElement.scrollTop;
if (innerHeight < (outerHeight + scrollTop)) {
//加載更多操作
console.log("loadmore");
}
就這幾行代碼也沒(méi)什么可說(shuō)的,每個(gè)值在注釋里面寫(xiě)的很清楚。
接下來(lái),從一張GIF圖中來(lái)探尋上述幾行代碼是如何實(shí)現(xiàn)無(wú)感知上拉加載的:
console中分別打印的是可滾動(dòng)容器的高度innerHeight、屏幕尺寸的高度outerHeight、可滾動(dòng)容器超出當(dāng)前窗口顯示范圍的高度scrollTop。可以看到我選擇的模擬器是iPhone5,屏幕高度568,這個(gè)值無(wú)論怎么滾動(dòng),都不會(huì)變。而scrollTop會(huì)隨著滾動(dòng)而增加,當(dāng)滾動(dòng)的底部無(wú)法再往下滾動(dòng)時(shí),這個(gè)數(shù)值停止增加,此時(shí),innerHeight < (outerHeight + scrollTop),我們就可以使用這個(gè)條件進(jìn)行上拉加載的操作了。
最后,獻(xiàn)上完整代碼(粘貼復(fù)制就能看到效果):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p v-for="index in items">item{{ index }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
items: 20
},
created() {
window.addEventListener('scroll', this.onScroll);
},
methods: {
onScroll() {
//可滾動(dòng)容器的高度
let innerHeight = document.querySelector('#app').clientHeight;
//屏幕尺寸高度
let outerHeight = document.documentElement.clientHeight;
//可滾動(dòng)容器超出當(dāng)前窗口顯示范圍的高度
let scrollTop = document.documentElement.scrollTop;
//scrollTop在頁(yè)面為滾動(dòng)時(shí)為0,開(kāi)始滾動(dòng)后,慢慢增加,滾動(dòng)到頁(yè)面底部時(shí),出現(xiàn)innerHeight < (outerHeight + scrollTop)的情況,嚴(yán)格來(lái)講,是接近底部。
console.log(innerHeight + " " + outerHeight + " " + scrollTop);
if (innerHeight < (outerHeight + scrollTop)) {
//加載更多操作
console.log("loadmore");
this.items += 10;
}
}
}
})
</script>
</body>
</html>