iOS9 - das gleiche Problem.
TLDR - Quelle des Problems. Scrollen Sie zur Lösung nach unten
Ich hatte ein Formular in einem position:fixed
Iframe mit id = 'subscribe-popup-frame'
Gemäß der ursprünglichen Frage wird der Iframe beim Eingabefokus an den oberen Rand des Dokuments und nicht an den oberen Bildschirmrand verschoben.
Das gleiche Problem trat im Safari-Entwicklungsmodus nicht auf, wenn der Benutzeragent auf ein Gerät eingestellt war. Es scheint also, dass das Problem durch die virtuelle iOS-Tastatur verursacht wird, wenn sie angezeigt wird.
Ich bekam einen Einblick in das Geschehen, indem $('#subscribe-popup-frame', window.parent.document).position()
ich die Position des Iframes (z. B. ) auf der Konsole protokollierte, und von dort aus konnte ich sehen, dass iOS die Position des Elements auf den {top: -x, left: 0}
Zeitpunkt einstellte, an dem die virtuelle Tastatur auftauchte (dh sich auf das Eingabeelement konzentrierte).
Meine Lösung bestand also darin, dieses lästige Problem zu lösen -x
, das Vorzeichen umzukehren und es dann mit jQuery hinzuzufügentop
Position wieder zum Iframe . Wenn es eine bessere Lösung gibt, würde ich sie gerne hören, aber nachdem ich ein Dutzend verschiedene Ansätze ausprobiert habe, war es die einzige, die für mich funktioniert hat.
Nachteil: Ich musste eine Zeitüberschreitung von 500 ms einstellen (vielleicht würde weniger funktionieren, aber ich wollte sicher sein), um sicherzustellen, dass ich den endgültigen x
Wert erfasst habe , nachdem iOS seinen Fehler mit der Position des Elements gemacht hatte. Infolgedessen ist die Erfahrung sehr ruckelig. . . aber zumindest funktioniert es
Lösung
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);
}
}
Dann rufen Sie einfach so mobileInputReposition
etwas wie $('your-input-field).focus(function(){})
und an$('your-input-field).blur(function(){})