微信小程序无法通过pageorientation禁止video全屏横屏,因其由原生播放器接管;可行方案是禁用全屏按钮、用css媒体查询+transform矫正方向、动态设置宽高及使用vw/vh单位。

微信小程序的横屏模式不能靠「关闭」来实现,因为它的横屏行为分两层:页面容器级和 video 全屏级。你配置的 pageOrientation 只控制前者,而用户点击 video 的全屏按钮后,旋转由微信原生播放器接管——这一层你根本锁不住。
pages.json 中的 pageOrientation 对 video 全屏完全无效
很多人以为在 pages.json 里把 pageOrientation 设为 "portrait" 就能禁止横屏,但这是误解。该配置仅在页面加载或路由跳转时生效,video 进入全屏是独立触发的原生行为,微信不会读取你的页面配置。iOS 上尤其明显:哪怕你设了 "portrait",点全屏按钮照样横过来,且画面可能倒立、拉伸、黑边。
-
mp-weixin: { pageOrientation: "portrait" }只影响非全屏状态下的页面容器方向 - video 全屏后,
window.innerHeight突变为横屏值,但 rpx 基准仍按竖屏计算,导致布局错乱 - 微信基础库
2.27.0+才支持bindfullscreenchange,低版本连事件都监听不到
uni.createVideoContext().requestFullScreen() 无法传 direction 参数
你不能像 Web 那样用 requestFullscreen({ navigationUI: 'hide' }) 控制方向。微信小程序的 requestFullScreen() 不接受任何参数,调用即交由系统决定——它默认按设备物理方向旋转,且不响应 JS 层的方向锁定指令。
- 安卓和 iOS 表现不一致:部分安卓机型(如华为 EMUI)会强制拉伸成 16:9;iOS 则常加隐藏
transform导致倒立 -
exitFullScreen()可以退出,但无法阻止用户点按钮进入 - 试图在
@fullscreenchange里调用plus.screen.lockOrientation()是徒劳的——这个 API 在小程序环境根本不存在
真正可行的“禁止横屏”其实是视觉矫正 + 容器约束
既然锁不住系统旋转,就别硬刚,转而确保:无论屏幕怎么转,视频看起来都是正的、填满的、不变形的。核心是 CSS + 事件响应组合拳。
- 给
video外层加固定宽高和overflow: hidden,避免父容器塌陷或滚动干扰 - 用
@media screen and (orientation: landscape)和@media screen and (orientation: portrait)分别重置video的width/height和transform - iOS 下必须加
video { transform: rotate(0deg) !important; object-fit: contain; },有时需试rotate(180deg)或scaleX(-1) - 全屏后立即用
uni.createSelectorQuery()获取真实尺寸,动态设video的style.width = "100vw"、style.height = "56.25vw"(16:9) - 禁用原生控件:
:controls="false"、:show-fullscreen-btn="false",从源头去掉全屏入口(如果业务允许)
最易被忽略的一点:微信开发者工具的「旋转模拟」完全无法复现真机全屏行为,所有适配必须在真机上扫码测试,且 iOS 和安卓要分开调。rpx 在全屏状态下彻底失效,改用 vmin 或 vw/vh 是唯一靠谱的单位选择。











