uni-app 安卓 video 原生组件全屏后收起 视窗高度异常 包含安卓底部虚拟导航栏高度
uni-app 安卓 video 原生组件全屏后收起 视窗高度异常 包含安卓底部虚拟导航栏高度
操作步骤:
- 进入带video 页面
- 点击 全屏 再退出全屏
- 视窗的高度包括了底部导航栏的高度
预期结果:
- 视窗的高度不发生变化
实际结果:
- 视窗的高度发生变化
bug描述:
安卓 video 全屏之前视窗高度正常,进入全屏再退出后,uniapp整个视窗的高度包括了安卓虚拟导航栏。导致虚拟导航栏遮挡了页面下方的内容
| 信息类别 | 详细信息 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC开发环境版本 | Windows 10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 3.2.6 |
| 手机系统 | Android |
| 手机系统版本 | Android 9.0 |
| 手机厂商 | vivo |
| 手机机型 | X27 |
| 页面类型 | vue |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |
更多关于uni-app 安卓 video 原生组件全屏后收起 视窗高度异常 包含安卓底部虚拟导航栏高度的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我用hello uni复现不了你说的问题。 能提供一个demo吗
更多关于uni-app 安卓 video 原生组件全屏后收起 视窗高度异常 包含安卓底部虚拟导航栏高度的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你只需要在带video的底部写个fixed元素,就能复现这个问题(底部导航覆盖住了底部的元素)
s-popup 是个fixed 元素 定位到页面底部; 你只需要在带video的底部写个fixed元素,就能复现这个问题(底部导航覆盖住了底部的元素)。
<template>这是一个已知的安卓原生组件全屏切换时的常见问题。核心原因是退出全屏后,WebView视口高度计算未正确恢复,错误包含了底部虚拟导航栏区域。
直接解决方案:
在退出全屏事件后,手动重置页面高度。在 video 组件的 @fullscreenchange 事件中处理:
onFullscreenChange(e) {
const isFullscreen = e.detail.fullScreen;
if (!isFullscreen) {
// 退出全屏后,强制重置窗口高度
setTimeout(() => {
const res = uni.getSystemInfoSync();
const windowHeight = res.windowHeight;
// 将根节点或页面容器高度设置为正确的窗口高度
// 例如使用uni-update-container或直接操作dom
uni.createSelectorQuery()
.select('#page-container')
.style('height', windowHeight + 'px')
.exec();
}, 50); // 短暂延迟确保全屏切换完成
}
}
备选方案:
-
使用
fullscreenchange监听结合 CSS 修复: 在退出全屏时,为页面容器添加一个修复类,强制修正高度:.fullscreen-fix { height: 100vh !important; } -
配置
manifest.json的沉浸式状态栏: 确保app-plus下的statusbar和safearea配置正确,部分机型需要明确安全区控制:"app-plus": { "safearea": { "bottom": { "offset": "none" } } }
临时规避方法:
在退出全屏后,轻微滚动页面或触发一次窗口重绘,有时能恢复正确高度:
uni.pageScrollTo({
scrollTop: 1,
duration: 0
});

