编辑:由Apple记录,但实际上无法使它起作用:WKWebView的键盘显示行为:“在iOS 10中,WKWebView对象通过显示键盘时更新它们的window.innerHeight属性来匹配Safari的本机行为,并且不调用调整大小事件”(也许可以使用焦点或焦点加延迟来检测键盘,而不是使用大小调整)。
编辑:代码假定屏幕键盘,而不是外部键盘。保留它是因为信息可能对只关心屏幕键盘的其他人有用。使用http://jsbin.com/AbimiQup/4查看页面参数。
我们测试看是否document.activeElement
是显示键盘的元素(输入类型为text,textarea等)。
以下代码为我们的目的捏造了事物(尽管通常不正确)。
function getViewport() {
if (window.visualViewport && /Android/.test(navigator.userAgent)) {
// https://developers.google.com/web/updates/2017/09/visual-viewport-api Note on desktop Chrome the viewport subtracts scrollbar widths so is not same as window.innerWidth/innerHeight
return {
left: visualViewport.pageLeft,
top: visualViewport.pageTop,
width: visualViewport.width,
height: visualViewport.height
};
}
var viewport = {
left: window.pageXOffset, // http://www.quirksmode.org/mobile/tableViewport.html
top: window.pageYOffset,
width: window.innerWidth || documentElement.clientWidth,
height: window.innerHeight || documentElement.clientHeight
};
if (/iPod|iPhone|iPad/.test(navigator.platform) && isInput(document.activeElement)) { // iOS *lies* about viewport size when keyboard is visible. See http://stackoverflow.com/questions/2593139/ipad-web-app-detect-virtual-keyboard-using-javascript-in-safari Input focus/blur can indicate, also scrollTop:
return {
left: viewport.left,
top: viewport.top,
width: viewport.width,
height: viewport.height * (viewport.height > viewport.width ? 0.66 : 0.45) // Fudge factor to allow for keyboard on iPad
};
}
return viewport;
}
function isInput(el) {
var tagName = el && el.tagName && el.tagName.toLowerCase();
return (tagName == 'input' && el.type != 'button' && el.type != 'radio' && el.type != 'checkbox') || (tagName == 'textarea');
};
上面的代码仅是近似值:拆分键盘,未对接键盘,物理键盘是错误的。根据顶部的评论,您可以使用window.innerHeight
属性在Safari(自iOS8起)或WKWebView(自iOS10起)上比给定代码做得更好。
在其他情况下,我也发现失败:例如,将注意力集中在输入上,然后转到主屏幕,然后返回页面;iPad不应缩小视口;旧的IE浏览器无法正常工作,Opera无法正常工作,因为在键盘关闭后Opera仍然专注于元素。
但是,如果视口可缩放(或在首选项中启用了强制缩放),则带标签的答案(将滚动顶部更改为度量高度)具有讨厌的UI副作用。我不使用其他建议的解决方案(更改滚动条),因为在iOS上,当视口可缩放并滚动到焦点输入时,滚动,缩放和焦点之间存在交互错误(这可能会使焦点输入仅停留在视口之外,而不是可见)。