Прокрутка iPad Safari приводит к исчезновению и повторному появлению HTML-элементов с задержкой

139

В настоящее время я разрабатываю веб-приложение, использующее html5 и jQuery для iPad Safari. Я столкнулся с проблемой, когда большие области прокрутки заставляют элементы, которые отображаются вне экрана, после задержки, когда я прокручиваю их вниз.

Что я имею в виду, если у меня есть строка изображений (или даже div с градиентом), которая находится вне экрана, когда я прокручиваю вниз (или вверх) к ней, ожидаемое поведение для элемента появится на экране, когда я прокручиваю его.

Однако я вижу, что элемент не отображается, пока я не вытащу палец с экрана, и скроллер не закончит все его анимации.

Это вызывает для меня очень заметную проблему, и все это выглядит странно, хотя это не так. Я предполагаю, что iPad Safari пытается что-то сделать для экономии памяти. Есть ли способ, которым я могу предотвратить эту изменчивость. Кроме того, я был бы также признателен, если кто-нибудь сможет пролить свет на то, что на самом деле пытается сделать iPad Safari.

  • 0
    Эта проблема / решение помогли мне решить проблему с версией CSS Transforms jPanelMenu 1.3, которая превращала все на моем сайте, пока я не добавил вышеупомянутый фрагмент.
  • 2
    Использование *: not (html) будет применять translate3d ко всем другим аспектам вашего сайта, и я не рекомендую. Это приведет к тому, что изображения во вкладках исчезнут при прокрутке вниз и т. Д., Ошибки, которые вы могли бы использовать для просмотра только на ваших 3D-изображениях, теперь будут присутствовать в других аспектах вашего сайта.
Показать ещё 3 комментария
Теги:
ipad
mobile-safari

10 ответов

55
Лучший ответ

Это полный ответ на мой вопрос. Я изначально поставил ответ @Colin Williams в качестве правильного ответа, так как он помог мне добраться до полного решения. Член сообщества @Slipp D. Thompson отредактировал мой вопрос, после того, как через 2,5 года я спросил его и сказал, что я злоупотребляю формами SO Q и A. Он также сказал мне отдельно опубликовать это как ответ. Итак, вот полный ответ, который решил мою проблему:

@Колин Уильямс, спасибо! Ваш ответ и статья, которую вы связали, дали мне возможность попробовать что-то с CSS.

Итак, я использовал translate3d раньше. Это привело к нежелательным результатам. В принципе, он будет отрубать, а не элементы RENDER, которые были вне экрана, пока я не общался с ними. Итак, в основном, в альбомной ориентации, половина моего сайта, который был вне экрана, не показывался. Это IPad приложение, благодаря которому я был в исправить.

Применение translate3d к относительно позиционированным элементам решает проблему для этих элементов, но другие элементы останавливают рендеринг, один раз за кадром. Элементы, с которыми я не мог взаимодействовать (обложки), никогда не будут отображаться снова, если я не перезагружу страницу.

Полное решение:

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

Теперь, хотя это может быть не самое "эффективное" решение, оно было единственным, кто работает. При использовании -webkit-overflow-scrolling: touch Mobile Safari не отображает элементы, которые отображаются вне экрана, или иногда нерегулярно. Если трансляция3d не применяется ко всем другим элементам, которые могут перейти на экран из-за этой прокрутки, эти элементы будут отрублены после прокрутки.

Итак, еще раз спасибо, и надеюсь, что это поможет другой потерянной душе. Это, безусловно, помогло мне надолго!

  • 2
    Вот это да. Спасибо за это. Это спасло меня от головной боли в приложении PhoneGap / Cordova. В моем случае я должен был изменить *:not(html) на body *
  • 7
    просто применяем -webkit-transform: translate3d(0, 0, 0); чтобы элемент проблемы работал у меня. В моем случае я использовал ScrollMagic
Показать ещё 3 комментария
166

Вам нужно обмануть браузер, чтобы использовать аппаратное ускорение более эффективно. Вы можете сделать это с помощью пустого 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's animate (), который был очень медленным. Я переключился на использование аппаратного ускорения. Хотя это ускорило анимацию, оно дало ошибочные результаты в том смысле, что некоторые дочерние элементы родительского (анимирующего) элемента div были обрезаны. Этого не происходило, когда я использовал animate ().
  • 1
    @ Колин Уильямс, ты только что сделал мой день! : D
Показать ещё 10 комментариев
7

Ориентация всех элементов, но html: *:not(html) вызвал проблемы с другими элементами в моем случае. Он изменил контекст стекирования, вызвав разрыв некоторого z-индекса.

Мы должны попытаться настроить целевой элемент и применить к нему только -webkit-transform: translate3d(0,0,0).

  • 0
    Я столкнулся с той же проблемой. Вы можете использовать body * selector вместо *:not(html) . Это решит вашу проблему.
  • 0
    Престижность за предложение нацелиться на нужные элементы, а не загрязнять все с помощью *
2

Добавление -webkit-transform: translate3d(0,0,0) к элементу статически не работает для меня.

Я применяю это свойство динамически. Например, когда страница прокручивается, я устанавливаю -webkit-transform: translate3d(0,0,0) для элемента. Затем, после небольшой задержки, я reset это свойство, то есть -webkit-transform: none Этот подход, похоже, работает.

Спасибо, @Colin Williams за то, что указал мне в правильном направлении.

  • 0
    Этот намек очень помог мне, так как эти стили создают нежелательные побочные эффекты, которых я обычно хочу избегать. Поэтому я использую события touchstart / touchend для их добавления и удаления. Спасибо!
1

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

  • 0
    Я использовал эту технику для решения аналогичной проблемы на Android Chrome. Вертикальная прокрутка, кажется, работала лучше, чем когда я пытался исправить translate3d. В моем случае элемент <body> - это то, что я использовал для прокрутки, и сработала упрощенная версия: body { position: relative; z-index: 0; }
0

Когда 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

  • 0
    Holy C $ # @, наконец, решение для угловых / ионных. -webkit-perspective: 1000;
  • 0
    Ах, спас мой день. +1 для тебя;)
Показать ещё 1 комментарий
0

В моем случае (приложение iOS Phonegap) применение метода translate3d к относительным дочерним элементам не помогло решить проблему. Мой прокручиваемый элемент не имел заданной высоты, поскольку он был абсолютно позиционирован, и я определял верхнюю и нижнюю позиции. Для меня это добавило минимальную высоту (100 пикселей).

0

Это очень распространенная проблема, с которой сталкиваются разработчики, и в основном это связано с тем, что свойство Safari's не воссоздает элементы, определенные как position : fixed.

Таким образом, либо измените свойство позиции, либо нужно применить хак, как указано в других ответах.

Link1

Link2

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

Я довольно чертовски уверен, что я просто решил это:

overflow-y: auto;

(Предположительно, просто overflow: auto; будет работать также в зависимости от ваших потребностей.)

  • 0
    Это ничего не сделало для меня, тогда как принятый ответ, вероятно, сделал другой сценарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню