iOS9 - та же проблема.
TLDR - источник проблемы. Для решения прокрутите вниз
У меня была форма в position:fixed
iframe с id = 'subscribe-popup-frame'
Согласно исходному вопросу, при фокусировке ввода iframe будет перемещаться в верхнюю часть документа, а не в верхнюю часть экрана.
Та же проблема не возникала в режиме разработки safari с пользовательским агентом, установленным на idevice. Похоже, что проблема вызвана виртуальной клавиатурой 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(){})