Skip to main content
Практика завдань

Коли відбуваються reflow та repaint у браузері

Що таке Reflow та Repaint?

Reflow та Repaint — це два процеси, які відбуваються в браузері, коли змінюються DOM або CSS. Ці процеси впливають на продуктивність, тому важливо розуміти, коли і як вони відбуваються, щоб мінімізувати їх.

Reflow (також відомий як "layout")

Reflow відбувається, коли змінюються розміри або позиції елементів на сторінці. Цей процес змушує браузер перерахувати не лише позицію зміненого елемента, але й позиції всіх інших елементів, які можуть бути під впливом змін (наприклад, через зміну розміру контейнера).

Коли відбувається Reflow, браузер перераховує координати та розміри всіх елементів, що може бути витратним, особливо на складних сторінках.

Repaint (також відомий як "paint")

Repaint відбувається, коли змінюються стилі елемента, які не впливають на його позицію на сторінці (наприклад, колір фону, шрифт, рамка тощо). На відміну від Reflow, Repaint не вимагає перерахунку позицій інших елементів, лише оновлює візуальне представлення конкретного елемента.

Коли відбуваються Reflow та Repaint?

Коли відбувається Reflow:

Reflow відбувається в наступних випадках:

  1. Зміна розміру елемента:
  • Зміна width, height, margin, padding та інших властивостей.
  • Приклад: зміна ширини блоку або збільшення висоти вмісту.
  1. Зміна структури документа:
  • Додавання, видалення або зміна елементів у DOM.
  • Приклад: вставка нового елемента або видалення існуючого елемента.
  1. Зміна позиції елемента:
  • Зміна властивостей position, top, left, right, bottom, z-index.
  • Приклад: зміна позиції елемента з absolute або relative позиціонуванням.
  1. Зміна шрифту або розміру шрифту:
  • Зміна стилів шрифту, наприклад, font-size, font-family, line-height.
  • Приклад: зміна розміру тексту в блоці.
  1. Зміна видимості або рендеринг елемента:
  • Зміна display (наприклад, з none на block або навпаки).
  • Приклад: приховування або показ елементів.
  1. Анімації та трансформації:
  • Хоча анімації, такі як transform, не завжди викликають Reflow, якщо анімація змінює макет, це може викликати Reflow.

Коли відбувається Repaint:

Repaint відбувається в наступних випадках:

  1. Зміна кольору або стилю:
  • Зміна color, background-color, border, box-shadow та інших стилів, які не впливають на розмір або позицію.
  • Приклад: зміна кольору фону елемента або тексту.
  1. Зміна непрозорості:
  • Зміна opacity не впливає на макет, але викликає Repaint для оновлення рендеринг.
  • Приклад: зменшення непрозорості елемента.
  1. Додавання та зміна фону:
  • Зміна background-image, background-position, background-size та інших властивостей, пов'язаних з фоном.
  • Приклад: зміна зображення фону або його позиції.
  1. Шрифти та текстові стилі:
  • Зміна font-family, font-size, line-height, letter-spacing, якщо це не впливає на позиціонування.
  • Приклад: зміна міжбуквенного інтервалу (letter-spacing).
  1. Зміна стилю рамки:
  • Зміна кольору або ширини рамки елемента, якщо це не впливає на його розміри.
  • Приклад: зміна кольору або товщини рамки блоку.

Як мінімізувати Reflow та Repaint?

Reflow та Repaint можуть уповільнити рендеринг сторінки, особливо якщо вони відбуваються часто або для великих елементів. Ось кілька порад, як їх мінімізувати:

  1. Мінімізуйте зміни в DOM:
  • Уникайте частих змін структури DOM, оскільки це завжди викликає Reflow.
  • Спробуйте групувати зміни в DOM в один цикл, а не викликати їх один за одним.
  1. Використовуйте requestAnimationFrame:
  • Використовуйте requestAnimationFrame, щоб синхронізувати візуальні зміни з перерисовкою екрану, щоб уникнути непотрібних перерисовок.
  1. Використовуйте CSS трансформації замість зміни розмірів:
  • Якщо можливо, використовуйте transform та opacity для анімації замість зміни розмірів або позицій, щоб уникнути Reflow.
  • Приклад: використання transform: translate() замість зміни top та left.
  1. Використовуйте документні фрагменти:
  • Коли додаєте кілька елементів до DOM, використовуйте Document Fragment, щоб запобігти кільком викликам Reflow.
  1. Сховати елементи перед зміною їх розмірів:
  • Якщо ви хочете змінити розмір або позицію елемента, спочатку сховайте їх, змініть параметри, а потім знову покажіть. Це запобігає непотрібному Reflow під час процесу.
  1. Використання will-change:
  • Використовуйте властивість will-change, щоб заздалегідь вказати браузеру, які елементи зміняться. Це допомагає браузеру оптимізувати рендеринг.

Рекомендація:

Щоб покращити продуктивність веб-сторінки, уникайте частих змін у DOM, мінімізуйте зміни розмірів елементів та використовуйте CSS анімації, щоб зменшити навантаження на ЦП та прискорити рендеринг.

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

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

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

Дочитали статтю?
Практика завдань