編集:実際に機能させることはできませんでしたが、Appleによって文書化されています:キーボードディスプレイでの WKWebViewの動作:「iOS 10では、WKWebViewオブジェクトは、キーボードが表示されているときにwindow.innerHeightプロパティを更新することにより、Safariのネイティブの動作と一致し、呼び出しません。イベントのサイズを変更します」(おそらく、サイズ変更を使用する代わりに、フォーカスまたはフォーカスと遅延を使用してキーボードを検出できます)。
編集:コードは、外部キーボードではなく、画面キーボードを想定しています。オンスクリーンキーボードのみに関心がある他のユーザーにとって情報が役立つ可能性があるため、そのままにしておきます。http://jsbin.com/AbimiQup/4を使用して、ページパラメータを表示します。
document.activeElement
がキーボードを表示する要素であるかどうかをテストします(入力タイプ=テキスト、テキストエリアなど)。
次のコードは、私たちの目的のために物事をファッジします(ただし、一般的には正しくありません)。
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では、ビューポートがズーム可能でフォーカスされた入力にスクロールするときに、スクロールとズームとフォーカスの間にバグのある相互作用があるため、他の推奨される解決策(スクロールトップの変更)を使用しません表示されます)。