非全屏时如何获取全屏(最小用户界面)视图的窗口大小?

2024-02-26

非全屏时如何获取全屏(最小用户界面)视图的尺寸?

这就是screen属性报告:

window.screen.height; // 568 (Thats the screen height)
window.screen.availHeight; // 548  (???; Unknown dimension. Note, that is it not reporting the available space as per the spec.)
window.document.documentElement.clientHeight; // 460 (Thats the window size when not in fullscreen.)

当全屏显示时,window.innerHeight是 529,这是我在进入全屏模式之前尝试得出的数字。

图像说明了我所指的屏幕状态:

在 iOS 8 中,通过“触摸向下拖动”手势输入。


为了澄清,window.screen.availHeight反映浏览器窗口(包括所有工具栏)可以具有的最大高度。如果你看下图,你会发现548只是整个浏览器的高度,没有iOS菜单栏。所以availHeight属性不应显示内容的可用空间,而是显示整个浏览器。它用于桌面浏览器,通过检查来检测浏览器是否最大化等情况window.outerHeight反对window.screen.availHeight.

但在开始讨论之前,先要获得最小的 UI 高度。没有标准属性spec http://www.w3.org/TR/cssom-view/对于它,因为这只是 iOS 独有的行为。 Apple 可以设置一些非标准属性来公开这些信息。但正如我检查过的window and window.screen对象,没有任何关联。目前这是为了可行性。

作为旁注,知道新视口大小与resize事件并提前知道可能的大小?在此之前可以完成的工作量resize事件,应该始终是最小的,如果发生布局更改,则应该在调整大小之后发生。因此,提前知道这些数字应该没有多大帮助。

考虑这样的场景:用户打开网页,并立即开始滚动。如果我们之前知道这些数字,那么对于屏幕的初始渲染我们无能为力,因为它不是一个最小的 UI。无论应该做什么,都必须在用户开始滚动后立即开始。

现在除此之外,还有另一个看起来像最小用户界面的调整大小事件。在 iPad 上,当您有多个选项卡时,高度会稍微缩小一点以显示选项卡。因此,当用户关闭唯一的其他选项卡时,当前页面会变得更高一点,并也会触发调整大小事件。但这个新的高度与最小UI的高度不同。这表明这个最小的 ui 只是高度的另一个提升,而不是类似全屏 API 的模式。

因此,如果页面依赖于高度,则需要记住太多可能的更改。硬编码只是一种短期解决方案,有一天您将无法测试所有这些设备。

但是,我还应该说,调整大小事件有一个缺点,它在进入最小用户界面后触发,这可能为时已晚。所以,当身高开始增长时,没有任何事件可以知道。这就是我认为一些自定义流体用户界面可能需要启动动画来更改大小的地方。在这种情况下,要了解此事件的开始,可以对innerHeight 使用间隔检查,innerHeight 将立即开始更改。

不管怎样,如果有一个必要的用例需要在任何滚动之前了解数字,我相信它还不能通过 CSSOM 获得。

Edit:

检测最小用户界面是另一回事,仍然不需要知道尺寸。使用 Touch 事件,您可以检测视图是否已进入最小 UI。

检查innerHeighttouchstart, touchmove and touchend事件可以帮助检测最小的用户界面。简单的方法是检查触摸结束时innerHeight 是否增加。这适用于大多数情况,但有一个问题,如果用户在最小 UI 转换中间停止触摸,我们无法确定是否会进入最小 UI。检查最后报告的高度touchmove可以帮助检查我们是否会恢复到默认视图。

无论如何,您可以检查下面的代码以了解它是如何工作的。它有缺陷并且可以改进,但你会明白的。我没有把它放在 codepen 上,因为你无法在那里滚动整个页面。

<!doctype html>
<html>
    <head>
        <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no">
        <style>
        div {
            position: fixed;
            left: 10px;
        }
        #dd1 {
            top: 10px;
        }
        #dd2 {
            top:30px;
        }
        #dd3 {
            top: 50px;
        }
        </style>
    <body>
        <div id="dd1">Start: <span id="d1"></span></div>
        <div id="dd2">Move: <span id="d2"></span></div>
        <div id="dd3">End: <span id="d3"></span></div>
        <section style="position:relative;height:3000px;"></section>
        <script>
        var d1 = document.querySelector("#d1");
        var d2 = document.querySelector("#d2");
        var d3 = document.querySelector("#d3");
        var start_height=window.innerHeight;
        var cur_height;
        var end_height;
        var normal_state=true;
        var entered_minimal_ui=false;
        //window.addEventListener("touchstart", start_handler, false);
        window.addEventListener("touchmove", move_handler, false);
        window.addEventListener("touchend", end_handler, false);
        document.ontouchstart = control_touching;
        d1.textContent=start_height;

        function move_handler() {
            if(cur_height>start_height) {
                // we *may* enter the minimal-ui, but it's not final yet
                d2.textContent="I detected minimal-ui faster. (Current: "+cur_height+")";
                normal_state=false;
            }
            cur_height=window.innerHeight;
        }
        function end_handler() {
            end_height=window.innerHeight;

            if(end_height>start_height && end_height>=cur_height) {
                d3.textContent="Hello minimal-ui. (End: "+end_height+")";
                normal_state=false;
                entered_minimal_ui=true;
            }
            else if(!entered_minimal_ui) {
                d3.textContent="We didn't enter minimal-ui. Reverting.";
                normal_state=true;
            }
        }
        function control_touching() {
            document.ontouchstart = function(e){ 
                if(normal_state) {
                    return true;
                }
                else // just for testing
                    e.preventDefault();
            }
        }
        </script>
    </body>
</html>

参考:

  • 插图来自iPhone 5 显示屏尺寸和网页设计技巧 http://www.kylejlarson.com/blog/2012/iphone-5-web-design/凯尔·拉森的文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非全屏时如何获取全屏(最小用户界面)视图的窗口大小? 的相关文章

随机推荐

  • 如何改变PCM数据流的音量(实验失败)

    Solved 我的代码以前从未用于处理有符号值 因此字节 gt 短转换错误地处理了符号位 这样做正确地解决了问题 问题是 我正在尝试更改 PCM 数据流的音量 我可以从立体声文件中提取单通道数据 通过跳过 复制它们 插入零 等方式对样本进行
  • iOS 6 无法自动旋转

    在我维护的应用程序中 在纵向和纵向颠倒模式下应该发生旋转 所有旋转均在摘要面板中启用 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceO
  • R中多个列表的元素均值

    我有十个巨大的列表 每个列表有七个元素 但元素很大 我需要计算这些列表的元素平均值 那么如果有A1 A2 A3 A10列表 我需要计算 mean1 mean A1 1 A2 1 A3 1 A10 1 mean7 mean A1 7 A2 7
  • 通过 ContentValues 将时间戳插入数据库

    在Android中 是否可以使用以下命令将时间戳插入数据库中ContentValues 当我尝试使用这样的方法添加它时 ContentValues args new ContentValues args put MY DATE my dat
  • 使用 C++ 用户定义的文字来初始化数组

    我有一堆测试向量 以十六进制字符串的形式呈现 MSG 6BC1BEE22E409F96E93D7E117393172A MAC 070A16B46B4D4144F79BDD9DD04A287C MSG 6BC1BEE22E409F96E93
  • 从同一个 onclick 调用两个函数[重复]

    这个问题在这里已经有答案了 HTML 和 JavaScript 如何从一个 onclick 事件调用 2 个函数 这是我的代码
  • .CSHTML 中的 Visual Studio 2010 代码格式 - 缩进不正确

    需要解释的问题非常简单 在 Visual Studio 2010 SP1 中 我在使用 Razor 时发现大括号出现奇怪的缩进问题 它看起来是这样的 div div div div if true b Hi b div div div di
  • Authorize.net 支付集成 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找使用 PHP 与网站进行 Authorize net 支付集成 我的问题是 1 我可以在哪里找到使用 PHP 执行此操作的教程 开发指南和
  • 在 Clojure 中查找与谓词匹配的元素的索引?

    使用 Clojure 如何找到该向量中第一个具有正值的索引 1 0 3 7 9 我知道你可以相当优雅地得到第一个结果first and filter first filter pos 1 0 99 100 101 这段代码返回值99 我想要
  • 如何在 Haskell 中指定多播套接字的本地绑定接口?

    我已经尝试过 Network Multicast 包并且它确实有效 但是 我找不到为多播套接字指定本地绑定接口 bond0 或 bond1 等 的方法 我知道在C中我需要使用ioctl将键转换为struct sockaddr in 然后将该
  • 当你初始化一个没有构造函数的类时,会调用什么? [复制]

    这个问题在这里已经有答案了 因此 当一个类具有私有构造函数时 您无法初始化它 但当它没有构造函数时 您可以初始化它 那么 当你初始化一个没有构造函数的类时 会调用什么呢 例如 这里叫什么 new b public class a publi
  • 在c++中处理对象

    有人告诉我 句柄是一种 空 指针 但 空指针 到底是什么意思以及它的目的是什么 另外 什么是 somehandle GetStdHandle STD INPUT HANDLE do 一般意义上的句柄是唯一标识对象的不透明值 在这种情况下 不
  • 从代码隐藏更改 IFrames InnerHtml

    我正在尝试在运行时从后面的代码设置 Iframe 的 HTML 在我的 aspx 页面中 我有
  • 从 React Native 中删除 Expo

    我在使用这个工具时遇到了很多麻烦 我认真地调试了expo 而不是应用程序本身 如何从 CRNA 中完全删除 expo 我想使用 CRNA 及其调试工具而不需要博览会 您可以通过弹出正在运行的应用程序来完成此操作npm 运行弹出 然后 如果您
  • 为什么我不能执行 操作?

    如果 html 文件在本地 在我的 C 驱动器上 则它可以工作 但如果 html 文件在服务器上并且图像文件在本地 则不行 这是为什么 有什么可能的解决方法吗 如果客户端可以请求本地文件系统文件 然后使用 JavaScript 找出其中的内
  • 如何更改Eclipse默认工作区?

    在哪里可以更改 Eclipse 中的默认工作区 如果您的意思是 更改工作空间 请转到File gt Switch Workspace
  • 为什么 bean 验证最小/最大约束不支持 double 类型?

    有人可以向我解释一下为什么 JPA 支持doubletype 作为字段类型 但 bean 验证约束javax validation constraints i e Min http java sun com javaee 6 docs ap
  • Flow 不允许我将 `Array` 传递给 `Array`(子类型数组到超类型数组)

    我有一个类型的值Array a 子类型数组 Flow 不允许我将其传递到期望的地方Array a 一组超类型 尽管它显然有效 例如 我无法用 type 赋值Array lt left right gt 到一个类型为的变量Array a a
  • Material-ui 自动完成:为 startAdornment 添加值

    我有自动完成功能和多项选择权限 https codesandbox io s bold jackson dkjmb file src App js 在示例中 我有 3 个城市选项 当选择某些内容时 如何在 TextField 中手动添加自动
  • 非全屏时如何获取全屏(最小用户界面)视图的窗口大小?

    非全屏时如何获取全屏 最小用户界面 视图的尺寸 这就是screen属性报告 window screen height 568 Thats the screen height window screen availHeight 548 Unk