Прокручування iPad Safari призводить до того, що елементи HTML зникають і з’являються знову із затримкою


165

Зараз я розробляю веб-додаток, використовуючи html5 та jQuery для iPad Safari. У мене виникає проблема, коли великі області прокрутки призводять до того, що елементи поза екраном з’являються після затримки, коли я прокручую їх донизу.

Що я маю на увазі під цим, якщо у мене є ряд зображень (або навіть div з градієнтом), які є поза екраном, коли я прокручую його вниз (або вгору), очікувана поведінка полягає в тому, що елемент з'явиться на екрані як Я прокручую це.

Однак я бачу, що елемент не з’являється, поки я не підніму палець з екрана і скроллер закінчить усі свої анімації.

Це спричиняє для мене надзвичайно помітну проблему, завдяки чому вся справа виглядає похмурою, хоча це не так. Я здогадуюсь, що iPad Safari намагається зробити щось для збереження пам’яті. Чи є спосіб, яким я можу запобігти тому, щоб ця невдача не відбулася. Крім того, я також вдячний, якщо хтось може пролити світло на те, що насправді намагається зробити iPad Safari.


Ця проблема / рішення допомогла мені виправити проблему з версією jPanelMenu 1.3 CSS Transforms, яка перетворила все на своєму сайті invisibie, поки я не додав вищевказаний фрагмент.
75-й тромбон

2
Використання *: not (html) застосовуватиме translate3d до всіх інших аспектів вашого сайту, і я не рекомендую. Це призведе до зникнення зображень на вкладках, коли ви прокручуєте вниз тощо. Помилки, які ви можете використовувати, щоб побачити лише свої 3d-зображення, тепер будуть присутні в інших аспектах вашого веб-сайту.
Джонатан Тонге

1
У мене було кілька <svg>елементів, які демонстрували подібні уповільнені креслення / візуалізація. На жаль, це *:not(html) { ... }призвело до різного роду дивних форм поведінки, як зазначав @JonathanTonge. Однак вибір лише <svg>елементів та використання, translate3d(0, 0, 0,);здається, вирішили мої проблеми прокрутки.
Зефір Мейз

За винятком дуже специфічних випадків використання, це сміття. Дійсно псує макети, які залежать від елементів абсолютного положення.
Stoutie

2
Будь ласка, опублікуйте відповіді як відповіді, а не "РЕДАКТУВАТИ" у своєму запитанні. Я знаю, що вам найбільше подобається ваша відповідь, і це прекрасно, але StackOverflow має формат запитань, який найкраще працює, коли питання Q відрізняються від відповідей "А".
Сліпп Д. Томпсон,

Відповіді:


184

Вам потрібно обдурити браузер, щоб ефективніше використовувати апаратне прискорення. Це можна зробити за допомогою порожнього 3d перетворення:

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

Зокрема, це знадобиться для дочірніх елементів, які мають position:relative;декларацію (або просто вийдіть і виконайте це для всіх дочірніх елементів).

Не гарантоване виправлення, але досить вдале більшість часу.

Підказка про капелюх: https://web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/ios-5-native-scrolling-grins-and-gothcas/


3
Я також спробував це. На жаль, додавання translate3d - це відсікання елементів, які відображалися належним чином раніше. Також мені було потрібно апаратне прискорення для декількох об'єктів, які були поза екраном, і їх потрібно було анімувати, щоб "влетіти" на екран. Я використовував анімацію jQuery (), яка була дуже повільною. Я перейшов на використання апаратного прискорення. Хоча це пришвидшило анімацію, воно дало помилкові результати, в тому сенсі, що деякі дочірні елементи батьківського (анімаційного) діва були відрізані. Цього не було, коли я використовував animate ().
codeBearer

1
@Colin Williams Ви щойно зробили мій день! : D
Лука

9
Нічого собі, це жахливо, але ефективно. Дякую.
Tim Down

Посилання розірвано. Нове посилання: cantina.co/thought_leadership/… Кешовано: web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/…
thinsoldier

1
Золотий чудовисько зірковий чоловік! Я додав його до всіх своїх елементів li в прокручуваному діві. Пуф. Працювали.
Брайан Джонсон

68

Це повна відповідь на моє запитання. Я спочатку позначив відповідь @Colin Williams як правильну відповідь, оскільки це допомогло мені дійти до повного рішення. Член громади @Slipp Д. Томпсон відредагував моє запитання, після того, як близько 2,5 років мене вони задали, і сказав мені, що я зловживаю форматом запитань і відповідей SO. Він також сказав мені окремо розмістити це як відповідь. Ось ось повна відповідь, яка вирішила мою проблему:

@Colin Williams, дякую! Ваша відповідь та стаття, з якою ви зв’язалися, дали мені змогу спробувати щось із CSS.

Отже, я раніше використовував translate3d. Це дало небажані результати. В основному, він би відрізав і НЕ ВІДКЛЮЧИТИ елементи, які були поза екраном, поки я не взаємодіяв з ними. Так, в основному, в ландшафтній орієнтації половина мого веб-сайту, який був поза екраном, не відображався. Це веб-додаток iPad, завдяки якому я виправився.

Застосування translate3d до відносно розташованих елементів вирішило проблему для цих елементів, але інші елементи перестали відображатись, коли вони вийшли з екрана. Елементи, з якими я не міг взаємодіяти (твір мистецтва), ніколи не повторюватимуться, якщо я не перезавантажую сторінку.

Повне рішення:

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

Зараз, хоча це може бути не найефективнішим рішенням, це було єдине, що працює. Мобільний Safari не відображає елементи, які перебувають поза екраном, або іноді нерегулярно відображаються при використанні -webkit-overflow-scrolling: touch. Якщо translate3d не застосовується до всіх інших елементів, які можуть вийти за межі екрана внаслідок цього прокрутки, ці елементи будуть відрізані після прокрутки.

Тож ще раз дякую, і сподіваємось, це допоможе ще якійсь загубленій душі. Це, безумовно, допомогло мені великий час!


2
Ого. Дякую за це Це врятувало мені величезну кількість головного болю для мого додатка phonegap / cordova. У моєму випадку мені довелося змінити *:not(html)наbody *
Anon

9
просто звернення -webkit-transform: translate3d(0, 0, 0);до проблемного елемента працювало на мене. У моєму випадку я використовував ScrollMagic
fidev

Нічого з цього не працювало і для мене. Щойно я прокручую вниз до певного моменту, вже не видимі речі над вікном заглушаються, а також деякі елементи у вікні перегляду. Я помічаю дуже легкий, але безпомилковий "поштовх", коли прокручується, після чого елементи застигають. (Тобто: гладкий - вразливий - плавне поведінка, наче він ікає під час прокрутки.) Це в iPad.
cbmtrx

BTW Щойно я виявив, що на iPad Air 2, коли конкретний екранний елемент (в цьому випадку набірка) вимикає екран, пристрій "перезавантажує" цей блок - лише використовуючи велику версію, а не оригінальну середню що сторінка завантажена. Що за ...
cbmtrx

У випадку, якщо хтось відчуває таку ж дивність, як я - трохи відрізняється від описаної на цій сторінці - я виявив, що використання $(window).width()iQQery замість window.innerWidthjQuery все змінило для iOS. Хто знає.
cbmtrx

13

Націлювання на всі елементи, крім html: *:not(html) спричиняло проблеми в інших елементах у моєму випадку. Він модифікував контекст укладання, в результаті чого деякий z-індекс зламався.

Нам краще спробувати націлити на потрібний елемент і застосувати -webkit-transform: translate3d(0,0,0)лише до нього.

Редагувати: іноді translate3D(0,0,0)не працює, ми можемо використовувати наступний метод, орієнтуючись на потрібний елемент:

@keyframes redraw{
    0% {opacity: 1;}
    100% {opacity: .99;}
}

// ios redraw fix
animation: redraw 1s linear infinite;

Я стикався з тим же питанням. Ви можете використовувати body *селектор замість *:not(html). Це вирішить ваше питання.
кунал

Кудо за пропозицію націлити правильні елементи, а не забруднювати все *
Maciek Rek

7

Коли translate3d не працює, спробуйте додати перспективу. Це завжди працює для мене

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


Holy c $ # @ нарешті рішення для кутового / іонного. -webkit-perspective: 1000;
lilbiscuit

Ах врятував мені день. +1 для вас;)
Омар Бахір

Це призвело до збою мого браузера iOS.
Андреас Ріхтер

-webkit-perspective: 1000;зробив це для мене - дякую
jHilscher

2

Додавання -webkit-transform: translate3d(0,0,0)до елемента статично не працює для мене.

Я застосовую цю властивість динамічно. Наприклад, коли сторінка прокручується, я встановлюю -webkit-transform: translate3d(0,0,0)елемент. Потім після невеликої затримки я скинув цю властивість, тобто такий -webkit-transform: none підхід, здається, працює.

Дякую, @Colin Williams за те, що вказав на мене в правильному напрямку.


Цей натяк мені дуже допоміг, оскільки ці стилі викликають небажані побічні ефекти, які я зазвичай хочу уникати. Тому я використовую touchstart / touchchend події, щоб додати та видалити їх. Дякую!
Вітряк

1

У мене була така ж проблема з iscroll 4.2.5 на ios7. Весь елемент прокрутки просто зникає. Я спробував додати, translate3d(0,0,0)як було запропоновано тут, це вирішило проблему, але це відключило ефект "iscroll" snap. Рішення було "position:relative; z-index:1000;display:block"надано властивості css всьому контейнеру, який містить елемент прокрутки, і немає необхідності надавати translate3d дочірнім елементам.


Я використовував цю техніку для вирішення подібної проблеми на Android Chrome. Вертикальна прокрутка здавалася ефективнішою, ніж коли я намагався виправити translate3d. У моєму випадку <body>елемент - це те, що я використовував для прокрутки, і спрощена версія працювала:body { position: relative; z-index: 0; }
BumbleB2na

1

Час translate3dможе не спрацювати, у тих випадках perspectiveїх можна використовувати

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

0

Я досить проклятий, що я просто вирішив це:

overflow-y: auto;

(Імовірно, просто overflow: auto;буде працювати занадто залежно від ваших потреб.)


Це нічого не зробило для мене, тоді як прийнята відповідь зробила так, мабуть, інший сценарій
тоні

0

Є випадки , коли обертання застосовується і / або індекс Z використовується.

Поворот : Існуючого оголошення про -webkit-transformобертання елемента може бути недостатньо для вирішення проблеми зовнішності (як -webkit-transform: rotate(-45deg)). У цьому випадку ви можете використовувати -webkit-transform: translateZ(0px) rotateZ(-45deg)як трюк ( майте на увазі поворот Z ).

Z індекс : Разом з обертанням ви можете визначити позитивну z-indexвластивість, наприклад z-index: 42. Наведені вище кроки, описані в розділі "Поворот", у моєму випадку були достатньою для вирішення проблеми, навіть із порожнім translateZ(0px). Я підозрюю, що індекс Z в цьому випадку, можливо, спричинив зникнення та появу в першу чергу. У будь-якому випадку z-index: 42майно потрібно зберігати - -webkit-transform: translateZ(42px)тільки цього недостатньо.


0

Це дуже поширена проблема, з якою стикаються розробники, і це, головним чином, завдяки Safari'sвластивості не відтворювати елементів, визначених як position : fixed.

Отже, або змінити властивість позиції, або якийсь хак потрібно застосувати, як зазначено в інших відповідях.

Посилання1

Посилання2


0

У моєму випадку (програма для iOS Phonegap), застосування translate3d до відносних дочірніх елементів не вирішило проблему. Мій елемент, що прокручується, не мав заданої висоти, оскільки він був абсолютно розміщений, і я визначав верхню і нижню позиції. Що для мене виправлено - додавання мінімальної висоти (100 пікселів).


0

У мене була така ж проблема, використовуючи старішу версію Fancybox. Оновлення до v3 вирішить вашу проблему АБО ви можете просто додати:

html, body {
    -webkit-overflow-scrolling : touch !important;
    overflow: auto !important;
    height: 100% !important;
}

0

Я зіткнувся з цією проблемою в проекті Framework7 & Cordova. Я спробував усі рішення вище. Вони не вирішили моєї проблеми.

У моєму випадку я використовував анімацію 10+ css на одній сторінці з нескінченним обертанням (перетворенням). Мені довелося видалити анімацію. Зараз це нормально з відсутністю деяких візуальних особливостей.

Якщо вищезгадані рішення не допоможуть вам, ви можете почати видаляти деякі анімації.


0

-webkit-transform: translate3d(0, 0, 0);трюк не працює для мене. У моєму випадку я поставив батькові:

// parent
height: 100vh;

Змінивши це на:

height: auto;
min-height: 100vh;

Вирішено питання, якщо хтось інший стикається з тією ж ситуацією.


0

У моєму випадку CSS не виправив проблему. Я помітив проблему під час використання кнопки jQuery повторно відображати кнопку.

$("#myButton").html("text")

Спробуйте це

$("#myButton").html("<span>text</span>")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.