display: "standalone" 本身不自动全屏,仅在用户从主屏幕启动已安装PWA时隐藏地址栏、工具栏和系统导航栏;生效需同时满足HTTPS、正确引入manifest、激活Service Worker及完成添加到主屏幕操作。

设置 display: "standalone" 本身不会让 PWA “自动全屏”,它的作用是:当用户已将网页应用成功添加到主屏幕并从那里启动时,浏览器会隐藏地址栏、工具栏和系统导航栏,呈现接近原生 App 的沉浸式界面。是否真正生效,取决于一整套前提条件是否全部满足。
manifest.json 中 display: "standalone" 的正确写法
在你的 manifest.json 文件中,必须明确声明:
-
"display": "standalone"—— 注意是字符串,带英文双引号 - 同时必须提供
"name"和"short_name",缺一不可(部分安卓设备会因缺失short_name拒绝安装) -
"start_url"应为相对路径(如"/"或"/index.html"),且服务端返回 HTTP 200 -
"scope"需覆盖start_url,常见写法是"scope": "/"
光写 standalone 不够:必须满足的硬性前提
这个属性只在“已安装 + 从主屏幕启动”时起效,以下四项缺一不可:
- 网站必须通过 HTTPS 提供(
localhost是唯一例外) - HTML 页面中已通过
<link rel="manifest" href="/manifest.json">正确引入清单文件 - 已注册并激活一个有效的 Service Worker(可在 Chrome DevTools > Application > Service Workers 查看状态)
- 用户已完成“添加到主屏幕”操作(移动端 Chrome/Safari 通常需访问两次、间隔超 5 分钟才弹提示;桌面 Chrome 需手动点击地址栏的安装图标)
iOS 和 Android 行为差异要特别注意
不同平台对 standalone 的支持程度不同,不能一概而论:
- iOS Safari 不支持
standalone的独立窗口效果,即使设置了也会以 Safari 标签页形式打开;但它会识别apple-mobile-web-app-capable: "yes"meta 标签,配合display: "standalone"可实现无地址栏的类 App 启动体验(推荐优先用"standalone",而非"fullscreen",后者在 iOS 上反而容易失效) - Android Chrome 在添加后能较好地隐藏浏览器 UI,但桌面 Chrome 始终在标签页中运行,且
navigator.standalone永远返回undefined - 如果想兼顾兼容性,可把
"display": "standalone"和"display": "minimal-ui"都写上——浏览器会按优先级尝试,fallback 更稳
如何验证 standalone 是否真的生效
安装完成后,从主屏幕启动应用,然后打开开发者工具执行:
-
console.log(navigator.standalone)—— 在 iOS Safari 或 Android Chrome 安装后环境中,返回true表示成功进入 standalone 模式;返回false或undefined说明仍在普通浏览器上下文中 - 检查 Chrome 的
chrome://apps页面或 DevTools > Application > Manifest 面板,确认display字段解析为"standalone",且没有警告图标(比如图标缺失、start_url404 等)


















