Düzenleme: Apple tarafından belgelendi, ancak aslında çalışmasını sağlayamadım: Klavye Ekranlarıyla WKWebView Davranışı : "iOS 10'da, WKWebView nesneleri klavye gösterildiğinde window.innerHeight özelliğini güncelleyerek Safari'nin yerel davranışıyla eşleşir ve arama yapmaz olayları yeniden boyutlandırma "(klavyeyi algılamak için yeniden boyutlandırma kullanmak yerine odak veya odak artı gecikme kullanabilir).
Düzenleme: kod, harici klavyeyi değil, ekran klavyesini varsayar. Bırakmak, çünkü bilgi yalnızca ekran klavyelerini önemseyen başkaları için yararlı olabilir. Sayfa parametrelerini görüntülemek için http://jsbin.com/AbimiQup/4 kullanın .
document.activeElement
Klavyeyi gösteren bir öğe olup olmadığını görmek için test ederiz (giriş türü = metin, metin alanı, vb.).
Aşağıdaki kod, bizim amaçlarımız için bir şeyleri uydurur (genel olarak doğru olmasa da).
function getViewport() {
if (window.visualViewport && /Android/.test(navigator.userAgent)) {
return {
left: visualViewport.pageLeft,
top: visualViewport.pageTop,
width: visualViewport.width,
height: visualViewport.height
};
}
var viewport = {
left: window.pageXOffset,
top: window.pageYOffset,
width: window.innerWidth || documentElement.clientWidth,
height: window.innerHeight || documentElement.clientHeight
};
if (/iPod|iPhone|iPad/.test(navigator.platform) && isInput(document.activeElement)) {
return {
left: viewport.left,
top: viewport.top,
width: viewport.width,
height: viewport.height * (viewport.height > viewport.width ? 0.66 : 0.45)
};
}
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');
};
Yukarıdaki kod yalnızca yaklaşıktır: Bölünmüş klavye, kilitlenmemiş klavye, fiziksel klavye için yanlıştır. Üstteki yoruma göre, window.innerHeight
özelliği kullanarak Safari'de (iOS8'den beri?) Veya WKWebView'da (iOS10'dan beri) verilen koddan daha iyi bir iş yapabilirsiniz .
Diğer koşullar altında hatalar buldum: örneğin, girişe odaklanın, sonra ana ekrana gidin ve sonra sayfaya geri dönün; iPad, görüntü alanını küçültmemelidir; eski IE tarayıcıları çalışmıyor, Opera klavye kapandıktan sonra öğeye odaklanmaya devam ettiği için çalışmadı.
Bununla birlikte, görüntü alanı yakınlaştırılabiliyorsa (veya tercihlerde zorla yakınlaştırma etkinse) etiketli yanıtın (kaydırma çubuğunun yüksekliği ölçmek için değiştirilmesi) kullanıcı arabirimi yan etkileri vardır. Önerilen diğer çözümü (kaydırma üstünü değiştirme) kullanmıyorum çünkü iOS'ta, görüntü alanı yakınlaştırılabildiğinde ve odaklanmış girdiye kaydırıldığında, kaydırma, yakınlaştırma ve odaklanma arasında hatalı etkileşimler vardır (bu, yalnızca odaklanmış bir girdiyi görüntü alanının dışında bırakabilir - değil gözle görülür).