Статьи

Оптимизация CSS: настройка производительности анимации с помощью DevTools

Эта статья является частью серии, созданной в сотрудничестве с SiteGround . Спасибо за поддержку партнеров, которые делают возможным использование SitePoint.

CSS анимация, как известно, супер производительна. Несмотря на то, что это относится к простым анимациям на нескольких элементах, если вы не кодировали свои анимации с учетом производительности и добавили больше сложности, пользователи сайта скоро заметят это и, возможно, будут раздражены.

В этой статье я познакомлю вас с некоторыми полезными функциями DevTools для браузера, которые позволят вам проверить, что происходит под капотом при анимации с помощью CSS. Таким образом, когда анимация выглядит немного прерывисто, у вас будет лучшее представление, почему и что вы можете сделать, чтобы это исправить.

Инструменты разработчика для производительности CSS

Ваша анимация должна работать со скоростью 60 кадров в секунду (кадров в секунду), чтобы плавно работать в браузере. Чем ниже скорость, тем хуже будет выглядеть ваша анимация. Это означает, что браузер имеет не более 16 миллисекунд для выполнения своей работы за один кадр. Но что он делает за это время? И как вы узнаете, поддерживает ли ваш браузер желаемую частоту кадров?

Я думаю, что ничто не сравнится с опытом пользователя, когда дело доходит до оценки качества анимации. Тем не менее, инструменты для разработчиков в современных браузерах, хотя и не всегда надежные на 100%, становятся все умнее и умнее, и с их помощью вы можете многое сделать для просмотра, редактирования и отладки своего кода.

Это также верно, когда вам нужно проверить частоту кадров и производительность CSS анимации. Вот как это работает.

Изучение инструмента повышения производительности в Firefox

В этой статье я использую инструмент Firefox Performance. Другим важным претендентом является Chrome Performance Tool. Вы можете выбрать свой любимый, так как оба браузера предлагают мощные функции производительности.

Чтобы открыть инструменты разработчика в Firefox, выберите один из следующих вариантов:

  • Щелкните правой кнопкой мыши на своей веб-странице и выберите « Проверить элемент» в контекстном меню.
  • Если вы используете клавиатуру, нажмите Ctrl + Shift + I в Windows и Linux или Cmd + Opt + I в macOS.

Далее нажмите на вкладку « Производительность ». Здесь вы найдете кнопку, которая позволяет начать запись производительности вашего сайта:

Панель производительности в Firefox Developer Tools.

Нажмите эту кнопку и подождите несколько секунд или выполните какое-либо действие на странице. Когда вы закончите, нажмите кнопку « Остановить запись» :

Остановите запись активности браузера на панели «Производительность».

За долю секунды Firefox представляет вам тонны хорошо организованных данных, которые помогут вам разобраться, из каких проблем страдает ваш код.

Результат записи на панели Performance выглядит примерно так:

Результаты записи в панели Performance.

Раздел « Водопад » идеально подходит для проверки проблем, связанных с переходами CSS и анимацией ключевых кадров. Другими разделами являются Дерево вызовов и JS Flame Chart , которые вы можете использовать, чтобы узнать о узких местах в вашем коде JavaScript.

Водопад имеет сводный раздел в верхней части и подробное описание. В обоих случаях данные имеют цветовую кодировку:

  • Желтые столбцы относятся к операциям JavaScript.
  • Фиолетовые столбики относятся к расчету стилей CSS HTML-элементов (пересчет стилей) и планированию вашей страницы (макет). Операции с макетами довольно дороги для браузера, поэтому если вы анимируете свойства, которые включают повторяющиеся макеты (также известные как перефразирование — такие как margin , padding , top , left и т. Д.), Результаты могут быть затруднительными.
  • Зеленые полосы обозначают ваши элементы в одном или нескольких растровых изображениях (Paint). Анимация таких свойств, как color , color background-color , box-shadow и т. Д., Включает в себя дорогостоящие операции рисования, которые могут быть причиной медленной анимации и плохого пользовательского опыта.

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

Функция фильтрации внутри Firefox Performance Dev Tools.

Большая зеленая полоса под сводкой «Водопад» представляет информацию о частоте кадров.

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

Давайте проиллюстрируем это на примере.

Инструмент Performance в действии

Это простая CSS-анимация с использованием @keyframes слова @keyframes . Тестовая страница выглядит так:

Демонстрационная страница с видимой прямоугольной рамкой.

Демо-страница с прямоугольной рамкой, которая вот-вот выдвинется.

Прямоугольная фиолетовая коробка скользит в бесконечном цикле.

Я сделал это, анимировав свойство margin-left элемента <div> , представляющего прямоугольное поле на экране. Вот как выглядит блок анимации @keyframes :

 @keyframes slide-margin { 100% { margin-left: 0; } } 

Данные о производительности, которые я получаю из этой анимации, выглядят так:

Запись анимации с полями в панели Firefox Performance инструментов разработчика.

Визуальная частота кадров выглядит несколько неровной, а средняя частота кадров составляет 44,82 кадра в секунду, что немного ниже.

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

Наконец, если вы получите доступ к инструменту « Инспектор» , щелкните в разделе « Анимация » и наведите указатель мыши на имя анимации, появится информационное окно со всеми соответствующими данными о текущей анимации. Если бы ваша анимация была оптимизирована, было бы сообщение с указанием этого факта. В этом случае нет сообщения:

Панель анимации внутри инструмента «Инспектор» с информацией о текущей анимации.

Теперь я собираюсь изменить свой код и сделать новую запись, поскольку браузер анимирует свойство CSS translate3d() с помощью этого блока @keyframes :

 @keyframes slide-three-d { 100% { transform: translate3d(0, 0, 0); } } 

Вот как выглядит запись спектакля:

Запись анимации осуществляется с помощью translate3d.

Теперь частота кадров выше (56,83 кадра в секунду), и водопад не показывает дорогостоящих операций по разметке и покраске.

Кроме того, если вы откроете вкладку « Инспектор » инструментов разработчика, откроете панель « Анимация» и наведете указатель мыши на имя анимации, вы увидите что-то вроде этого:

Панель анимации в Инспекторе Firefox Developer Tools.

В информационном окне относительно названия анимации указывается, что все анимации оптимизированы, что является хорошей новостью для посетителей вашего сайта.

Только Animate CSS непрозрачность , преобразования и фильтры

Возможно, вы уже слышали этот совет раньше, но на всякий случай стоит повторить его: если вы хотите, чтобы ваша анимация работала плавно, анимируйте только непрозрачность CSS, преобразования и фильтры. Анимирование всего остального заставит ваш браузер выполнять дорогостоящие задачи за очень короткое время, что часто не дает наилучших результатов.

Как подтверждает инструмент «Производительность» в вашем браузере, повторные операции макета и рисования не являются вашими друзьями.

Однако каждый браузер обрабатывает свойства CSS немного по-своему. Если вы хотите точно знать, какой браузер запускает операции макета и рисования, для каких свойств (особенно при обновлении значений для этих свойств, что и используется в веб-анимации), перейдите к разделу «Триггеры CSS» .

Чтобы обеспечить качественную анимацию, популярный подход заключается в том, чтобы заставить браузер передать работу по изменению некоторых свойств графическому процессору (GPU), который освобождает основной поток браузера от некоторого давления и использует преимущества аппаратного ускорения. Вы можете сделать это, используя CSS-свойство will-change , или взломать translateZ(0) и translate3d(0,0,0) . Все эти приемы сработают, но если вы переусердствуете с этим, вы действительно сможете получить именно то, что вы пытаетесь избежать, например, анимацию.

Я не буду вдаваться в подробности аппаратного ускорения для производительности веб-анимации, но если вы хотите копнуть глубже, взгляните на ресурсы, перечисленные ниже.

Ресурсы