背景
支付宝小程序提供了 my.setPageScrollable(false) 来阻止底层页面滚动,但由于系统实现层面的差异,安卓与 iOS 对于滚动禁止的层级控制存在区别:
- 安卓端:采用 Webview 级滚动限制(全页面锁定),生效时界面及所有弹层均不可滚动,导致弹层内的
scroll-view也无法滚动; - iOS 端:采用组件级滚动限制(局部锁定),当弹层激活时会智能区分层级,仅限制底层页面滚动而保持弹层可滚动。
这种平台差异会导致安卓端弹层内容无法滚动,而 iOS 端正常,体验不一致。为了保证遮罩弹层的沉浸体验,需要一套跨端一致的“纯 CSS”兜底方案。
my.setPageScrollable 介绍
my.setPageScrollable 是支付宝小程序提供的全局滚动控制 API,可在当前页面维度禁止或恢复底层滚动。当传入 false 时页面不再跟随手势上下滚动,传入 true 则恢复默认行为。更多参数说明、平台差异和返回值请参考 官方文档。
最小 Demo
1 | <template> |
1 | .filter-modal, |
关键 CSS
touch-action: none:让遮罩与弹层吞掉所有原生手势,避免滚动、缩放、双击等事件传到页面主体。需要自定义点击、滚动等逻辑。overscroll-behavior: none:限制滚动惯性到容器内部,不再把“回弹”交给外层页面;在 Android 上尤其能防止继续拖拽带动 page。
组合步骤
- 固定容器:遮罩与弹层全局
touch-action: none,彻底阻断穿透。 - 内部滚动:根据内容高度动态决定是否追加
can-scroll,防止空容器被禁用触摸后看起来“卡死”。 - 锁住回弹:允许滚动的
scroll-view同时加overscroll-behavior: none,在 Android WebView 里也不会拖动到底层。 - 体验还原:关闭弹层后移除相关类名即可,无需依赖
my.setPageScrollable来恢复页面滚动。
结论
通过 touch-action + overscroll-behavior 的组合,可以在支付宝小程序中跨 iOS / Android 实现一致的弹层滚动锁定效果,完全避开 my.setPageScrollable 的兼容性分歧,让弹窗层始终沉浸、可靠。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 吴星喜的博客!

