แก้ไข: เอกสารโดย Apple แม้ว่าฉันจะไม่สามารถใช้งานได้จริง: WKWebView พฤติกรรมด้วยการแสดงคีย์บอร์ด : "ใน iOS 10 วัตถุ WKWebView ตรงกับพฤติกรรมดั้งเดิมของ Safari โดยอัปเดตคุณสมบัติ window.innerHeight เมื่อแสดงแป้นพิมพ์และไม่โทร ปรับขนาดกิจกรรม "(อาจใช้โฟกัสหรือโฟกัสรวมถึงความล่าช้าในการตรวจจับแป้นพิมพ์แทนที่จะใช้ปรับขนาด)
แก้ไข: รหัสถือว่าแป้นพิมพ์บนหน้าจอไม่ใช่แป้นพิมพ์ภายนอก ออกจากเนื่องจากข้อมูลอาจเป็นประโยชน์กับผู้อื่นที่สนใจเฉพาะแป้นพิมพ์บนหน้าจอเท่านั้น ใช้http://jsbin.com/AbimiQup/4เพื่อดูพารามิเตอร์หน้า
เราทดสอบเพื่อดูว่าdocument.activeElement
เป็นองค์ประกอบที่แสดงแป้นพิมพ์ (input type = text, textarea ฯลฯ )
รหัสต่อไปนี้ทำให้สิ่งต่าง ๆ เป็นไปตามวัตถุประสงค์ของเรา (แม้ว่าโดยทั่วไปจะไม่ถูกต้อง)
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');
};
รหัสข้างต้นเป็นค่าโดยประมาณเท่านั้น: เป็นความผิดพลาดสำหรับแป้นพิมพ์แยกแป้นพิมพ์ที่ไม่ได้ใส่แป้นพิมพ์แป้นพิมพ์จริง ตามความคิดเห็นที่ด้านบนคุณอาจทำงานได้ดีกว่ารหัสที่ระบุบน Safari (ตั้งแต่ iOS8?) หรือ WKWebView (ตั้งแต่ iOS10) โดยใช้window.innerHeight
คุณสมบัติ
ฉันพบความล้มเหลวภายใต้สถานการณ์อื่น ๆ : เช่นให้ความสำคัญกับอินพุตจากนั้นไปที่หน้าจอหลักจากนั้นกลับมาที่หน้า; iPad ไม่ควรทำให้วิวพอร์ตเล็กลง เบราว์เซอร์ IE รุ่นเก่าจะไม่ทำงาน Opera ไม่ทำงานเพราะ Opera ยังคงให้ความสำคัญกับองค์ประกอบหลังจากปิดแป้นพิมพ์
อย่างไรก็ตามคำตอบที่ติดแท็ก (การเปลี่ยน scrolltop เพื่อวัดความสูง) มีผลข้างเคียง UI ที่น่ารังเกียจหากวิวพอร์ตซูมได้ (หรือเปิดใช้งานการบังคับซูมในการตั้งค่า) ฉันไม่ใช้วิธีแก้ปัญหาอื่นที่แนะนำ (เปลี่ยน scrolltop) เพราะใน iOS เมื่อวิวพอร์ตสามารถซูมได้และเลื่อนไปยังอินพุตที่โฟกัสมีการโต้ตอบแบบบั๊กระหว่างการเลื่อนและซูม & โฟกัส มองเห็นได้)