Modifica: documentato da Apple, anche se in realtà non sono riuscito a farlo funzionare: comportamento di WKWebView con display a tastiera : "In iOS 10, gli oggetti WKWebView corrispondono al comportamento nativo di Safari aggiornando la proprietà window.innerHeight quando viene mostrata la tastiera e non chiamano eventi di ridimensionamento "(forse è possibile utilizzare lo stato attivo o attivo più il ritardo per rilevare la tastiera anziché utilizzare il ridimensionamento).
Modifica: il codice presume la tastiera su schermo, non quella esterna. Lasciandolo perché le informazioni possono essere utili ad altri che si preoccupano solo delle tastiere su schermo. Utilizzare http://jsbin.com/AbimiQup/4 per visualizzare i parametri della pagina.
Testiamo per vedere se document.activeElement
è un elemento che mostra la tastiera (tipo di input = testo, textarea, ecc.).
Il codice seguente confonde le cose per i nostri scopi (sebbene non sia generalmente corretto).
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');
};
Il codice sopra è solo approssimativo: è sbagliato per tastiera divisa, tastiera sganciata, tastiera fisica. Come da commento in alto, potresti essere in grado di fare un lavoro migliore rispetto al codice dato su Safari (da iOS8?) O WKWebView (da iOS10) usando la window.innerHeight
proprietà.
Ho riscontrato guasti in altre circostanze: ad es. Concentrarsi sull'input, quindi tornare alla schermata principale e tornare alla pagina; iPad non dovrebbe ridurre le dimensioni del viewport; i vecchi browser IE non funzionavano, Opera non funzionava perché Opera si concentrava sull'elemento dopo la chiusura della tastiera.
Tuttavia, la risposta con tag (modifica del riquadro di scorrimento per misurare l'altezza) ha effetti collaterali UI cattivi se il viewport è zoomabile (o lo zoom forzato abilitato nelle preferenze). Non utilizzo l'altra soluzione suggerita (modifica del riquadro di scorrimento) perché su iOS, quando il viewport è zoomabile e scorre verso l'input focalizzato, ci sono interazioni errate tra scorrimento e zoom e focus (che possono lasciare un input focalizzato al di fuori del viewport - no visibile).