In IOS8 Safari gibt es einen neuen Fehler, bei dem die Position behoben wurde.
Wenn Sie einen Textbereich fokussieren, der sich in einem festen Bereich befindet, werden Sie durch Safari zum Ende der Seite gescrollt.
Dies macht es unmöglich, mit allen Arten von Benutzeroberflächen zu arbeiten, da Sie keine Möglichkeit haben, Text in Textbereiche einzugeben, ohne Ihre Seite ganz nach unten zu scrollen und Ihren Platz zu verlieren.
Gibt es eine Möglichkeit, diesen Fehler sauber zu umgehen?
#a {
height: 10000px;
background: linear-gradient(red, blue);
}
#b {
position: fixed;
bottom: 20px;
left: 10%;
width: 100%;
height: 300px;
}
textarea {
width: 80%;
height: 300px;
}
<html>
<body>
<div id="a"></div>
<div id="b"><textarea></textarea></div>
</body>
</html>
Antworten:
Basierend auf dieser guten Analyse dieses Problems habe ich dies in
html
undbody
Elemente in CSS verwendet:Ich denke, es funktioniert großartig für mich.
quelle
transform: translateZ(0);
von stackoverflow.com/questions/7808110/…Die beste Lösung, die ich finden könnte, besteht darin,
position: absolute;
auf Fokus zu wechseln und die Position zu berechnen, an der es sich befand, als es verwendet wurdeposition: fixed;
. Der Trick ist, dass dasfocus
Ereignis zu spät ausgelöst wird und dahertouchstart
verwendet werden muss.Die Lösung in dieser Antwort ahmt das korrekte Verhalten in iOS 7 sehr genau nach.
Bedarf:
Das
body
Element muss positioniert sein, um eine ordnungsgemäße Positionierung zu gewährleisten, wenn das Element auf absolute Positionierung umschaltet.Der Code ( Live-Beispiel ):
Der folgende Code ist ein grundlegendes Beispiel für den bereitgestellten Testfall und kann an Ihren spezifischen Anwendungsfall angepasst werden.
Hier ist der gleiche Code ohne den Hack zum Vergleich .
Vorbehalt:
Wenn das
position: fixed;
Element andere übergeordnete Elemente mit Positionierung enthältbody
, kann das Umschalten aufposition: absolute;
ein unerwartetes Verhalten aufweisen. Aufgrund der Natur istposition: fixed;
dies wahrscheinlich kein großes Problem, da das Verschachteln solcher Elemente nicht üblich ist.Empfehlungen:
Während die Verwendung des
touchstart
Ereignisses die meisten Desktop-Umgebungen herausfiltert, möchten Sie wahrscheinlich User-Agent-Sniffing verwenden, damit dieser Code nur für das defekte iOS 8 und nicht für andere Geräte wie Android und ältere iOS-Versionen ausgeführt wird. Leider wissen wir noch nicht, wann Apple dieses Problem in iOS beheben wird, aber ich wäre überrascht, wenn es in der nächsten Hauptversion nicht behoben wird.quelle
Ich habe eine Methode gefunden, die funktioniert, ohne dass die Position absolut geändert werden muss!
Vollständiger unkommentierter Code
Brechen sie ab
Zuerst muss das feste Eingabefeld im HTML-Code oben auf der Seite stehen (es ist ein festes Element, daher sollte es semantisch sinnvoll sein, es ohnehin oben zu haben):
Dann müssen Sie die aktuelle Bildlaufposition in globalen Variablen speichern:
Dann benötigen Sie eine Möglichkeit, iOS-Geräte zu erkennen, damit sie keine Auswirkungen auf Dinge haben, für die keine Korrektur erforderlich ist (Funktion von https://stackoverflow.com/a/9039885/1611058 ).
Jetzt, wo wir alles haben, was wir brauchen, ist hier das Update :)
quelle
Ich konnte dies für ausgewählte Eingaben beheben, indem ich den erforderlichen Auswahlelementen einen Ereignis-Listener hinzufügte und dann um einen Versatz von einem Pixel scrollte, wenn die betreffende Auswahl den Fokus erhielt.
Dies ist nicht unbedingt eine gute Lösung, aber viel einfacher und zuverlässiger als die anderen Antworten, die ich hier gesehen habe. Der Browser scheint die Position neu zu rendern / neu zu berechnen: behoben; Attribut basierend auf dem in der Funktion window.scrollBy () angegebenen Offset.
quelle
Ähnlich wie Mark Ryan Sallee vorgeschlagen hat, stellte ich fest, dass das dynamische Ändern der Höhe und des Überlaufs meines Hintergrundelements der Schlüssel ist - dies gibt Safari nichts, zu dem man scrollen kann.
Ändern Sie nach Abschluss der Eröffnungsanimation des Modals das Styling des Hintergrunds:
Wenn Sie das Modal schließen, ändern Sie es zurück:
Während andere Antworten in einfacheren Kontexten nützlich sind, war mein DOM (dank SharePoint) zu kompliziert, um den absoluten / festen Positionswechsel zu verwenden.
quelle
Sauber? Nein.
Ich hatte dieses Problem kürzlich selbst mit einem festen Suchfeld in einer klebrigen Kopfzeile. Das Beste, was Sie im Moment tun können, ist, die Bildlaufposition jederzeit in einer Variablen zu halten und bei der Auswahl die Position des festen Elements absolut anstatt mit einem oberen zu fixieren Position basierend auf der Bildlaufposition des Dokuments.
Dies ist jedoch sehr hässlich und führt immer noch zu einem seltsamen Hin- und Her-Scrollen, bevor ich an der richtigen Stelle lande, aber es ist das nächste, das ich bekommen könnte.
Bei jeder anderen Lösung wird die Standard-Bildlaufmechanik des Browsers überschrieben.
quelle
Dies ist jetzt in iOS 10.3 behoben!
Hacks sollten nicht mehr benötigt werden.
quelle
Ich habe mich nicht mit diesem speziellen Fehler befasst, aber vielleicht einen Überlauf gesetzt: versteckt; auf dem Körper, wenn der Textbereich sichtbar ist (oder nur aktiv ist, abhängig von Ihrem Design). Dies kann dazu führen, dass der Browser nirgendwo "unten" zum Scrollen angezeigt wird.
quelle
Eine mögliche Lösung wäre, das Eingabefeld zu ersetzen.
Codepen
quelle
Keine dieser Lösungen hat bei mir funktioniert, da mein DOM kompliziert ist und ich dynamische unendliche Bildlaufseiten habe, sodass ich meine eigenen erstellen musste.
Hintergrund: Ich verwende einen festen Header und ein Element weiter unten, das darunter haftet, sobald der Benutzer so weit nach unten scrollt. Dieses Element verfügt über ein Sucheingabefeld. Außerdem wurden beim Vorwärts- und Rückwärtslauf dynamische Seiten hinzugefügt.
Problem: Unter iOS scrollte der Browser jedes Mal, wenn der Benutzer auf die Eingabe im festen Element klickte, ganz nach oben. Dies verursachte nicht nur unerwünschtes Verhalten, sondern löste auch das Hinzufügen meiner dynamischen Seite oben auf der Seite aus.
Erwartete Lösung: Kein Bildlauf in iOS (überhaupt kein Bildlauf), wenn der Benutzer auf die Eingabe im Sticky-Element klickt.
Lösung:
Bedarf: JQuery Mobile ist erforderlich, damit die Funktionen Startroll und Stoppscroll funktionieren.
Entprellen ist enthalten, um Verzögerungen auszugleichen, die durch das klebrige Element verursacht werden.
Getestet in iOS10.
quelle
Ich bin gestern über so etwas gesprungen, indem ich die Höhe von #a auf die maximal sichtbare Höhe eingestellt habe (Körpergröße war in meinem Fall), wenn #b sichtbar ist
Ex:
ps: Entschuldigung für das späte Beispiel, habe gerade bemerkt, dass es gebraucht wurde.
quelle
Ich hatte das Problem, unter Codezeilen wurde es für mich behoben -
quelle