当前位置: 首页 > 知识库问答 >
问题:

iOS 8删除了“最小UI”视区属性,还有其他“软全屏”解决方案吗?

彭华皓
2023-03-14

(这是一个包含多个部分的问题,我将尽力总结一下这个场景。)

我们目前正在构建一个响应式web应用程序(新闻阅读器),它允许用户在选项卡内容之间滑动,以及在每个选项卡内容内垂直滚动。

解决此问题的常用方法是使用包装器div填充浏览器视口,将overflow设置为hiddedauto,然后在其中水平和/或垂直滚动。

这种方法很棒,但有一个主要缺点:由于文档的高度与浏览器视口完全相同,移动浏览器不会隐藏地址栏/导航菜单。

有许多hacks和viewport属性使我们能够获得更多的屏幕空间,但没有一个像minimal-ui(在iOS 7.1中引入)那样有效。

昨天传来消息,iOS 8 beta4已经从Mobile Safari中删除了minimal-UI(参见iOS 8发行说明中的Webkit部分),这让我们很疑惑:

Q1.移动Safari上还有可能隐藏地址栏吗?

据我们所知,iOS7不再响应window.scrollto黑客攻击,这意味着我们必须与更小的屏幕空间一起生活,除非我们采用垂直布局或使用mobile-web-app-cable

Q2.还能有类似的软全屏体验吗?

所谓软全屏,我真正的意思是不使用mobile-web-app-cable元标记。

我们的web应用程序是建立为可访问的,任何页面都可以被书签或共享使用本机浏览器菜单。通过添加mobile-web-app-cable,我们可以防止用户调用这样的菜单(当它保存到主页时),这会使用户感到困惑和反感。

minimal-ui曾经是一种折衷的方法,默认情况下隐藏菜单,但通过轻击保持它的可访问性--尽管苹果可能会出于其他可访问性考虑(比如用户不知道在哪里点击才能激活菜单)而将其删除。

Q3.全屏体验值得这么麻烦吗?

似乎全屏API不会很快出现在iOS上,但即使真的出现了,我也不知道该如何保持菜单的可访问性(Android上的Chrome也是如此)。

在这种情况下,也许我们应该让mobile safari保持原样,并考虑视口高度(对于iPhone5+,视口高度为460=568-108,其中108包括操作系统栏、地址栏和导航菜单;对于iPhone4或更高版本,视口高度为372)。

希望听到一些替代方案(除了构建一个原生应用程序)。

共有2个答案

宋望
2023-03-14

由于没有编程方法来模拟minimal-UI,我们提出了一个不同的解决方案,使用calc()和已知的iOS地址栏高度,这对我们有利:

下面的演示页面(也可以在gist上获得,更多的技术细节在那里)将提示用户滚动,然后触发软全屏(隐藏地址栏/菜单),其中标题和内容填充新的视口。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Scroll Test</title>

    <style>
        html, body {
            height: 100%;
        }

        html {
            background-color: red;
        }

        body {
            background-color: blue;
            margin: 0;
        }

        div.header {
            width: 100%;
            height: 40px;
            background-color: green;
            overflow: hidden;
        }

        div.content {
            height: 100%;
            height: calc(100% - 40px);
            width: 100%;
            background-color: purple;
            overflow: hidden;
        }

        div.cover {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 100;
            width: 100%;
            height: 100%;
            overflow: hidden;
            background-color: rgba(0, 0, 0, 0.5);
            color: #fff;
            display: none;
        }

        @media screen and (width: 320px) {
            html {
                height: calc(100% + 72px);
            }

            div.cover {
                display: block;
            }
        }
    </style>
    <script>
        var timeout;

        window.addEventListener('scroll', function(ev) {

            if (timeout) {
                clearTimeout(timeout);
            }

            timeout = setTimeout(function() {

                if (window.scrollY > 0) {
                    var cover = document.querySelector('div.cover');
                    cover.style.display = 'none';
                }

            }, 200);

        });
    </script>
</head>
<body>

    <div class="header">
        <p>header</p>
    </div>
    <div class="content">
        <p>content</p>
    </div>
    <div class="cover">
        <p>scroll to soft fullscreen</p>
    </div>

</body>
</html>
范志勇
2023-03-14

iOS 8不再支持minimal-ui视口属性。然而,最小UI本身并没有消失。用户可以通过“触摸-拖动”手势进入最小界面。

管理视图状态有几个前提条件和障碍,例如,要使最小UI工作,必须有足够的内容使用户能够滚动;要使minimal-ui持久存在,必须在页面加载时和方向更改后偏移窗口滚动。但是,无法使用screen变量计算最小UI的尺寸,因此无法预先告知用户何时在最小UI中。

这些观察结果是作为为iOS 8开发Brim- 视图管理器的一部分进行研究的结果。最终实现的工作方式如下:

加载page时,Brim将创建一个treadmill元素。Treadmill元素用于为用户提供滚动的空间。treadmill元素的存在确保用户可以进入最小UI视图,并且如果用户重新加载页面或更改设备方向,它将继续保持。它对用户来说是不可见的。此元素的ID为brim-treadmill

加载页面或改变方向后,Brim使用尖叫来检测页面是否在最小UI视图中(如果内容高度大于视口高度,则先前在最小UI中并重新加载的页面将保留在最小UI中)。

当page在minimal-ui中时,Brim将禁用文档的滚动(它以一种不影响主元素内容的安全方式执行此操作)。禁用文档滚动可防止向上滚动时意外离开最小UI。按照最初的iOS7.1规范,点击顶部条将恢复Chrome的其余部分。

最终结果看起来是这样的:

出于文档的考虑,并且如果您更愿意编写自己的实现,值得注意的是,您不能在orientationchange事件之后直接使用尖叫来检测设备是否处于最小UI中,因为window维度在旋转动画结束之前不会反映新的方向。必须将侦听器附加到orientationchangeend事件。

Scream和orientationchangeend已作为该项目的一部分开发。

 类似资料:
  • (这是一个由多个部分组成的问题,我将尽最大努力总结该场景。) 我们目前正在构建一个响应式网络应用程序(新闻阅读器),允许用户在选项卡内容之间滑动,以及在每个选项卡内容内垂直滚动。 解决此问题的常见方法是使用填充浏览器视口的包装器,将设置为或,然后在其中水平和/或垂直滚动。 这种方法很棒,但有一个主要缺点:由于文档的高度与浏览器视口完全相同,移动浏览器不会隐藏地址栏/导航菜单。 有许多黑客和视口属性

  • 我知道苹果发布了基于蓝牙4.0协议的iBeacon。 在任何蓝牙设备中,如果我们使用以下代码对设备进行编码: 表示呈现此蓝牙设备是iBeacon蓝牙设备。 我的问题是,如果我定义了自己的协议,这意味着我会改变它 是否有一种可能性,我可以通过iphone识别我自己定义的蓝牙设备,而无需在iphone上添加识别设备。 苹果是否支持定制ibeacon? 编辑根据davidgyoung所说,我对stack

  • 问题内容: 我想知道是否有一种方法比使用然后将其用作JFrame的尺寸然后将JFrame设置为更好?Java中是否会有某种预构建的功能来控制图形卡以实现真正的全屏显示? 问题答案: 您正在追求所谓的“全屏独家模式” 请查看全屏独占模式以了解更多详细信息。 但是请理解,它在Swing中不能很好地发挥作用。 在Mac OS X 10.7下,您可以使用来访问它为应用程序提供的全屏支持 。 查看OSX L

  • 本文向大家介绍django2.2安装错误最全的解决方案(小结),包括了django2.2安装错误最全的解决方案(小结)的使用技巧和注意事项,需要的朋友参考一下 安装报错类型,解决方案; 1. 数据库连接报错 mysqldb只支持python2,pymysql支持3,都是使用c写的驱动,性能更好 解决方案: 修改数据库:mysqldb=>pymysql 2. 因为切换数据库导致版本错误 raise

  • 问题内容: 在SQL Server中有批量删除的解决方案吗? 我不能使用TRUNCATE,因为我想使用WHERE来限制行。 是否有诸如批量复制(bcp)之类的用于删除数据的东西? 问题答案: 不。 您需要带WHERE子句的DELETE:这是标准SQL。 您可以做的是批量删除,如下所示: 或者,如果您要删除很高比例的行…

  • 问题内容: 我通常将文字设置为粗体(或斜体或其他字体属性) 如何仅删除粗体属性,而不更改到目前为止可能已设置的其他属性? 问题答案: 这会将样式设置为正常,而不会更改颜色或大小。 但是您不能以这种方式混合使用粗体/斜体/下划线文本。如果指定粗体,则所有文本均将为粗体。如果要混合文本样式,建议使用HTML设置文本样式,然后使用以下代码。