假设我有一个标识为#msg
的元素,并且在某种情况下我想要添加一个类以便应用样式,例如使文字显示为红色。
我可以做$('#msg').addClass(theclass)
我的问题是浏览器是如何反应的?它是重新渲染所有页面还是重新渲染该特定元素?
答案 0 :(得分:4)
使用您的示例(addClass
),它取决于您添加的类中的内容。添加类本身只会修改目标节点上的属性。
浏览器非常智能,只能修改需要重新渲染的元素。最小化重新渲染量的技术是设置元素的position: absolute
或display: none
以暂时从文档流中删除它,进行更改,然后重新插入。如果,例如,这尤其重要。你让一些元素向下滑动。如果该元素在流程和&在DOM树的开头,它所延伸的每个像素都会导致重新渲染。
为了好玩,让我们在桌面上用纸做一个简单的比喻,在这个例子中插入元素。桌面是您的浏览器窗口,□
=纸张,_
=空格。您想将另一张纸放在最左上方的位置。这是开始的情况:
□ □ □ □
□ □ □ □
_ _ _ _
将新工作表放在桌面上后:(■= new,▧=已移动)
■ □ □ □
▧ □ □ □
▧ _ _ _
如果第二行是一卷长卷(=全宽div),则整行会移动:
■ □ □ □
▧ _ _ _
▧▧▧▧▧▧▧
如果您将纸张插入第三行,则不会发生回流。
注意:这是理论上的解释。它的效率因浏览器而异 来源:高性能Javascript,'重绘&回流',p.70。
答案 1 :(得分:2)
根据此工具https://developer.chrome.com/devtools/docs/timeline提供的结果,我的理解是 NO ,整个DOM不会重新绘制/重新生成,只是具有类更改的元素。
HTML:
<p>Lorem ipsum dolar sit amet...</p>
<input id="btn" type="button" value="click me" />
使用Javascript:
$(document).on('click', '#btn', function () {
$('p').addClass('red')
})
CSS:
.red {
color: red;
}
**** ****编辑 我不得不将我的答案从No更改为Yes,然后从Yes返回No。该工具明确指出要重新绘制的元素,其他DOM元素不受影响。
<强>然而强> 如果元素内部/外部维度发生了变化,甚至需要通过javascript查询,则需要重新绘制DOM元素,并重新绘制整个元素分支,然后由浏览器进行缓存。