Reflow (или layout) — это процесс вычисления браузером размеров, положения и геометрии элементов на странице после изменений в DOM или стилях. Любое изменение, которое влияет на размеры, расположение или поток элементов, может вызвать reflow. Примеры изменений, вызывающих reflow:
display: none/block.Repaint (или paint) — процесс перерисовки элементов на экране без перерасчета геометрии. Обычно repaint вызывается, когда меняется визуальный стиль элемента, но не его размер или положение. Примеры:
color,
background-color).box-shadow).opacity).Взаимосвязь reflow и repaint: Reflow всегда сопровождается repaint, потому что изменение размеров или позиции элементов требует их перерисовки. Repaint может выполняться без reflow, если затронуты только визуальные свойства.
Частые и тяжелые reflow и repaint сильно замедляют работу интерфейса, особенно на сложных страницах с большим количеством элементов. Каждый reflow — это синхронная операция, блокирующая рендеринг, что ведет к лагам и снижению отзывчивости страницы.
Факторы, увеличивающие нагрузку:
Группировка изменений DOM и стилей
DocumentFragment для добавления множества
элементов в DOM перед вставкой в основной документ.Избегание изменения layout-зависимых свойств
offsetWidth, clientHeight,
scrollTop заставляют браузер выполнять forced
reflow.Использование классов CSS
Вместо изменения множества inline-стилей по отдельности, менять один класс с предопределёнными стилями.
Пример:
// Плохо
element.style.width = "100px";
element.style.height = "50px";
// Хорошо
element.classList.add("active");Изменение класса вызывает один reflow и repaint вместо нескольких.
Использование visibility вместо
display
display: none удаляет элемент из потока и вызывает
reflow, тогда как visibility: hidden скрывает элемент без
изменения layout.Использование position: absolute или
fixed для анимаций
Изменение свойств, оптимизированных для GPU
transform и opacity изменяются с помощью
GPU и вызывают только repaint или отдельный слой рендеринга.left или top вызывают
reflow, а transform: translateX() — только repaint.Комбинирование стилей
element.style.cssText или через класс.Использование will-change
will-change: transform, opacity;
сигнализирует браузеру о планируемых изменениях и позволяет заранее
создать отдельный слой для GPU-рендеринга.DevTools Chrome
Метрики
Для библиотек типа Driver.js, которые создают интерактивные подсказки и шаги по интерфейсу:
transform: translate()
вместо изменения top и left.offsetWidth и
getBoundingClientRect при анимации.// Эффективное обновление позиции подсказки
const tooltip = document.querySelector(".tooltip");
tooltip.style.transform = `translate(${x}px, ${y}px)`;
tooltip.classList.add("visible");
Такой подход позволяет Driver.js работать плавно, не вызывая лишних перерисовок и перерасчетов layout на странице.
Эти методы обеспечивают более плавный интерфейс, сокращают нагрузку на основной поток браузера и увеличивают отзывчивость веб-приложений.