如何跨浏览器跨平台获取window的有效高度?

How to get the effective height of window in a cross-browser and cross-platform way?

我需要一种方法来获得浏览器window的有效高度。所谓有效,是指用户实际可以看到的区域。

因此,例如,应该考虑到大多数移动浏览器在浏览器 window 上放置了 "floating" 导航栏 and/or 和 "floating" 底部按钮栏,这例如可能会弄乱 $(window).height(),因为它会显示总高度,不包括这些条。

我的场景如下:我需要一个 "full-screen" 对话框 window,其中有页眉、页脚和正文部分。如果对话框主体包含更长的内容,我希望对话框主体滚动(而不是整个文档),并且 header/footer 留在有效视口中,例如页脚中的按钮将是始终可见。

目前我还没有找到很好的解决办法。我试图调整 Bootstrap 模式,但我所能达到的只是一个可滚动的 modal-body。它在桌面上运行良好,但是当我从 window 高度计算 modal-bodymax-height 时,我在移动浏览器上遇到了这个问题,因为顶部(and/or 底部)栏会破坏布局,页脚按钮会滑到底部栏下方,或滑出视口。

根据 Gary Hayes 的评论,我设法整合了一个专门针对小屏幕设备的解决方案(使用 bootstrap)。我放弃了在内容很小的时候保持对话框很小的要求,仍然更有希望。

到目前为止仅在模拟器中对其进行了测试,但希望它也能在真实设备上运行,最大的优势在于它完全不需要 window 高度。

我在 LESS 中是这样实现的:

@media (max-width: @screen-sm-max) {
    .modal {
        padding-right: 0 !important;
        position: fixed;

        .modal-dialog, .modal-content {
            position: fixed;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
        }

        .modal-content {
            .modal-header {
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
            }
            .modal-footer {
                position: fixed;
                bottom: 0;
                left: 0;
                right: 0;
            }
            .modal-body {
                position: fixed;
                left: 0;
                right: 0;
                top: 60px; // height of header, calculated precisely in JS on shown.bs.modal handler
                bottom: 60px; // height of footer, calculated precisely in JS on shown.bs.modal handler
            }
        }
    }
}