iOS9 - та сама проблема.
TLDR - джерело проблеми. Для розв’язання прокрутіть донизу
У мене була форма в position:fixed
iframe з id = 'підписатися-спливаючий кадр'
Відповідно до оригінального питання, при фокусуванні на введенні кадр iframe піде вгору документа на відміну від верхньої частини екрана.
Така ж проблема не виникала в режимі safari dev з користувальницьким агентом, встановленим на ідевік. Тож здається, що проблема викликана віртуальною клавіатурою iOS, коли вона з'являється.
Я отримав певну видимість того, що відбувається, консоліруючи реєстрацію позиції iframe (наприклад $('#subscribe-popup-frame', window.parent.document).position()
), і звідти я міг бачити, як iOS, здавалося, встановлює положення елемента, {top: -x, left: 0}
коли віртуальна клавіатура вискакує (тобто фокусується на вхідному елементі).
Тож моє рішення полягало в тому, щоб взяти цей примхливий -x
, перевернути знак і потім використати jQuery, щоб додати цю top
позицію до iframe. Якщо є краще рішення, я б хотів його почути, але, спробувавши десяток різних підходів, це єдине, що працювало на мене.
Недолік: мені потрібно було встановити тайм-аут у 500 мс (можливо, менше би спрацювало, але я хотів бути в безпеці), щоб переконатися, що я захопив остаточне x
значення після того, як iOS зробив свою помилку з положенням елемента. Як результат, досвід дуже хиткий. . . але принаймні це працює
Рішення
var mobileInputReposition = function(){
//if statement is optional, I wanted to restrict this script to mobile devices where the problem arose
if(screen.width < 769){
setTimeout(function(){
var parentFrame = $('#subscribe-popup-frame',window.parent.document);
var parentFramePosFull = parentFrame.position();
var parentFramePosFlip = parentFramePosFull['top'] * -1;
parentFrame.css({'position' : 'fixed', 'top' : parentFramePosFlip + 'px'});
},500);
}
}
Тоді просто зателефонуйте mobileInputReposition
в щось подібне $('your-input-field).focus(function(){})
і$('your-input-field).blur(function(){})