全屏API HTML5和Safari(iOS 6)

21

我正在尝试制作一个应用程序,在iOS 6的Safari中运行全屏模式(没有顶部栏)。

代码如下:

var elem = document.getElementById("element_id");
if (elem.requestFullScreen) {
  elem.requestFullScreen();
} else if (elem.mozRequestFullScreen) {
  elem.mozRequestFullScreen();
} else if (elem.webkitRequestFullScreen) {
  elem.webkitRequestFullScreen();
}

这在桌面浏览器上运行良好。但在移动Safari(iOS)6上不起作用。

对于这个问题有什么想法吗?

9个回答

28

3
这是截至2015年2月11日的正确答案(使用meta代替?)。 - molokoloco
3
截至2017年9月11日,这仍然是正确的答案。很遗憾,这本可以为我节省另外一天的开发时间。 - manish
8
是的,现在是2019年11月了...到目前为止,仍然令人失望。#Safari成为新的IE6 - Felipe N Moura
6
2021年4月,iPhone仍不支持…是的,#safariIsTheNewIE6。 - MazarD
8
这是2025年,我来自未来,仍然不支持iPhone Safari。#safariIsTheNewIE6,#safariShouldDie - aradalvand
到了2023年,仍然不支持。此时可以安全地假定苹果故意选择不支持它,巩固了Safari作为当今唯一一个主要的非标准兼容浏览器的地位。 - Mahn

10
六年后,"webkit"前缀的全屏API现在似乎可以在iPad上的iOS 12.1的移动版Safari中使用,但在iPhone上不能。目前没有在CanIUse上报告此问题,到目前为止,我找到的唯一Apple信息是关于iOS 12的行项目录“Safari中的新功能”页面发布说明以及一个推文
昨天,我从iOS 11.x更新了我的iPhone和iPad到iOS 12.1。在iPad的Safari中,全屏API对我有效,但在iPhone上无效。在iPad上, "alert(document.fullscreenEnabled)"显示"undefined",但"alert(document.webkitFullscreenEnabled)"显示"true"。在iPhone上,两者都显示"undefined"。
通过以下脚本,我能够在iPad的Safari中显示全屏模式。
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        #target {
            width: 150px; height: 100px; padding: 50px 0 0 0;
            margin: 50px auto; text-align: center;
            background-color: tan;
        }
    </style>
</head>
<body>
    <div id="target">Click or touch me</div>
    <script>
        (function(w) {
            "use strict";
            var d = w.document;
            var t = d.getElementById("target");

            t.addEventListener("click", function() {
                d.documentElement.webkitRequestFullscreen();
                // Compare alternative to preceding line, calling
                // method on target element instead:
                // t.webkitRequestFullscreen();
                // And compare changing target's style on change:
                // t.style.width = "100%";
                // t.style.height = "100%";
            });

            // alerts "undefined" in iOS 12.1 Safari on iPad and iPhone
            alert(d.fullscreenEnabled);
            // alerts "true" in iOS 12.1 Safari on iPad, "undefined" on iPhone
            alert(d.webkitFullscreenEnabled);
        }(window));
    </script>
</body>
</html>

在全屏显示时,iPad上的Safari会在左上角插入一个“X”UI元素供触摸以退出全屏。

使用Site Point教程2014年全屏API的演示页面在我的iPad上也很好用。请注意,使用Site Point教程2012年版本的过时演示页面两次在Safari中冻结了我的iPad,我不得不重新启动iPad才能退出。

使用screenfull.js库演示页面在我的iPad上也很好用。


7

无法使用全屏。如果您正确设置元标记并将Web应用程序放置在主屏幕上,则可以摆脱所有Safari垃圾,但仍会保留iOS状态栏(连接性,时钟,电池)。

<meta name="apple-mobile-web-app-capable"
  content="yes" />
<meta name="apple-mobile-web-app-status-bar-style"
  content="black-translucent" />

有很多相关资源,以下是我一直在使用的资源:

http://matt.might.net/articles/how-to-native-iphone-ipad-apps-in-javascript/

苹果公司的官方文档也很不错:

http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html

但总的来说,在 iOS 6.1 及以后的版本中,你无法在 iOS 设备上部署全屏的 Web 应用程序。状态栏将始终存在。


好的参考资料。但我有一个关于这个模式的问题。你知道怎么通过编程关闭应用程序吗?我的意思是使用JavaScript。我尝试了window.open(location.href, "_self").close();,但它不起作用。谢谢。 - Maxbester

6

3
好知道,但这只适用于视频吗?除非你做一些疯狂的黑客攻击——例如将静态图像即时编码为视频...(似乎过于复杂) - Mars Robertson

2
@Tom-Andraszek部分正确。自2019年初以来,苹果已经将iPadOS与iOS分开,并且他们现在仅在iPadOS Safari上支持全屏api
以下是如何为您的Web应用程序实现iPadOS 12.x Safari及以上版本的全屏功能: 在iPad Safari上进入全屏模式。 声明:上述链接分享的博客是我的。值得一提的是,iPadOS上的Chrome和其他浏览器仍不支持全屏api。

1
您的博客出现了404错误。 - kunambi
已修复。感谢您向我报告此问题。 - Marvin Danig

1
以下内容可将iOS状态栏滚动到一边。请在 $(document).ready 中早期调用它。
$('body').scrollTop(1);

目前这适用于6.x版本,但似乎在iOS7的浏览器beta版中无法正常工作。始终如一,底部的浏览器工具栏是固定的。

0

0

启用后,它可以在iPhone(iOS 12.1.4)上运行:

设置 -> Safari -> 高级 -> 实验性功能 -> 全屏API


5
我在 iOS 12.2(iPhone 6)上没有看到这个选项。 - Fantini

0

有一个非常好的技巧可以模拟全屏模式,用户可以根据自己的意愿进入或离开。我真的不知道它为什么能够工作,或者它是否在其他平台上也能够工作,但在我的 iPhone Safari 上看起来像预期的那样。

然而,这个解决方案有一些限制。它只能用于不使用比屏幕提供的更多空间的 Web 应用程序,并且用户必须在页面加载后切换到横向模式。

将您的 html 和 body 的高度和宽度设置为 100%

html, body {
  /* Avoid ugly scrollbars */
  overflow: hidden;
  /* Reset default browser paddings etc */
  margin: 0;
  padding: 0;
  border: 0;
  /* 100% size */
  width: 100%;
  height: 100%;
}

现在是有点hacky的部分。在页面顶部给你的body加上1像素的margin。

body {
  margin-top: 1px;
}

最后一件要做的事情是将您的Web应用程序内容放入一个额外的带有固定位置的div中,以便边距不会影响它。

.wrapper {
  position: fixed;
  left: 0px;
  right: 0px;
  top: 0px;
  bottom: 0px;
}

完成了。旋转您的设备,看到这些丑陋的导航栏消失。非常适合真正的全屏游戏。

我相信,这可以作为一种 polyfill 使用,尽管并不是每个人都想制作全屏游戏。

我希望它对某些人有用。

Darth Moon


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接