All of the below properties or methods, when requested/called in JavaScript, will trigger the browser to synchronously calculate the style and layout. This is also called reflow or layout thrashing, and is common performance bottleneck.
elem.offsetLeft,elem.offsetTop,elem.offsetWidth,elem.offsetHeight,elem.offsetParentelem.clientLeft,elem.clientTop,elem.clientWidth,elem.clientHeightelem.getClientRects(),elem.getBoundingClientRect()
elem.scrollBy(),elem.scrollTo()elem.scrollIntoView(),elem.scrollIntoViewIfNeeded()elem.scrollWidth,elem.scrollHeightelem.scrollLeft,elem.scrollTopalso, setting them
elem.focus()can trigger a double forced layout (source)
elem.computedRole,elem.computedNameelem.innerText(source)
window.getComputedStyle() will typically force style recalc (source)
window.getComputedStyle() will force layout, as well, if any of the following is true:
- The element is in a shadow tree
- There are media queries (viewport-related ones). Specifically, one of the following: (source)
min-width,min-height,max-width,max-height,width,heightaspect-ratio,min-aspect-ratio,max-aspect-ratiodevice-pixel-ratio,resolution,orientation
- The property requested is one of the following: (source)
height,widthtop,right,bottom,leftmargin[-top,-right,-bottom,-left, or shorthand] only if the margin is fixed.padding[-top,-right,-bottom,-left, or shorthand] only if the padding is fixed.transform,transform-origin,perspective-origintranslate,rotate,scalewebkit-filter,backdrop-filtermotion-path,motion-offset,motion-rotationx,y,rx,ry
window.scrollX,window.scrollYwindow.innerHeight,window.innerWidthwindow.getMatchedCSSRules()only forces style
inputElem.focus()inputElem.select(),textareaElem.select()(source)
mouseEvt.layerX,mouseEvt.layerY,mouseEvt.offsetX,mouseEvt.offsetY(source)
doc.scrollingElementonly forces style
range.getClientRects(),range.getBoundingClientRect()
- Quite a lot; haven't made an exhaustive list , but Tony Gentilcore's 2011 Layout Triggering List pointed to a few.
- Lots & lots of stuff, …including copying an image to clipboard (source)
- If layout is forced, style must be recalculated first. So forced layout triggers both operations. Their costs are very dependent on the content/situation, but typically both operations are similar in cost.
- The above data was built by reading the Blink source, so it's true for Chrome, Opera, and most android browsers.
- Tony Gentilcore's Layout Triggering List was for 2011 WebKit and generally aligns with the above.
- Modern WebKit's instances of forced layout are mostly consistent:
updateLayoutIgnorePendingStylesheets- GitHub search - WebKit/WebKit - Gecko's reflow appears to be requested via FrameNeedsReflow. Results:
FrameNeedsReflow- mozilla-central search - No concrete data on Edge/IE, but it should fall roughly in line, as the return values for these properties are spec'd. What would differ is the amount of clever optimization.
- forced layout (and style recalc):
updateLayoutIgnorePendingStylesheets- Chromium Code Search - forced style recalc:
updateLayoutTree- Chromium Code Search
CSS Triggers is a related resource and all about what operations are required to happen in the browser lifecycle as a result of setting/changing a given CSS value. It's a great resource. The above list, however, are all about what forces the purple/green/darkgreen circles synchronously from JavaScript.
- Avoiding layout thrashing — Web Fundamentals
- Fixing Layout thrashing in the real world | Matt Andrews
- Timeline demo: Diagnosing forced synchronous layouts - Google Chrome
- Preventing 'layout thrashing' | Wilson Page
- wilsonpage/fastdom
- Rendering: repaint, reflow/relayout, restyle / Stoyan
- We spent a week making Trello boards load extremely fast. Here’s how we did it. - Fog Creek Blog
- Minimizing browser reflow | PageSpeed Insights | Google Developers