uni-app 中无法直接用 screen.orientation.lock 实现全屏,H5 端需用 requestFullscreen 模拟视觉全屏(须用户手势触发),小程序端仅能通过隐藏导航栏、调高亮度、横屏提示等视觉优化模拟沉浸感。

uni-app 中如何用 screen.orientation.lock 控制全屏?
原生 Web 的 screen.orientation.lock 在 uni-app 里不能直接生效——H5 端受限于浏览器策略(需用户手势触发、仅部分安卓/Chrome 支持),小程序端则根本不提供该 API。所以别试 screen.orientation.lock('landscape'),它在大多数真机上静默失败或抛错 DOMException: The request is not allowed。
真正可行的路径只有两条:H5 端靠 requestFullscreen 模拟“视觉全屏”,小程序端靠 wx.setScreenBrightness + 页面样式模拟沉浸感(无真全屏 API)。
H5 端点击按钮进入伪全屏(requestFullscreen)
这是目前最可靠的做法:不改设备方向,只让页面 DOM 占满整个视口,隐藏地址栏和系统 UI(效果接近全屏)。关键点是必须由用户点击事件触发,且只能作用于 或某个容器元素。
-
document.documentElement.requestFullscreen()是标准写法,但 iOS Safari 不支持;更兼容的写法是document.body.requestFullscreen() - 需手动加 CSS:全屏后
html, body { height: 100vh; overflow: hidden; },否则滚动条可能残留 - 退出全屏要用
document.exitFullscreen(),并监听fullscreenchange事件同步状态(比如切换按钮文字) - 微信内置浏览器(X5)对
requestFullscreen支持极差,建议加降级提示:“当前环境不支持全屏,请横屏查看”
export default {
methods: {
toggleFullscreen() {
if (!document.fullscreenElement) {
document.body.requestFullscreen().catch(e => {
console.warn('全屏请求被拒绝:', e.message)
})
} else {
document.exitFullscreen()
}
}
}
}
小程序端没有全屏 API,但可以做视觉优化
微信/支付宝小程序明确不开放屏幕方向控制或全屏接口。所谓“全屏”,实际是:隐藏导航栏 + 设置背景色填满 + 强制横屏提示 + 屏幕亮度调高。重点不是技术实现,而是用户预期管理。
- 用
uni.hideHomeButton()隐藏底部 Home 指示条(仅部分安卓有效) -
wx.setScreenBrightness({value: 1})提高亮度,增强沉浸感 - 页面
json配置"navigationStyle": "custom"去掉原生导航栏 - CSS 写死
height: 100vh; width: 100vw;,配合position: fixed; top: 0; left: 0;防止滚动偏移 - 务必加引导文案:“请将手机横屏以获得最佳体验”,因为无法强制旋转
为什么 uni.navigateTo 打开新页不能自动全屏?
有人想通过新开页面实现全屏,结果发现新页依然带导航栏、有状态栏空隙。这是因为 uni-app 的路由跳转本质仍是小程序 page 或 H5 history push,不会改变容器层行为。全屏与否取决于当前页面的 DOM 和平台能力,和是否新开页面无关。
真正要做的,是在目标页面 onLoad 里立即执行全屏逻辑(H5)或亮度/样式设置(小程序),同时确保该页面已配置 "navigationStyle": "custom"。如果跳转后没反应,大概率是生命周期钩子执行时机不对——H5 要等 mounted 后再调 requestFullscreen,小程序要在 onReady 之后操作 DOM。
最常被忽略的是:iOS 微信中 requestFullscreen 完全不可用,而安卓微信又可能因 X5 内核拦截导致白屏。别把“全屏”当成确定性功能来设计,它只是增强体验的可选动作。


















