tgoop.com/prog_way_blog/334
Create:
Last Update:
Last Update:
"Тяжёлые" анимации
На самом деле, на производительность сайта может влиять очень много что — и CSS в том числе. Есть множество свойств, которые даются браузеру для обработки сложнее прочих: о таких свойствах как раз в этом посте
И для того, чтобы разобраться в нюансах, стоит помнить, что отрисовка контента страницы происходит в несколько этапов, таких как получение ресурсов, парсинг HTML и CSS, создание Render Tree и так далее. Более подробно можно прочитать в отличной статье на доке
Мы же сконцентрируемся на Layout и Paint фазах, их я кратко напомню:
- Layout — фаза отрисовки, в которой браузер рекурсивно проходится по заранее полученному Render Tree и рассчитывает позиции и размеры элементов относительно друг друга для их корректного расположения внутри вьюпорта
- Paint — по полученным позициям и размерам браузер рисует конкретные пиксели конкретных цветов
Также помним, что Paint без Layout не бывает, а если вызывается пересчёт Layout, то и в фазу Paint мы обязательно попадём, причём с нуля
Так вот, к чему это я: анимация любого свойства, которое так или иначе влияет на расположение элементов на странице будет вызывать Layout и Paint на каждый фрейм анимации, а сам по себе процесс отрисовки — это далеко не дёшево
Часто можно столкнуться с анимацией, когда какой-то элемент на странице (изображение, текст или ещё что-то) плавают по странице в зависимости от положения курсора. Там анимация беспрерывна, и если реализовать подобную анимацию через свойства
top
и left
, например, то фазы Layout и Paint будут крутиться каждый раз, когда вы двигаете курсором, и из-за долгих рассчётов вся анимация будет дёрганнойРешается это просто — на помощь приходит Compositing
Compositing — это способ вынести все вычисления для рендера в отдельное ядро
Страница разбивается на слои и каждый слой считается асинхронно и независимо, из-за чего изменение элемента в одном слое не затрагивает элементы из других слоёв, и перерисовывать их становится не нужно
Браузеры умеют применять это и самостоятельно, но у нас и у самих есть возможность вынести элемент на отдельный слой: использовать
transform
Анимацию плавающего элемента нужно переделать с
top
и left
на transform
, и вот почему:top
и left
триггерят Layout и Paint для всего потока, а может и всей страницы. transform
выносит элемент в отдельный поток, что уменьшает объём вычислений и делает страницу более отзывчивойТаким образом, к тяжёлым свойствам можно отнести все, что триггерят Reflow (повторный вызов Layout фазы) и Repaint:
Reflow триггерят анимации: width, height, top, left, font-size, border-width, margin, padding и так далее — все свойства, что могут влиять на расстановку элементов на странице
Repaint триггерят анимации: color, background-color, outline, visibility — все свойства, что влияют на отображение, но не на позицию элемента
Обычно для анимаций рекомендуют использовать
transform
и opacity
. Это не значит, что нельзя использовать других свойств, но эти — самые оптимизированные для браузераСпасибо за прочтение, это важно для меня ❤️
@prog_way_blog — чат — #web #theory
BY progway — программирование, IT
Share with your friend now:
tgoop.com/prog_way_blog/334