przewijanie iPad Safari powoduje, że elementy HTML znikają i pojawiają się ponownie z opóźnieniem

Obecnie rozwijam aplikację internetową wykorzystującą html5 i jQuery dla iPad Safari. Mam problem, w którym duże obszary przewijania powodują, że elementy, które są poza ekranem, pojawiają się po opóźnieniu, gdy przewijam w dół do nich.

Chodzi mi o to, że jeśli mam wiersz obrazów (lub nawet div z gradientem), który jest poza ekranem, kiedy przewijam w dół (lub w górę) do niego, oczekiwane zachowanie polega na tym, że element pojawi się na ekranie podczas przewijania do niego.

Jednak to, czym jestem widać, że element nie pojawia się , dopóki nie podniosę palca z ekranu i scroller nie skończy wszystkich animacji.

To powoduje dla mnie bardzo zauważalny problem, sprawiając, że całość wygląda niepewnie, chociaż tak nie jest. Domyślam się, że iPad Safari próbuje coś zrobić, aby zapisać pamięć. Czy jest jakiś sposób, w jaki mogę zapobiec temu zamieszaniu? Dodatkowo byłbym również wdzięczny, gdyby ktoś mógł rzucić światło na to, czym jest iPad Safari próbuję to zrobić.

Author: Vertexwahn, 2012-03-21

11 answers

Musisz oszukać przeglądarkę, aby efektywniej korzystała z akceleracji sprzętowej. Można to zrobić za pomocą pustej transformacji 3d:

-webkit-transform: translate3d(0,0,0)

Szczególnie, będzie to potrzebne w przypadku elementów potomnych, które mają deklarację position:relative; (lub po prostu zrób to dla wszystkich elementów potomnych).

Nie gwarantowana poprawka, ale dość skuteczna przez większość czasu.

Końcówka kapelusza: https://web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/ios-5-native-scrolling-grins-and-gothcas/

 167
Author: Colin Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 02:55:34

To jest kompletna odpowiedź na moje pytanie. Pierwotnie oznaczyłem odpowiedź @ Colin Williams jako poprawną odpowiedź, ponieważ pomogła mi ona dotrzeć do kompletnego rozwiązania. Członek społeczności, @Slipp D. Thompson edytował moje pytanie, po około 2.5 roku, gdy je zadawałem, i powiedział mi, że nadużywam formatu pytań i odpowiedzi SO. Powiedział mi też, żebym osobno umieścił to jako odpowiedź. Oto pełna odpowiedź, która rozwiązała mój problem:

@ Colin Williams, dziękuję! Twoja odpowiedź i artykuł, z którym się połączyłeś, dał mi trop, aby spróbować czegoś z CSS.

Więc, używałem translate3d wcześniej. Przyniosło to niepożądane rezultaty. Zasadniczo odcina się i nie renderuje elementów, które były poza ekranem, dopóki nie wejdę w interakcję z nimi. Zasadniczo, w orientacji poziomej, połowa mojej strony, która była poza ekranem, nie była wyświetlana. Jest to aplikacja internetowa na iPada, dzięki której byłem w poprawce.

Zastosowanie translate3d do względnie pozycjonowanych elementów rozwiązało problem dla tych elementy, ale inne elementy przestały renderować, po wyjściu z ekranu. Elementy, z którymi nie mogłem wchodzić w interakcję (grafika), nigdy nie będą renderowane ponownie, chyba że przeładuję stronę.

Kompletne rozwiązanie:

*:not(html) {
    -webkit-transform: translate3d(0, 0, 0);
}

Teraz, chociaż to może nie być najbardziej "wydajne" rozwiązanie, było to jedyne, które działa. Mobile Safari nie renderuje elementów, które są poza ekranem, lub czasami renderuje nieregularnie, podczas korzystania z -webkit-overflow-scrolling: touch. Chyba że translate3d zostanie zastosowany do wszystkich innych elementów, które mogą przejdź poza ekran dzięki temu przewijaniu, te elementy zostaną odcięte po przewinięciu.

Więc jeszcze raz dziękuję i mam nadzieję, że to pomoże innej zagubionej duszy. To na pewno bardzo mi pomogło!
 61
Author: codeBearer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 19:31:37

Targetowanie wszystkich elementów oprócz html: *:not(html) spowodował problemy na innych elementach w moim przypadku. Zmodyfikował kontekst układania, powodując pęknięcie indeksu Z.

Powinniśmy lepiej spróbować skierować odpowiedni element i zastosować -webkit-transform: translate3d(0,0,0) Tylko do niego.

 9
Author: Guillaume Gautier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 10:54:29

Dodanie -webkit-transform: translate3d(0,0,0) do elementu statycznie nie działa dla mnie.

Stosuję tę właściwość dynamicznie. Na przykład, gdy strona jest przewijana, ustawiam -webkit-transform: translate3d(0,0,0) na elemencie. Następnie po krótkim opóźnieniu resetuję tę właściwość, czyli -webkit-transform: none Takie podejście wydaje się działać.

Dziękuję, @ Colin Williams za wskazanie mnie we właściwym kierunku.

 2
Author: Alexander Poleschuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 12:08:51

Gdy translate3d nie działa, spróbuj dodać perspektywę. To zawsze działa dla mnie

transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
perspective: 1000;
-webkit-perspective: 1000;

Http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css

 2
Author: Fellipe Lima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 13:56:31

Miałem ten sam problem z iscroll 4.2.5 na ios7. Cały element przewijania po prostu zniknie. Próbowałem dodać translate3d(0,0,0) jak sugerowano tutaj, rozwiązało to problem, ale wyłączyło efekt "snap" iscrolla. Rozwiązanie przyszło z nadaniem "position:relative; z-index:1000;display:block" właściwości css całemu kontenerowi, który przechowuje element scroll i nie ma potrzeby nadawania translate3d elementom potomnym.

 1
Author: yudarik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 15:37:13

Jestem całkiem pewny, że właśnie to rozwiązałem:

overflow-y: auto;

(prawdopodobnie tylko overflow: auto; będzie działać zbyt w zależności od potrzeb.)

 0
Author: David Notik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 05:38:05

Istnieją przypadki, w których stosuje się rotację i/lub stosuje się Indeks Z.

Rotacja : istniejąca deklaracja -webkit-transform w celu rotacji elementu może nie wystarczyć, aby rozwiązać problem z wyglądem (jak -webkit-transform: rotate(-45deg)). W tym przypadku możesz użyć -webkit-transform: translateZ(0px) rotateZ(-45deg) jako triku (uważaj na obracanie Z).

Indeks z: wraz z rotacją można zdefiniować dodatnią Właściwość z-index, Jak z-index: 42. Powyższe kroki opisane pod "Rotacja" były w moim przypadku wystarczające, aby rozwiązać problem, nawet z pustym translateZ(0px). Podejrzewam jednak, że indeks Z w tym przypadku mógł spowodować zniknięcie i ponowne pojawienie się w pierwszej kolejności. W każdym razie własność z-index: 42 musi być zachowana -- -webkit-transform: translateZ(42px) tylko nie wystarczy.

 0
Author: Stefan Zurfluh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 10:31:16

Jest to bardzo częsty problem, z jakim borykają się Programiści i wynika to głównie z właściwości Safari's nie odtwarzających elementów zdefiniowanych jako position : fixed.

Więc albo zmień właściwość position, albo jakiś hack musi być zastosowany, Jak wspomniano w innych odpowiedziach.

Link1

Link2

 0
Author: arqam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 05:56:17

W moim przypadku (aplikacja PhoneGap na iOS) zastosowanie translate3d do względnych elementów potomnych nie rozwiązało problemu. Mój przewijany element nie miał ustawionej wysokości, ponieważ był absolutnie ustawiony, a ja definiowałem górną i dolną pozycję. To, co dla mnie poprawiło, to dodanie minimalnej wysokości (100px).

 0
Author: b4tch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 22:40:04

Miałem ten sam problem przy użyciu starszej wersji Fancybox. Aktualizacja do v3 rozwiąże twój problem lub możesz po prostu dodać:

html, body {
    -webkit-overflow-scrolling : touch !important;
    overflow: auto !important;
    height: 100% !important;
}
 0
Author: Adam Touhou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-13 18:23:52