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

4 回复

我用hello uni复现不了你说的问题。 能提供一个demo吗

更多关于uni-app 安卓 video 原生组件全屏后收起 视窗高度异常 包含安卓底部虚拟导航栏高度的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你只需要在带video的底部写个fixed元素,就能复现这个问题(底部导航覆盖住了底部的元素)

s-popup 是个fixed 元素 定位到页面底部; 你只需要在带video的底部写个fixed元素,就能复现这个问题(底部导航覆盖住了底部的元素)。

<template>
<s-popup :maskEnable="false" v-if="Url"/>
</template> <script lang="ts" src="./main.ts"> </script> <style lang="less"> .app { height: 100vh; width: 100vw; overflow: hidden; position: relative; background-position: center top; background-size: cover; &::after{ content: ''; display: block; height: 100%; width: 100%; position: absolute; top: 0; left: 0; background: inherit; filter: blur(20px) brightness(0.9); transform: scale(1.2); z-index: -1; } video{ z-index: 11; width: 100%; height: calc(100vh - 298rpx); padding-bottom: 0; } } </style>

这是一个已知的安卓原生组件全屏切换时的常见问题。核心原因是退出全屏后,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); // 短暂延迟确保全屏切换完成
  }
}

备选方案:

  1. 使用 fullscreenchange 监听结合 CSS 修复: 在退出全屏时,为页面容器添加一个修复类,强制修正高度:

    .fullscreen-fix {
      height: 100vh !important;
    }
    
  2. 配置 manifest.json 的沉浸式状态栏: 确保 app-plus 下的 statusbarsafearea 配置正确,部分机型需要明确安全区控制:

    "app-plus": {
      "safearea": {
        "bottom": {
          "offset": "none"
        }
      }
    }
    

临时规避方法:

在退出全屏后,轻微滚动页面或触发一次窗口重绘,有时能恢复正确高度:

uni.pageScrollTo({
  scrollTop: 1,
  duration: 0
});
回到顶部