Skip to main content

Що таке "reflow" і "repaint"?

1. Що таке reflow і repaint

Коли ти змінюєш DOM або CSS у браузері, рушій рендерингу (у Chrome це Blink) повинен перерахувати, як сторінка виглядає. Ця робота ділиться на два етапи:

ТермінЩо робитьКоли відбувається
Reflow (layout)Перерахунок геометрії елементів: розмірів, позицій, відступів, висоти, ширини тощоКоли змінюється структура DOM або CSS, що впливають на розкладку (layout)
Repaint (paint)Перемальовування видимих пікселів (кольори, фон, тіні, бордери тощо) без перерахунку геометріїКоли змінюється лише зовнішній вигляд, а не розмір чи позиція

2. Як це працює під капотом

Reflow -> браузер повинен:

  1. Перерахувати розміри і позиції елементів (layout tree).
  2. Визначити, які ділянки екрана потрібно перемалювати.
  3. Запустити Repaint (перемальовування).

Repaint -> браузер зафарбовує змінені пікселі (paint + composite).

Кожен reflow майже завжди спричиняє repaint, але не кожен repaint потребує reflow.

3. Приклади Reflow

Reflow спричиняють:

  • зміна розмірів (width, height, padding, margin, border, font-size);
  • додавання / видалення DOM-елементів;
  • зміна тексту;
  • обчислення властивостей, що залежать від layout (offsetWidth, clientHeight, getComputedStyle);
  • зміна класу, що впливає на позиціонування або розміри;
  • зміна розміру вікна браузера (resize);
  • прокрутка (scroll).

Приклад:

javascript
element.style.width = '400px'; // Reflow + Repaint

4. Приклади Repaint

Repaint спричиняють:

  • зміна кольору (color, background-color);
  • зміна прозорості (opacity);
  • тіні (box-shadow);
  • outline;
  • visibility (якщо елемент залишається на місці).

Приклад:

javascript
element.style.backgroundColor = 'red'; // Тільки Repaint

5. Чому reflow небезпечний для продуктивності

Reflow - одна з найдорожчих операцій у браузері, особливо якщо вона зачіпає багато елементів.

Проблема:

  • Layout-дерево пов'язане - зміна одного елемента може змусити перерахувати весь документ.
  • Кожен reflow може займати десятки мілісекунд, особливо при складних layout-ах.

Якщо робити їх у циклі або часто - інтерфейс починає "лагати".

6. Типові помилки, що спричиняють зайвий reflow

ПомилкаЩо відбувається
Багаторазова зміна стилю окремоЩоразу тригериться новий reflow
Звернення до offsetHeight після зміни стилюБраузер змушений синхронно перерахувати layout
Зміна класів у цикліReflow на кожній ітерації
Анімація властивостей, що впливають на layout (наприклад, width, top, margin)Layout перераховується на кожному кадрі
Часте додавання DOM-елементівКожен insert спричиняє перерахунок дерева

7. Як зменшити кількість reflow / repaint

ПідхідЩо робить
Batch updatesЗмінюй кілька властивостей за раз (через classList або cssText)
DocumentFragmentДодавай DOM-елементи поза документом, потім вставляй усе одразу
Кешуй обчисленняconst height = el.offsetHeight; перед циклом
Уникай явно layout-залежних стилівНе анімуй width, height, top, left
Використовуй CSS transform і opacityGPU-анімації не спричиняють reflow
requestAnimationFrame()Для анімацій замість setInterval
will-changeЗаздалегідь повідомляє браузеру, які властивості будуть змінюватися (для оптимізації)

8. Приклад поганого коду (багато reflow)

javascript
for (let i = 0; i < 100; i++) { const el = document.createElement('div'); document.body.appendChild(el); // Reflow щоразу el.style.width = i + 'px'; // Reflow console.log(el.offsetHeight); // Forced reflow }

Оптимізована версія:

javascript
const fragment = document.createDocumentFragment(); for (let i = 0; i < 100; i++) { const el = document.createElement('div'); el.style.width = i + 'px'; fragment.appendChild(el); } document.body.appendChild(fragment); // 1 Reflow

9. Взаємозв'язок з event loop і FPS

Reflow/Repaint відбуваються у фазі рендерингу кадру (frame rendering) - між макро- і мікрозавданнями event loop.

Для плавної анімації потрібно вкладатися в 16.6 мс (60 FPS). Якщо layout займає більше - кадри пропускаються -> "фризи".

10. Коротке резюме

ТермінЩо робитьПрикладВплив
Reflow (layout)Перерахунок геометрії і позиційзміна width, margin, додавання DOMдорога операція
Repaint (paint)Перемальовування зовнішнього виглядузміна color, background, opacityпомірно затратна
CompositeСклеювання шарів після painttransform, opacityдешева (GPU)
МетаМінімізувати Reflow, анімувати тільки transform і opacity-максимум FPS

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.