--- title: Batch DOM CSS Changes impact: MEDIUM impactDescription: reduces reflows/repaints tags: javascript, dom, css, performance, reflow --- ## Batch DOM CSS Changes Avoid interleaving style writes with layout reads. When you read a layout property (like `offsetWidth`, `getBoundingClientRect()`, or `getComputedStyle()`) between style changes, the browser is forced to trigger a synchronous reflow. **Incorrect (interleaved reads and writes force reflows):** ```typescript function updateElementStyles(element: HTMLElement) { element.style.width = "100px"; const width = element.offsetWidth; // Forces reflow element.style.height = "200px"; const height = element.offsetHeight; // Forces another reflow } ``` **Correct (batch writes, then read once):** ```typescript function updateElementStyles(element: HTMLElement) { // Batch all writes together element.style.width = "100px"; element.style.height = "200px"; element.style.backgroundColor = "blue"; element.style.border = "1px solid black"; // Read after all writes are done (single reflow) const { width, height } = element.getBoundingClientRect(); } ``` **Better: use CSS classes** ```css .highlighted-box { width: 100px; height: 200px; background-color: blue; border: 1px solid black; } ``` ```typescript function updateElementStyles(element: HTMLElement) { element.classList.add("highlighted-box"); const { width, height } = element.getBoundingClientRect(); } ``` Prefer CSS classes over inline styles when possible. CSS files are cached by the browser, and classes provide better separation of concerns and are easier to maintain.