прокрутка iPad Safari приводит к тому, что элементы HTML исчезают и появляются с задержкой
в настоящее время я разрабатываю веб-приложение с использованием html5 и jQuery для iPad Safari. Я столкнулся с проблемой, в которой большие области прокрутки вызывают элементы, которые находятся вне экрана, чтобы появиться после задержки, когда я прокручиваю вниз к ним.
что я имею в виду, если у меня есть ряд изображений (или даже div с градиентом), который находится за кадром, когда я прокручиваю вниз (или вверх) до него,ожидаемое поведение для элемента, чтобы появиться на экране, как я прокрутки до оно.
однако я вижу, что элемент не появляется пока я не уберу палец с экрана и скроллер не закончит все свои анимации.
Это вызывает супер заметную проблему для меня, заставляя все это выглядеть прерывистым, хотя это не так. Я предполагаю, что iPad Safari пытается что-то сделать, чтобы сохранить память. Есть ли способ, которым я могу предотвратить эту изменчивость. Кроме того, я был бы также признателен, если кто-нибудь может пролить свет на то, что iPad Safari на самом деле пытается сделать.
11 ответов:
вам нужно обмануть браузер, чтобы использовать аппаратное ускорение более эффективно. Вы можете сделать это с помощью пустого 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/
Это полный ответ на мой вопрос. Я изначально отметил ответ @Colin Williams как правильный ответ, так как это помогло мне получить полное решение. Член сообщества @Slipp D. Томпсон отредактировал мой вопрос, примерно через 2,5 года после того, как я задал его, и сказал мне, что я злоупотребляю форматом вопросов и ответов SO. Он также сказал мне отдельно опубликовать это в качестве ответа. Итак, вот полный ответ, который решил мою проблему:
@Колин Уильямс, спасибо! Ваш ответ и статья, которую вы связали, дали мне повод попробовать что-то с CSS.
Итак, я использовал translate3d раньше. Это привело к нежелательным результатам. В принципе, он будет отрубать и не отображать элементы, которые были за кадром, пока я не взаимодействовал с ними. Таким образом, в основном, в альбомной ориентации половина моего сайта, которая была за кадром, не показывалась. Это веб-приложение для iPad, благодаря которому я был в затруднении.
применение translate3d к относительно расположенным элементам решена проблема для этих элементов, но другие элементы перестали рендеринга, как только за кадром. Элементы, с которыми я не мог взаимодействовать (иллюстрации), никогда не будут отображаться снова, если я не перезагрузил страницу.
решение:
*:not(html) { -webkit-transform: translate3d(0, 0, 0); }теперь, хотя это может быть не самым "эффективным" решением, это было единственное, что работает. Mobile Safari не отображает элементы, которые находятся за пределами экрана, или иногда отображает хаотично, при использовании
-webkit-overflow-scrolling: touch. Если translate3d применяется ко всем другим элементам, которые могут выйти за пределы экрана из-за этой прокрутки, эти элементы будут отключены после прокрутки.Итак, еще раз спасибо, и надеюсь, что это поможет какой-то другой потерянной душе. Это, конечно, помогло мне!
таргетинг на все элементы, кроме html:
*:not(html)вызвал проблемы на других элементах в моем случае. Он изменил контекст стекирования, вызвав разрыв некоторого Z-индекса.мы должны лучше попытаться нацелить правильный элемент и применить
-webkit-transform: translate3d(0,0,0)это только.
добавлять
-webkit-transform: translate3d(0,0,0)элемент статически не работает для меня.я применяю это свойство динамически. Например, когда страница прокручивается, я устанавливаю
-webkit-transform: translate3d(0,0,0)на элемент. Затем после небольшой задержки я сбрасываю это свойство, то есть-webkit-transform: noneЭтот подход, кажется, работает.спасибо, @Colin Williams за то, что указал мне в правильном направлении.
когда 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
у меня была такая же проблема с iscroll 4.2.5 на iOS7. Весь элемент прокрутки просто исчезнет. Я пытался добавить
translate3d(0,0,0)Как было предложено здесь, он решил проблему, но он отключил эффект "привязки" iscroll. Решение пришло с предоставлением"position:relative; z-index:1000;display:block"свойства css для всего контейнера, который содержит элемент прокрутки, и нет необходимости давать translate3d дочерним элементам.
Я чертовски уверен, что я только что решил это с:
overflow-y: auto;(предположительно просто
overflow: auto;тоже будет работать в зависимости от ваших потребностей.)
есть случаи, когда a поворот и/или индекс 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)только не хватает.
в моем случае (приложение iOS Phonegap) применение translate3d к относительным дочерним элементам не решило проблему. Мой прокручиваемый элемент не имел заданной высоты, поскольку он был абсолютно позиционирован, и я определял верхнюю и нижнюю позиции. То, что исправило это для меня, добавляло минимальную высоту (100px).
У меня была такая же проблема, используя старую версию Fancybox. Обновление до v3 решит вашу проблему или вы можете просто добавить:
html, body { -webkit-overflow-scrolling : touch !important; overflow: auto !important; height: 100% !important; }
Comments