🔍 inp.works

Layout thrashing: багаторазові reflow в одному кадрі і як їх прибрати

Що відбувається

Браузер намагається перераховувати макет один раз за кадр. Але якщо код пише стиль, потім читає геометрію (offsetWidth, getBoundingClientRect), потім знову пише — у циклі — кожне читання примусово запускає свіжий синхронний перерахунок макета всієї сторінки. Цикл по 100 елементах може спричинити 100 повних reflow в одному кадрі.

Вартість пропорційна розміру DOM: код, нешкідливий на маленькій сторінці, убиває INP на сторінці з тисячами вузлів.

Як розпізнати

Як виправити

Проблема

items.forEach((el) => {
  el.style.width = base + "px"          // write
  const h = el.offsetHeight             // read → forced reflow, every iteration
  el.style.height = h * 2 + "px"        // write
})

Виправлення

const heights = items.map((el) => el.offsetHeight)  // all reads
requestAnimationFrame(() => {
  items.forEach((el, i) => {                          // all writes
    el.style.width = base + "px"
    el.style.height = heights[i] * 2 + "px"
  })
})
Просканувати свій сайт безкоштовно →
Advertise here