微信小程序 video 全屏时 pageorientation 不生效,因其仅控制页面容器方向,不干预原生播放器的系统级旋转;需通过 css 媒体查询、@fullscreenchange 动态设置宽高、容器约束及 object-fit 等组合方案强制适配。

小程序 video 全屏后横竖屏错乱,pageOrientation 配置不生效怎么办?
直接结论:微信小程序端的 video 全屏行为由原生层控制,pages.json 中的 pageOrientation 只影响页面容器方向,不接管视频全屏时的系统级旋转逻辑。你看到的“旋转90度后倒立”“宽高拉伸”“黑边/白边”,本质是原生播放器与 CSS 布局脱节导致的。
为什么 mp-weixin 的 pageOrientation: "landscape" 在 video 全屏时失效?
因为该配置仅在页面初始化或路由跳转时生效,而 video 全屏是独立触发的原生行为,会绕过页面级 orientation 设置。尤其在 iOS 微信客户端(如 iPhone 14),WKWebView 对 video 全屏有强干预,且不响应 JS 层的方向锁定指令。
-
pageOrientation生效范围仅限于非全屏状态下的页面容器,全屏后由微信原生播放器接管 - 微信基础库 2.27.0+ 才开始支持
video全屏时的bindfullscreenchange事件,低版本无法监听 - 即使配置了
"screenOrientation": ["portrait", "landscape"]在manifest.json的mp-weixin下,对小程序 video 全屏无实际作用
真正起效的适配方案:CSS + 事件 + 容器约束三管齐下
不能只靠配置,必须用组合手段强制对齐渲染结果。重点不是“让系统横屏”,而是“让视频在任意旋转状态下都填满、不倒、不变形”。
- 给
video外层容器加固定宽高和overflow: hidden,避免父级塌陷或滚动干扰 - 用
@media screen and (orientation: landscape)+@media screen and (orientation: portrait)分别重置video的width/height和transform,iOS 下常需加transform: rotate(0deg) scale(1)清除残留旋转 - 监听
@fullscreenchange,进入全屏后立即执行uni.createSelectorQuery().select(".video-wrapper").boundingClientRect()获取真实尺寸,动态设置video的style宽高为100vw/100vh - 禁用
controls和enable-danmu,减少原生控件对布局的干扰(尤其 iOS)
容易被忽略的关键细节
真机调试时,微信开发者工具的“旋转模拟”功能无法复现原生全屏行为,必须用真机扫码测试;iOS 上 video 全屏后 window.innerHeight 会突变为横屏值但页面未重排,此时靠 rpx 会错乱,改用 vmin 或 vw/vh 更可靠;部分安卓机型(如华为 EMUI)会强制把全屏 video 拉伸成 16:9,需额外加 object-fit: contain 并配合 aspect-ratio 控制。











