绝大多数情况不应彻底去掉ios底部安全区域,而应使用env(safe-area-inset-bottom)设置padding或背景色适配;manifest中"offset":"none"仅对app-plus生效且有手势冲突、内容裁切等副作用。

直接去掉 iOS 底部安全区域是可行的,但得先明确:你真要“去掉”,还是只是想“不被白条干扰”?前者会破坏系统手势(比如上滑回主屏),后者只需正确适配即可。绝大多数情况,你不需要也不应该彻底去掉安全区域,而是用 env(safe-area-inset-bottom) 控制 padding 或背景色。
manifest.json 里设 "offset": "none" 确实能禁用原生占位,但有副作用
这个配置只对 app-plus(即打包成 iOS 原生 App)生效,H5 和小程序完全忽略它。
-
"app-plus": { "safearea": { "bottom": { "offset": "none" } } }会让 uni-app 不再自动插入底部占位<view></view>,页面容器会真正贴到屏幕最底边 - 副作用明显:如果你的页面底部有按钮、tabbar 或固定定位元素,它们会直接压进系统手势区,用户点不到、或误触发上滑返回
- 更隐蔽的问题:某些机型(如 iPhone 14 Pro 横屏)
safe-area-inset-bottom为 0,但"offset": "none"仍会强行抹掉所有留白,导致内容被圆角裁切 - 改完必须重新编译 + 重启调试基座,热更新不生效
CSS 中用 env(safe-area-inset-bottom) 是主流且安全的做法
这是苹果原生支持的环境变量,iOS 11.2+ 全面可用,uni-app 编译后在 App 和 H5 都能正确读取(小程序需另处理)。
- 必须同时写两行,兼容旧版 iOS:
padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom); - 加在内容容器上,比如
.page-body或.main-content,别加在page根节点,否则可能撑开滚动高度 - 不要用
px或rpx硬写高度,例如padding-bottom: 34rpx—— XR 是 34,Pro 是 0(横屏)、21(竖屏),mini 机型又不同 - 如果底部是纯色背景,仅靠 padding 不够,还要确保父容器背景色延伸到底部,否则露出白色“底裤”
JS 动态读取 safeAreaInsets.bottom 适合复杂交互场景
当你的布局依赖运行时状态(比如横竖屏切换、全屏视频退出、弹窗动态避让),就得用 JS 获取真实值。
- 必须在
onReady后调用,onLoad里取可能为空(尤其冷启动) - 返回单位是 px,不是 rpx,需手动转换:
uni.upx2px(uni.getSystemInfoSync().safeAreaInsets.bottom) - 务必兜底:
const bottom = systemInfo.safeAreaInsets?.bottom || 0,因为 H5 下该字段为undefined - 微信/支付宝小程序也支持该 API,但返回值单位统一为 px,行为一致
最容易被忽略的一点:所谓“底部白条”,90% 不是安全区域没适配,而是你取消了 tabbar 后,页面背景色没填满整个 viewport,系统默认用白色补足——这时候该检查的是 background-color 层级和 height 设置,而不是急着关安全区。











