controls="false" 在H5端可完全隐藏控制栏,App端需处理厂商系统残留灰条,小程序端须配合show-center-play-btn="false"等属性才能彻底隐藏控件。

controls="false" 在不同端的实际效果差异
直接写 controls="false" 能在 H5 和 App 端基本隐藏原生控制栏,但小程序端(尤其微信)会“选择性忽略”——它可能仍显示进度条、播放/暂停按钮,甚至右上角的全屏按钮。这不是 bug,是微信原生 video 组件的限制:设为 false 后,仅禁用部分控件,show-center-play-btn、enable-play-gesture 等行为仍独立生效。
实操建议:
- 小程序端必须配合
show-center-play-btn="false"和show-fullscreen-btn="false"才能真正收掉中心播放按钮和全屏入口 - App 端(iOS/Android)设
controls="false"后,某些 Android 厂商系统(如 MIUI)仍残留灰色进度条,此时需额外加style="height: 100%; width: 100%;"并确保父容器无 padding/margin 干扰 - H5 端最干净,
controls="false"即可,但注意 Chrome 120+ 对video的默认 focus outline 有残留,可加:focus { outline: none; }消除
为什么 controls="false" 动态绑定无效
写成 :controls="isShowControls" 或 v-bind:controls="false",在切换值时不会触发控件显隐更新——因为 uni-app 的 video 组件在初始化后,controls 属性被缓存为只读状态,后续变更不触发原生层重绘。
正确做法是强制重建组件实例:
- 用
v-if控制组件挂载:<video v-if="videoKey" :src="src" controls="false"></video> - 需要隐藏/显示控制栏时,更新
videoKey(如this.videoKey = Date.now()),Vue 会销毁并重新创建整个video实例 - 注意:该法对直播流(如
.m3u8)特别有效,避免旧连接残留导致的黑屏或卡顿
controls="false" 后仍出现“半透明遮罩”或“灰色横条”
这不是控件,而是平台原生渲染层的视觉残留。常见于 Android App 端:即使 controls="false",VideoView 底层仍会绘制一个固定高度(约 44px)的空控件区域,表现为顶部或底部的灰条。
解决路径:
- App 端必须检查
manifest.json → App 模块配置是否勾选了VideoPlayer,未勾选会导致降级渲染,控件逻辑错乱 - 若已勾选,可在
pages.json对应页面的app-plus配置中加"titleNView": false,防止导航栏与视频控件区域重叠干扰 - 真机调试时发现灰条位置固定,可用
transform: translateY(-44px)临时下移 video 元素(仅作定位排查,非最终方案)
想彻底接管控制,但 timeupdate 不触发或不准
设 controls="false" 后,依赖 @timeupdate 获取播放进度,但常遇到事件不触发、频率过低(如每秒 1–2 次)、或 iOS 上首次加载延迟高达 3–5 秒。
关键原因和应对:
-
@timeupdate依赖原生播放器帧回调,H5 端受浏览器策略影响大;App 端更稳定,但需确保video已成功play()(自动播放失败时,事件根本不会启动) - 务必搭配
@canplay或@loadedmetadata初始化时长:endTime = uni.createVideoContext('myVideo').getDuration(),否则timeupdate返回的当前时间可能为 0 - iOS Safari / 微信 iOS 客户端需加
playsinline="true"和webkit-playsinline="true",否则timeupdate在非全屏状态下极不稳定


















