Open LLwanran opened 5 years ago
本题考察的重点 - 是否理解浏览器的回流与重绘 (Reflow & Repaint),联系昨天文中提到的“切换模式、开关机的时候会概率出现闪屏”的问题: 浏览器使用流式布局模型 (Flow Based Layout) 浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了Render Tree 有了Render Tree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上 由于浏览器使用流式布局,对Render Tree的计算通常只需要遍历一次就可以完成,但table及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间,这也是为什么要避免使用table布局的原因之一
本题考察的重点 - 是否理解浏览器的回流与重绘 (Reflow & Repaint),联系昨天文中提到的“切换模式、开关机的时候会概率出现闪屏”的问题:
HTML
DOM
CSS
CSSOM
Render Tree
table
一句话:回流必将引起重绘,重绘不一定会引起回流
当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。
会导致回流的操作:
:hover
一些常用且会导致回流的属性和方法:
clientWidth
clientHeight
clientTop
clientLeft
offsetWidth
offsetHeight
offsetTop
offsetLeft
scrollWidth
scrollHeight
scrollTop
scrollLeft
scrollIntoView()
scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()
当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘
color
background-color
visibility
回流比重绘的代价要更高
display: none
visibility: hidden
visibility: visible
opacity: 0
opacity: 1
一句话:回流必将引起重绘,重绘不一定会引起回流
回流 (Reflow)
当
Render Tree
中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。会导致回流的操作:
DOM
元素CSS
伪类(例如::hover
)一些常用且会导致回流的属性和方法:
clientWidth
、clientHeight
、clientTop
、clientLeft
offsetWidth
、offsetHeight
、offsetTop
、offsetLeft
scrollWidth
、scrollHeight
、scrollTop
、scrollLeft
scrollIntoView()
、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()
重绘 (Repaint)
当页面中元素样式的改变并不影响它在文档流中的位置时(例如:
color
、background-color
、visibility
等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘性能影响
回流比重绘的代价要更高
回到题目:
共同点:它们都能让元素不可见
display: none
visibility: hidden
visibility: visible
来取消隐藏opacity: 0
opacity: 1
来取消隐藏