主题
弹窗滚动穿透
滚动穿透:在弹窗或遮罩上滑动时,底层页面跟随滚动;弹窗内容滚动到边界后继续滑动也可能触发。
推荐:使用 page-meta 锁定页面滚动
弹窗打开时为页面根节点设置 overflow: hidden,关闭时恢复原样式。
xml
<!-- 必须是页面内的第一个节点 -->
<page-meta page-style="{{visible ? 'overflow: hidden;' : ''}}" />- 基础库
2.9.0起支持,page-style接收样式字符串。 visible与弹窗显隐状态同步;关闭时置空以恢复原有样式,也可按页面需要显式设置overflow: auto。- 自定义弹窗组件由页面统一管理锁定状态;多个弹窗叠加时,全部关闭后再恢复滚动。
- 弹窗内部使用具有明确高度的
scroll-view承载长内容。 - 底层若使用独立的
scroll-view,需另行控制其scroll-y,不能仅依赖页面根节点样式。
其他方案与限制
| 方案 | 限制 |
|---|---|
遮罩绑定 catchtouchmove | 可拦截部分滑动,但不能覆盖所有穿透场景;绑定在内容区祖先上还可能阻止内部 scroll-view 滚动 |
底层容器设置 position: fixed | 可能导致页面跳到顶部,需额外保存和恢复滚动位置 |
关闭后调用 wx.pageScrollTo | 仅恢复位置,不能解决弹窗打开期间的穿透,且可能产生跳动 |
资料中也有使用 wx.setPageStyle 动态设置页面样式的写法,但其公开 API 文档与兼容性未确认,不作为首选:
js
wx.setPageStyle({
style: {
overflow: 'hidden',
},
})若使用该方式,关闭弹窗时需恢复原样式,并检查目标基础库与真机支持情况。
