当渲染树中部分或全部元素的尺寸、结构、边距等某些属性发生改变时,浏览器重新渲染部分或者全部文档的过程
导致回流的操作:
当元素的一部分属性发生变化,如color、background-color、visibility等,不会影响元素在文档流中的位置,不需要重新渲染,浏览器只是将新样式赋给元素并重新绘制它
var s = document.body.style;
s.padding = "2px"; // 回流+重绘
s.border = "1px solid red"; // 再一次 回流+重绘
s.color = "blue"; // 再一次重绘
s.backgroundColor = "#ccc"; // 再一次 重绘
s.fontSize = "14px"; // 再一次 回流+重绘
// 添加node,再一次 回流+重绘
document.body.appendChild(document.createTextNode(‘abc!‘));
浏览器应对机制:队列中的操作到了一定的数量或者到了一定的时间间隔,就会flush队列,进行批量处理。
var docFragm = document.createDocumentFragment();
var elem, contents;
for(var i = 0; i < textlist.length; i++) {
elem = document.createElement(‘p‘);
contents = document.createTextNode(textlist[i]);
elem.appendChild(contents);
docFragm.appendChild(elem);
}
document.body.appendChild(docFragm);
var original = document.getElementById(‘container‘);
var cloned = original.cloneNode(true);
cloned.setAttribute(‘width‘, ‘50%‘);
var elem, contents;
for(var i = 0; i < textlist.length; i++) {
elem = document.createElement(‘p‘);
contents = document.createTextNode(textlist[i]);
elem.appendChild(contents);
cloned.appendChild(elem);
}
//先复制,再进行替代
original.parentNode.replaceChild(cloned, original);
使用cloneNode()要注意的是,唯一的参数代表是否进行深复制。另外cloneNode()无法复制事件监听函数,以及表单控件的value。
又比如获取offsetWidth,getComputedStyle()这些取值操作每次都会触发reflow,在第一次调用时存起来也是复制的一种。
CSS:
javascript:
回流一定产生重绘,重绘不一定产生回流
原文:https://www.cnblogs.com/vera-7c/p/13045692.html