微信瀏覽器在為scroll元素設置 -webkit-overflow-scrolling 時會使用ios彈性滾動特性。微信本身有黑色區域的彈性滑動。
在android下沒什么問題,但是在ios下兩者會產生沖突。
解決方法:
方法1. 網上流傳最廣的思路是設置touchmove的事件中preventDefault;但是這個方法有個問題是把ios的彈性滾動一並禁用掉了。
方法2:
發現微信的彈性滾動觸發機制是 手指按下時並且此時scroll觸頂(底),根據這個特性解決辦法代碼:
let scrollEle = document.body; scrollEle.addEventListener('touchstart', (evt) => { // 修復微信的黑色彈性滾動與ios沖突問題 let scrollTop = scrollEle.scrollTop; let scrollHeight = scrollEle.scrollHeight; let height = scrollEle.offsetHeight; let scrollTopTo; // 頂部 scrollTopTo = Math.max(scrollTop, 1); // 底部 if(scrollTopTo === scrollHeight - height) { scrollTopTo--; } if(scrollTop != scrollTopTo) { scrollEle.scrollTop = scrollTopTo; } });
原理:因為微信的彈性觸發機制是手指按下時,scroll元素是否觸頂。因此為了避免觸發此特性,當手指按下時將scroll元素上移1px,這樣就無法觸發微信的彈性滾動,但是此時ios的彈性滾動依然生效。
底部的情況由於ios彈性滾動能夠使scrollTop超過可滾動距離,因此只判斷嚴格的觸底條件即可。