logo

iPad Safari задержка прорисовки элементов при прокрутке

Быстрый ответ

Чтобы преодолеть трудности с исчезновением элементов и задержкой их появления при прокрутке в Safari на iPad, используйте CSS-изоляцию (contain: paint). Данный метод ограничивает зоны, которые требуют перерисовки. Применяйте его вместе с ускорением работы GPU (transform: translateZ(0)) с целью добиться плавности анимаций. Также необходимо обрабатывать события прокрутки таким образом, чтобы JavaScript не перегружался ненужной активностью.

CSS
Скопировать код
.scrollable-element {
  contain: paint;
  transform: translateZ(0); /* словно включаем турборежим */
}

Не забывайте тестировать внесённые изменения, чтобы предотвратить возможные проблемы.

Принудительное использование ускорения видеокарты

Активация ускорения работы GPU может существенно улучшить плавность анимаций и отклик веб-приложений. Применение transform: translate3d(0,0,0) или transform: translateZ(0) заставляет браузер проводить вычисления позиционирования на видеокарте, что идеально подходит для этой задачи.

CSS
Скопировать код
.element {
  transform: translateZ(0); /* вызываем GPU на помощь */
}

Следите за производительностью своего приложения

Бездумное использование трансформаций может ухудшить производительность и вызвать проблемы с z-index. Всё нужно делать с умом: применяйте трансформации там, где они приносят реальные преимущества.

Применяйте нацеленные анимации

Предпочтительнее использовать верстку в свойствах анимаций и @keyframes для стимулирования iOS к перерисовке только тогда, когда это действительно необходимо. Таким образом, можно получить максимум от трансформаций без негативного влияния на всю страницу.

CSS
Скопировать код
@keyframes targeted-redraw {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(0, 0, 0); }
}
.element {
  animation: targeted-redraw 1s infinite;
}

Визуализация

Вот так выглядит поведение элементов в процессе прокрутки:

Markdown
Скопировать код
Начальное состояние: [👁️‍🗨️ Элемент 1, 👁️‍🗨️ Элемент 2, 👁️‍🗨️ Элемент 3]
Markdown
Скопировать код
Во время прокрутки: [🌀 Элемент 1 (исчезает), 👁️‍🗨️ Элемент 2, 🌀 Элемент 3 (исчезает)]
Markdown
Скопировать код
После прокрутки: [⏳ Элемент 1 (возвращается), 👁️‍🗨️ Элемент 2, ⏳ Элемент 3 (возвращается)]

Можно сказать, что мы играем в боулинг с физическим движком iOS: элементы исчезают, а затем вновь появляются в ходе прокрутки.

Устранение задержек отрисовки

Всем известное -webkit-overflow-scrolling: touch обеспечивает плавную прокрутку, но может создать проблему: Safari не будет рендерить элементы, которые находятся за пределами экрана. Чтобы действительно решить эту проблему, используйте совместно CSS-изоляцию и ускорение работы GPU.

CSS
Скопировать код
.element {
  contain: paint;
  transform: translateZ(0); /* проверенное сочетание */
}

Будьте разумны при использовании transform

Чрезмерное применение translate3d может вызвать сбои и проблемы в управлении z-index, подобно неразберихе у выхода из переполненного зрителей театра. Применяйте transform обдуманно и по назначению. Помните, всё хорошо в меру.

Обратитесь к источникам глубинного знания

Чтобы более полно понять данные методы, посетите представленные ссылки. Особым образом рекомендуется материал под номером четыре, который затрагивает методы увеличения производительности с помощью аппаратного ускорения CSS.

Полезные материалы

  1. will-change – CSS: Каскадные Таблицы Стилей | MDN — свойство will-change, которое предупреждает браузеры о предстоящих изменениях атрибутов элемента.
  2. Разработка веб-контента для Safari — официальные рекомендации Apple Developer по оптимизации веб-контента для iOS.
  3. Дизайн сайтов для iPhone X | WebKit — об оптимизации скорости прокрутки на устройствах iOS.
  4. Window: метод requestAnimationFrame() – Веб-API | MDN — метод requestAnimationFrame для плавных визуальных обновлений.
  5. Производительность рендеринга | Статьи | web.dev — лучшие практики повышения скорости рендеринга.
  6. z-index – CSS: Каскадные Таблицы Стилей | MDN — регулирование перекрытия содержимого с помощью z-index.