DOM & BOM – Browser Reflow & Repaint


前言

没有深入研究过, 懂个概念就好, 等性能遇到问题在来看看.

以前写的笔记: 

参考:

reflow和repaint引发的性能问题

Reflow & Repaint

repaint 是小的, 性能没有那么伤, 它只是换换颜色之类的.

reflow 是大的, 伤性能, 它会更动到排版布局.

所有插入 dom, 修改 dimension, padding 这类影响 layout 的东西都会导致 reflow.

translate 不会哦, positioin fixed 这种就 ok. 或者说它可以优化. 只是上层渲染, 不会影响整棵树.

when render ?

当 JS 修改 DOM 时, 游览器并不是马上就渲染的, 它会有一个 timing. 

通过 requestanimationframe 可以监听到它渲染了没有. 它不定时的, 依据各种 CPU / GPU 繁忙程度之类的去决定.

所以呢, 可能 JS 修改了多个属性, 但是其实游览器是一次性 reflow, repaint 的.

getBoundingClientRect & window.getComputedStyle

有传言说 getBoundingClientRect 和 getComputedStyle 会导致 reflow.

以前我都不太敢用, 后来才明白它的意思是.

如果 JS 修改了 DOM, 在游览器还没有决定什么时候渲染前, JS 又调用了 getBoundingClientRect.

那么游览器就必须马上去渲染, 这样才能给出准确的 rect. 所以说调用后就会 reflow.

但前提是游览器有需要渲染的东西而它还没有执行. 一旦执行了渲染, 你连续调用 100 次 getBoundingClientRect 它也不会去 reflow 了.

它怎么可能这么蠢呢. 是我以前蠢.. 哈哈

相关