Skip to content

弹窗滚动穿透 ​

滚动穿透:在弹窗或遮罩上滑动时,底层页面跟随滚动;弹窗内容滚动到边界后继续滑动也可能触发。

推荐:使用 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',
  },
})

若使用该方式,关闭弹窗时需恢复原样式,并检查目标基础库与真机支持情况。

基于 MIT 许可发布