W Safari IOS8 pojawił się nowy błąd z poprawioną pozycją.
Jeśli skupisz się na obszarze tekstowym, który znajduje się w stałym panelu, safari przewinie cię na dół strony.
Uniemożliwia to pracę z wszelkiego rodzaju interfejsami użytkownika, ponieważ nie ma możliwości wprowadzania tekstu do obszarów tekstowych bez przewijania strony do końca w dół i utraty miejsca.
Czy istnieje sposób na łatwe obejście tego błędu?
#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>
Odpowiedzi:
Opierając się na tej dobrej analizie tego problemu, użyłem tego w elementach
html
ibody
w css:Myślę, że to działa świetnie dla mnie.
źródło
transform: translateZ(0);
ze stackoverflow.com/questions/7808110/ ...Najlepszym rozwiązaniem, jakie mogłem wymyślić, jest przejście na używanie
position: absolute;
ostrości i obliczanie pozycji, w której się znajdował, gdy był używanyposition: fixed;
. Rzecz w tym, żefocus
zdarzenie jest uruchamiane za późno, więctouchstart
należy je wykorzystać.Rozwiązanie w tej odpowiedzi bardzo dokładnie naśladuje prawidłowe zachowanie, które mieliśmy w iOS 7.
Wymagania:
body
Element musi mieć pozycjonowania w celu zapewnienia właściwego położenia, gdy element przełącza bezwzględnego położenia.Kod ( przykład na żywo ):
Poniższy kod jest podstawowym przykładem dostarczonego przypadku testowego i może być dostosowany do konkretnego przypadku użycia.
Oto ten sam kod bez hackowania dla porównania .
Ostrzeżenie:
Jeśli
position: fixed;
element ma inne elementy nadrzędne z pozycjonowaniem poza tymbody
, przełączenie naposition: absolute;
może mieć nieoczekiwane zachowanie. Ze względu na swój charakterposition: fixed;
nie jest to prawdopodobnie poważny problem, ponieważ zagnieżdżanie takich elementów nie jest powszechne.Zalecenia:
Podczas gdy użycie
touchstart
zdarzenia spowoduje odfiltrowanie większości środowisk graficznych, prawdopodobnie będziesz chciał użyć wykrywania klienta użytkownika, aby ten kod działał tylko dla zepsutego iOS 8, a nie innych urządzeń, takich jak Android i starsze wersje iOS. Niestety nie wiemy jeszcze, kiedy Apple naprawi ten problem w iOS, ale zdziwiłbym się, gdyby nie został naprawiony w kolejnej większej wersji.źródło
Znalazłem metodę, która działa bez konieczności zmiany pozycji na absolutną!
Pełny kod bez komentarzy
Zniszczyć to
Najpierw musisz mieć stałe pole wejściowe u góry strony w HTML (jest to stały element, więc semantycznie i tak powinno mieć sens, aby było ono u góry strony):
Następnie musisz zapisać aktualną pozycję przewijania do zmiennych globalnych:
Następnie potrzebujesz sposobu na wykrycie urządzeń iOS, aby nie wpływał na rzeczy, które nie wymagają naprawy (funkcja pobrana z https://stackoverflow.com/a/9039885/1611058 )
Teraz, gdy mamy wszystko, czego potrzebujemy, oto poprawka :)
źródło
Udało mi się to naprawić dla wybranych danych wejściowych, dodając odbiornik zdarzeń do niezbędnych elementów wyboru, a następnie przewijając o przesunięcie o jeden piksel, gdy zaznaczony element staje się aktywny.
Niekoniecznie jest to dobre rozwiązanie, ale jest znacznie prostsze i bardziej niezawodne niż inne odpowiedzi, które tu widziałem. Wygląda na to, że przeglądarka ponownie renderuje / ponownie oblicza pozycję: naprawiona; atrybut oparty na przesunięciu podanym w funkcji window.scrollBy ().
źródło
Podobnie jak zasugerował Mark Ryan Sallee, odkryłem, że kluczem jest dynamiczna zmiana wysokości i przepełnienia mojego elementu tła - to nie daje Safari nic do przewijania.
Więc po zakończeniu animacji otwierającej modal zmień stylizację tła:
Po zamknięciu modalu zmień go z powrotem:
Podczas gdy inne odpowiedzi są przydatne w prostszych kontekstach, mój DOM był zbyt skomplikowany (dzięki SharePoint), aby używać zamiany pozycji bezwzględnej / stałej.
źródło
Czysty? Nie.
Niedawno miałem ten problem ze stałym polem wyszukiwania w lepkim nagłówku, najlepsze, co możesz teraz zrobić, to utrzymywać pozycję przewijania w zmiennej przez cały czas, a po zaznaczeniu ustaw pozycję stałego elementu jako absolutną zamiast ustaloną górą położenie na podstawie pozycji przewijania dokumentu.
Jest to jednak bardzo brzydkie i nadal powoduje dziwne przewijanie w przód iw tył przed wylądowaniem we właściwym miejscu, ale jest to najbliższe, jakie mogłem uzyskać.
Każde inne rozwiązanie wymagałoby zastąpienia domyślnej mechaniki przewijania przeglądarki.
źródło
Nie poradziłem sobie z tym konkretnym błędem, ale może wstawiłem przepełnienie: ukryty; na treści, gdy obszar tekstu jest widoczny (lub po prostu aktywny, w zależności od projektu). Może to skutkować brakiem możliwości przewinięcia przeglądarki w dowolnym miejscu.
źródło
Możliwym rozwiązaniem byłoby zastąpienie pola wejściowego.
codepen
źródło
Żadne z tych rozwiązań nie zadziałało dla mnie, ponieważ mój DOM jest skomplikowany i mam dynamiczne nieskończone przewijane strony, więc musiałem stworzyć własny.
Tło: używam stałego nagłówka i elementu znajdującego się niżej, który pozostaje pod nim, gdy użytkownik przewinie tak daleko w dół. Ten element ma pole wyszukiwania. Dodatkowo mam dodane dynamiczne strony podczas przewijania do przodu i do tyłu.
Problem: W systemie iOS za każdym razem, gdy użytkownik kliknął dane wejściowe w stałym elemencie, przeglądarka przewijała się na samą górę strony. To nie tylko spowodowało niepożądane zachowanie, ale także spowodowało dodanie mojej dynamicznej strony u góry strony.
Oczekiwane rozwiązanie: brak przewijania w systemie iOS (w ogóle brak), gdy użytkownik kliknie dane wejściowe w przyklejonym elemencie.
Rozwiązanie:
Wymagania: JQuery mobile jest wymagany do działania funkcji startroll i stopcroll.
Odbicie jest włączone, aby wygładzić wszelkie opóźnienia utworzone przez element sticky.
Testowane w iOS10.
źródło
Właśnie przeskoczyłem coś takiego wczoraj, ustawiając wysokość #a na maksymalną widoczną wysokość (w moim przypadku była to wysokość ciała), gdy #b jest widoczne
dawny:
ps: przepraszam za późny przykład, właśnie zauważyłem, że jest potrzebny.
źródło
Zostało to naprawione w iOS 10.3!
Hacki nie powinny już być potrzebne.
źródło
Miałem problem, poniższe linie kodu rozwiązały go za mnie -
źródło