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