controls="false"不是终点,需分端处理:小程序须配齐show-center-play-btn、show-fullscreen-btn、enable-play-gesture三个false;app端防厂商灰条需配置titlenview和videoplayer;h5端需加outline:none和@contextmenu.prevent。

controls="false" 是起点,但不是终点。不同端行为差异极大,直接写这个属性在小程序里大概率失效,在 App 端可能残留灰条,在 H5 端最干净但也需防 outline。
小程序端必须配齐三个 false
微信小程序的 <video></video> 是原生组件,controls="false" 仅禁用部分控件,不触发声控、全屏、中心播放按钮等独立开关:
-
show-center-play-btn="false":否则全黑画面下仍显示白色三角播放图标 -
show-fullscreen-btn="false":否则右上角始终存在全屏入口(iOS 微信尤其顽固) -
enable-play-gesture="false":防止双击/滑动触发播放/暂停,干扰自定义逻辑
注意:controls 属性值必须是字符串 "false",写成 :controls="false"(布尔绑定)会失效;且这些属性一旦初始化就固化,后续修改不会重绘。
App 端要防厂商系统“偷偷画灰条”
Android 厂商(如 MIUI、HyperOS)的 VideoView 在 controls="false" 后仍会渲染一个约 44px 高的空控件区域,表现为底部或顶部灰色横条:
- 确认
manifest.json→App 模块配置中已勾选VideoPlayer,未勾选会导致降级为低兼容性渲染 - 在
pages.json对应页面的app-plus配置中加"titleNView": false,避免导航栏与视频区域重叠干扰 - 真机调试时可用
transform: translateY(-44px)临时下移 video 元素定位灰条——但这只是排查手段,不能作为最终样式
iOS 端则需额外关掉 enable-danmu,否则弹幕通道会强制锁定竖屏并劫持方向控制权。
H5 端最简单,但有细节陷阱
H5 下 controls="false" 能彻底隐藏控件,但有两个易忽略点:
- Chrome 120+ 默认给
<video></video>加 focus outline,点击后出现蓝色边框,需加 CSS::focus { outline: none; } - 右键菜单仍可调出原生控件,需拦截:
@contextmenu.prevent - 若用
v-if动态切换控件显隐(比如播放中隐藏、暂停时显示),必须用 key 强制重建组件,否则属性变更不生效
例如:<video v-if="videoKey" :src="src" controls="false"></video>,切换时更新 videoKey = Date.now()。
真正麻烦的从来不是“怎么写 false”,而是各端对“false”的理解根本不一致——小程序当耳旁风,App 端画了又藏,H5 端藏得干净却留着右键后门。别指望一套属性通吃,分端写死才是现实解法。











