禁用下拉刷新需分端差异化处理:iOS需CSS+JS双管齐下封堵滚动链,支付宝小程序需配置allowsBounceVertical: "NO",App端设app-plus.bounce为none,H5端用overscroll-behavior或JS控制,弹窗场景须防滚动穿透。

直接禁用 enablePullDownRefresh 并不能在所有端生效,尤其 iOS 和支付宝小程序仍会保留“橡皮筋”下拉视觉反馈。必须结合平台特性做差异化处理。
pages.json 中禁用下拉刷新只是第一步
单纯设 "enablePullDownRefresh": false 只能阻止 onPullDownRefresh 回调触发,但不等于禁掉物理下拉动作:
- iOS(WKWebView):系统级 overscroll 行为仍在,页面可被拖出空白区
- 支付宝小程序:需额外配
"allowsBounceVertical": "NO"才真正禁拖拽 - App 端(iOS/Android):建议同步加
"app-plus": {"bounce": "none"} - H5 端:该配置无效,得靠 CSS 或 JS 控制
overscroll-behavior
iOS 页面级橡皮筋必须双管齐下
只改 pages.json 不够,iOS 需要 CSS + JS 协同封堵滚动链:
- 在页面根容器加 class(如
page-container),CSS 写:.page-container { overflow: hidden; height: 100vh; } - 在
onLoad或mounted中延时执行:document.body.style.overflow = 'hidden'(注意兼容微信小程序基础库) - 若用了
scroll-view,必须同时开启enhanced="true",否则bounces="false"在 iOS 无效 -
overscroll-behavior: none要穿透到内部元素:/deep/.uni-scroll-view, /deep/.uni-scroll-view-content { overscroll-behavior: none; }
弹窗出现时下层页面还在滚动?那是滚动穿透
这不是下拉刷新问题,而是事件冒泡+body 滚动未锁死导致的典型穿透现象:
- 弹窗打开时,给最外层容器加 class:
fixed-page,对应 CSS:.fixed-page { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } - 同时在弹窗区域加
@touchmove.prevent,或绑定空方法:@touchmove.prevent="() => {}" - 如果弹窗内含
scroll-view,确保它自身高度可控、内容足够高,否则bounces不触发
条件编译是跨端禁用的关键
各端禁用机制不同,硬写统一配置必踩坑。必须用条件编译分端处理:
- 支付宝端:在
pages.json对应页面 style 中插入#ifdef MP-ALIPAY块,加"allowsBounceVertical": "NO" - App 端:用
#ifdef APP-PLUS加"app-plus": {"bounce": "none"} - iOS H5:用
#ifdef H5+ JS 动态设document.body.style.overscrollBehavior = 'none' - 别漏掉微信小程序——它默认无橡皮筋,但若用了自定义
scroll-view,仍要检查enhanced和穿透样式
真正难的不是“怎么关”,而是判断当前场景属于哪一类:是原生页面滚动?scroll-view 容器?还是弹窗叠加态?每种都要匹配对应的禁用路径,漏掉一层就可能白忙活。


















