How to calculate height of viewable area (i.e., window height minus address & bookmark bars) in mobile Safari for web app?
计算移动Safari上有多少可见空间的正确方法是什么?通过查看区域,我们指的是Web应用程序实际可用的屏幕数量,即窗口高度减去地址和书签栏。
iOS 7防止隐藏地址栏,我们需要适当考虑视口高度。
window.innerWidth和window.innerHeight将给出视口的宽度和高度。
- 这似乎在iOS 7上不起作用;在减去地址栏和书签栏后,window.innerHeight不会产生高度。我们需要做其他事情吗?
-
在运行iOS 7.0.2的iPhone 4S上,window.screen.availHeight给出460。即480px减去状态栏的高度。在地址栏和标签栏都可见的情况下,window.innerHeight为373。如果我然后滚动以最小化地址栏并隐藏标签栏,则window.innerHeight报告441。
-
嗯,当您访问以下页面时,您得到什么价值:tekiki.com/default/test?我们得到1109。整个页面的代码是这样的:<script type = text / javascript> \\\\ tsetTimeout(function(){\\\\ t?? \\\\ talert(window.innerHeight); \\\\ t},500); \\\\ t
-
将此添加到head元素:<meta name = " viewport " content = " width = device-width,initial-scale = 1.0,maximum-scale = 1.0 ">,您将获得372。
-
window.screen.availHeight在iphone5S / ios7.0.3上返回548(带或不带工具栏和大/小地址栏); window.innerHeight返回529初始值,滚动后返回460。
-
这是行不通的,因为移动safari上的Layout事件以与逻辑像素不同的初始尺寸触发。如果脚本在样式计算之前运行,则此innerHeightWidth是错误的。目前尚无事件挂钩可触发,据我所知,简单的setTimeout是唯一可用的解决方案。
-
超时仍然给我innerHeight的错误值
-
@MarcelFalliere 2020,您应该将它写为一个独立的答案,因为它是唯一的作品
对于2020年以后的任何人来说,window.screen.availHeight是下面唯一用作@Marcel Falliere注释的人。
将根容器元素(称为rootElement)的CSS height设置为视口的高度:
1 2 3
| .root-element {
height: 100vh;
} |
然后,当页面渲染完毕后,运行此代码以将rootElement高度更新为视口高度减去浏览器UI栏的大小(例如,在iOS Safari上:顶部地址栏,底部导航栏…) :
1 2 3 4 5
| const rootElement = document.querySelector(".root-element")
const viewPortH = rootElement.getBoundingClientRect().height;
const windowH = window.innerHeight;
const browserUiBarsH = viewPortH - windowH;
rootElement.style.height = `calc(100vh - ${browserUiBarsH}px)`; |
此解决方案将您的根容器的大小设置为可用的大小,但是当调整窗口大小时(例如,在桌面上使用时),浏览器也可以调整rootElement高度。 >
-
经过测试,也可以在Android Chrome(版本87.0428066)上运行。提示:将值用作CSS变量
我知道这是5岁的帖子,但是正如我所知,这个问题仍然存在。我的解决方法:
在使用CSS:.el{ height:100vh; }样式的页面上使用HTML元素,并使用jQuery:$('.el').height();
将以像素为单位的高度检索到Javascript。
如果您对此类元素没有实际用途,则可以出于维护视口的唯一目的而即时创建一个元素:
1 2
| var vh = $('"').appendTo('body').height();
$('body div:last-child').remove(); |