Sunting: Didokumentasikan oleh Apple walaupun saya tidak bisa membuatnya berfungsi: Perilaku WKWebView dengan Menampilkan Keyboard : "Di iOS 10, objek WKWebView cocok dengan perilaku asli Safari dengan memperbarui properti window.innerHeight ketika keyboard ditampilkan, dan jangan menelepon mengubah ukuran acara "(mungkin dapat menggunakan fokus atau fokus plus penundaan untuk mendeteksi keyboard alih-alih menggunakan pengubahan ukuran).
Sunting: kode menganggap keyboard layar, bukan keyboard eksternal. Membiarkannya karena info mungkin berguna bagi orang lain yang hanya peduli pada keyboard layar. Gunakan http://jsbin.com/AbimiQup/4 untuk melihat params halaman.
Kami menguji untuk melihat apakah document.activeElement
elemen tersebut menunjukkan keyboard (tipe input = teks, textarea, dll).
Kode berikut menipu hal-hal untuk tujuan kita (meskipun secara umum tidak benar).
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');
};
Kode di atas hanya perkiraan: Itu salah untuk keyboard terbagi, keyboard tidak terkunci, keyboard fisik. Sesuai komentar di atas, Anda mungkin dapat melakukan pekerjaan yang lebih baik daripada kode yang diberikan pada Safari (sejak iOS8?) Atau WKWebView (sejak iOS10) menggunakan window.innerHeight
properti.
Saya telah menemukan kegagalan dalam kondisi lain: misalnya fokus pada input, lalu buka layar beranda lalu kembali ke halaman; iPad seharusnya tidak membuat viewport lebih kecil; browser IE lama tidak akan berfungsi, Opera tidak berfungsi karena Opera tetap fokus pada elemen setelah keyboard ditutup.
Namun jawaban yang ditandai (mengubah scrolltop untuk mengukur ketinggian) memiliki efek samping UI yang buruk jika viewport diperbesar (atau dipaksa-zoom diaktifkan dalam preferensi). Saya tidak menggunakan solusi yang disarankan lainnya (mengubah scrolltop) karena di iOS, ketika viewport diperbesar dan bergulir ke input yang difokuskan, ada interaksi buggy antara scrolling & zoom & fokus (yang dapat meninggalkan input yang fokus hanya di luar viewport - tidak terlihat).