解决 IOS H5 div 中 bounces 滑动回弹效果去除的各种尝试

1. 阻止默认滑动行为

mounted () {
    document.body.addEventListener(
      'touchmove',
      function (e) {
        e.preventDefault() // 阻止默认的处理方式(阻止下拉滑动的效果)
      },
      { passive: false }
    ) // passive 参数不能省略,用来兼容ios和android
}

结果整个页面都无法滑动,不是我要的效果。如果是有页面不要滑动的那种可以尝试。

2. 使用 vue-bounce

使用 vue-bounce 来解决,也没啥用。不知道是不是我打开的方式不对。

安装

$ npm install vue-bounce
// main.js
import Bounce from 'vue-bounce'

Vue.use(Bounce)

使用指令

<div class="container" v-bounce>
    ...scroll element
</div>
.container {
    height: 100vh;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

PS:又尝试了一下,还是有点效果的。就是在顶部进行下拉时会禁用掉 touchmove 事件,但是效果还是不好。因为我可能先往下滑滑不动又往别的方向滑。

3. 通过 ios 端关闭弹性效果

灵光一闪,想问下 IOS 端的同学能不能把弹性关了,他给出的解决方案,结合我们 native 端使用了 flutter,给出方案:

_webView.scrollView.alwaysBounceVertical = NO;
_webView.scrollView.bounces = NO;

我让 native 端的同学进行尝试,结果据 flutter 端同事回复,这个开关只关闭了页面整体边缘的橡皮筋效果,对于 H5 内 div 的边界弹性效果无效。

4. 关闭 body 的滑动,只允许目标元素滑动

网上找的方案,明显不对味。

// Prevents window from moving on touch on older browsers.
window.addEventListener('touchmove', function (event) {
  event.preventDefault()
}, false)

// Allows content to move on touch.
document.querySelector('.body-container').addEventListener('touchmove', function (event) {
  event.stopPropagation()
}, false)

没什么用……感觉这个是解决页面整体弹性滑动的。

5. 使用 overscroll-behavior

使用一个新的 CSS 属性来实现

container {
  overscroll-behavior: none;
}

结果,依旧不行。

6. 使用 iNoBounce

使用 https://github.com/lazd/iNoBounce 来阻止回弹效果,发现效果应该是和 vue-bounce 一样,在用户直接拖拽边缘的时候禁用移动行为,但依然存在来回滑动没反应的情况。

7. 阻止默认滑动行为,自己用 JavaScript 控制滑动

最后通过自己写拖拽滑动,的确解决了这个问题。解决方案在 解决 IOS 13+ H5 滑动边界橡皮筋弹性效果
一文中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容