在微信小程序中,如果你在 scroll-view 内部使用了多个独立的 scroll-view 组件,并且希望它们的内部滑动行为不影响外部页面的上拉下拉操作(如页面滚动),那么你需要特别注意 事件冒泡机制 和 滚动优先级 的设置。你有两个或多个 内部的 scroll-view,当它们被滑动时,可能会影响外部页面的上拉/下拉操作。这通常是由于事件冒泡导致的。在内部的 scroll-view 上添加 catchtouchmove="true",可以阻止触摸事件冒泡到外层。
解决方案一
在内部 scroll-view 上设置 catchtouchmove='true',这样内部滑动就不会冒泡到父容器了。同时,如果外部是 page 页面,记得在 page 的 json 文件中设置 "disableScroll": true 来禁用页面滚动。
解决方案二
使用 scroll-view 的 bindscrolltoupper 和 bindscrolldown 等事件,但最简单的是在内部 scroll-view 加 catchtouchmove="true" 和 catchtouchstart="true"。
解决方案三
如果外部是另一个 scroll-view,内部的要设置 style="pointer-events: none;" 不行,最好的方式是内部 scroll-view 设置 catchtouchmove="true",外部 scroll-view 设置 scroll-y。
解决方案四
问题描述:嵌套的 scroll-view 滑动会影响外层。解决:在内层 scroll-view 添加属性 catchtouchmove="true",就可以阻止事件冒泡了。
解决方案五
在微信小程序开发者工具中,两个内部 scroll-view 滑动影响页面上拉下拉,添加 catchtouchmove="true" 到每个内部 scroll-view 上即可解决。
解决方案六
重点:在内部 scroll-view 的标签上写 catchtouchmove="true",这样触摸事件就不会传递到外面了。示例代码:
FAQ
Q: 为什么内部 scroll-view 会影响外部页面滚动?
A: 因为触摸事件默认会冒泡到父元素,导致外部容器也响应滑动。
Q: catchtouchmove="true" 有什么副作用吗?
A: 不会,仅仅阻止事件冒泡,内部滚动正常工作。
Q: 如果外部是整个 page,怎么办?
A: 在 page 的 json 中加 "disableScroll": true。
Q: 横向和纵向 scroll-view 都要加吗?
A: 是的,无论方向,都加 catchtouchmove="true"。