问题描述
在 Android 设备上运行 Capacitor 打包的 Vue 3 应用时,遇到虚拟导航栏(底部返回键、主页键等)和状态栏遮挡应用内容的问题。
问题表现
- 底部 Tab 导航栏被虚拟导航栏遮挡一部分
- 顶部内容被状态栏遮挡
- 页面底部内容贴近虚拟导航栏,没有安全间距
问题根源分析
初始状态
应用使用了沉浸式布局,在 MainActivity.java 中设置了:
WindowCompat.setDecorFitsSystemWindows(getWindow(),false);getWindow().setStatusBarColor(Color.TRANSPARENT);getWindow().setNavigationBarColor(Color.TRANSPARENT);
这使得 WebView 内容延伸到状态栏和导航栏后面,实现了全屏显示。
错误的假设
最初尝试使用 CSS 的环境变量来解决:
padding-top:env(safe-area-inset-top, 0);padding-bottom:env(safe-area-inset-bottom, 0);
问题:Android WebView 不支持 CSS 的 env(safe-area-inset-*) 环境变量
实验验证
通过添加调试日志,在控制台输出:
// 检查 CSS 环境变量const rootStyles =getComputedStyle(document.documentElement) console.log('CSS 环境变量原始值:',{'safe-area-inset-top': rootStyles.getPropertyValue('safe-area-inset-top'),'safe-area-inset-bottom': rootStyles.getPropertyValue('safe-area-inset-bottom'),})// 检查实际效果 console.log('body paddingTop:',getComputedStyle(document.body).paddingTop) console.log('body paddingBottom:',getComputedStyle(document.body).paddingBottom)
实验结果:
🔍 [CSS 环境变量] 原始值:[object Object] - safe-area-inset-: (空字符串) - safe-area-inset-bottom: (空字符串) 🔍 [实验结论]: ❌ CSS 环境变量未生效 - 硬性编码起作用

