Edit: Documentado pela Apple, embora eu não tenha conseguido fazê-lo funcionar: Comportamento do WKWebView com monitores do teclado : "No iOS 10, os objetos WKWebView correspondem ao comportamento nativo do Safari, atualizando sua propriedade window.innerHeight quando o teclado é exibido e não chama redimensionar eventos "(talvez seja possível usar foco ou foco mais atraso para detectar o teclado em vez de usar redimensionar).
Editar: o código pressupõe teclado na tela, não teclado externo. Deixá-lo porque as informações podem ser úteis para outras pessoas que se preocupam apenas com os teclados na tela. Use http://jsbin.com/AbimiQup/4 para visualizar os parâmetros da página.
Testamos para ver se o document.activeElement
é um elemento que mostra o teclado (tipo de entrada = texto, área de texto etc.).
O código a seguir modifica as coisas para nossos propósitos (embora não seja geralmente correto).
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');
};
O código acima é apenas aproximado: está errado para teclado dividido, teclado desencaixado, teclado físico. De acordo com o comentário na parte superior, você poderá fazer um trabalho melhor que o código fornecido no Safari (desde iOS8?) Ou WKWebView (desde iOS10) usando a window.innerHeight
propriedade
Descobri falhas em outras circunstâncias: por exemplo, concentre-se na entrada, vá para a tela inicial e volte à página; O iPad não deve diminuir a viewport; Como os navegadores antigos do IE não funcionam, o Opera não funcionou porque o Opera manteve o foco no elemento após o teclado ser fechado.
No entanto, a resposta marcada (alterar a barra de rolagem para medir a altura) tem efeitos colaterais desagradáveis na interface do usuário se a viewport for zoomável (ou forçado o zoom ativado nas preferências). Eu não uso a outra solução sugerida (alterando o scrolltop) porque no iOS, quando a viewport é com zoom e rolagem para entrada focada, há interações de buggy entre rolagem e zoom e foco (que podem deixar uma entrada focada apenas fora da viewport - não visível).