概述
今天在做 Vue 移動端項目的時候遇到了滾動穿透問題,在網上查資料后,選取了我覺得最好的方法,記錄下來供以后開發時參考,相信對其他人也有用。
上層無需滾動
如果上層無需滾動的話,直接屏蔽上層的 touchmove 事件即可。示例如下:
<div @touchmove.prevent>
我是里面的內容
</div>
上層需要滾動
如果上層需要滾動的話,那么固定的時候先獲取 body 的滑動距離,然后用 fixed 固定,用 top 模擬滾動距離;不固定的時候用獲取 top 的值,然后讓 body 滾動到之前的地方即可。示例如下:
<template>
<div @click="handleHambergerClick"></div>
</template>
<script>
export default {
name: 'BaseHeaderMobile',
data() {
return {
isHeaderVisible: false,
};
},
methods: {
handleHambergerClick() {
// hack: 滑動穿透問題
if (!this.isHeaderVisible) {
this.lockBody();
} else {
this.resetBody();
}
this.isHeaderVisible = !this.isHeaderVisible;
},
lockBody() {
const { body } = document;
const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
body.style.position = 'fixed';
body.style.width = '100%';
body.style.top = `-${scrollTop}px`;
},
resetBody() {
const { body } = document;
const { top } = body.style;
body.style.position = '';
body.style.width = '';
body.style.top = '';
document.body.scrollTop = -parseInt(top, 10);
document.documentElement.scrollTop = -parseInt(top, 10);
},
},
};
</script>