Reflow (также называется layout) пересчитывает позиции и размеры элементов — это вычислительно дорогая операция. Repaint обновляет визуальные свойства вроде цвета или видимости без изменения layout'а — это сравнительно дешевле, но всё равно имеет стоимость.
Каждый раз, когда JavaScript модифицирует DOM так, что это влияет на layout, браузер должен пересчитать всё затронутое поддерево. Многократный вызов reflow — особенно внутри циклов — известен как layout thrashing и является частой причиной проблем с производительностью.
offsetHeight после записи заставляет браузер немедленно применить отложенные изменения layout'аDocumentFragment для построения структур DOM вне экрана перед их вставкой в одной операции// Плохо: вызывает reflow на каждой итерации
elements.forEach(el => el.style.width = el.offsetWidth + 10 + 'px');
// Предпочтительнее, чем изменение `top` или `left`
element.style.transform = 'translateX(100px)';
requestAnimationFrame() для планирования визуальных обновлений в синхронизации с циклом рендеринга браузера, предотвращая лишние промежуточные reflowМинимизация reflow и repaint сводится к сокращению пересчётов layout'а путём группировки изменений DOM, использования GPU-ускоренных CSS-свойств и правильной синхронизации обновлений с помощью requestAnimationFrame(). Эти техники незаменимы для создания плавных и производительных JavaScript-приложений.
Чтение свойства offsetHeight после изменения стилей элемента заставит браузер немедленно применить ожидающие изменения макета, вызвав синхронный reflow.
Новый — ещё не проверен сообществом
Вы