浏览器采用流式布局模型(Flow Based Layout)
浏览器会把 HTML 解析成 DOM,把 CSS 解析成 CSSOM,DOM 和 CSSOM 合并就产生了渲染树(Render Tree)。
有了 RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。
由于浏览器使用流式布局,对 Render Tree 的计算通常只需要遍历一次就可以完成,但 table 及其内部元素除外,他们可能需要多次计算,通常要花3 倍于同等元素的时间,这也是为什么要避免使用 table 布局的原因之一。
HTML
table
布局,可能很小的一个小改动会造成整个 table
的重新布局。CSS
position
属性为 absolute
或 fixed
的元素上,避免影响其他元素的布局,这样只是一个重绘,而不是回流,同时,控制动画速度可以选择 requestAnimationFrame
。calc()
)。transform: translateZ(0)
)JS
<body>
<div id="box">文字内容</div>
<script>
var box = document.getElementById("box");
// box.style.width='100px';
// box.style.height="100px";
// box.style.backgroundColor='red';
box.style.cssText += "width:100px;height:100px;background-color:red";
</script>
</body>
<style>
.box {
width: 100px;
height: 100px;
background-color: red;
}
</style>
<body>
<div id="box">文字内容</div>
<script>
var box = document.getElementById("box");
box.className = "box";
</script>
</body>
<body>
<div id="box"></div>
<script>
var box = document.getElementById("box");
var fragment = document.createDocumentFragment(); //创建虚拟的节点对象
for (var i = 0; i < 10; i++) {
var span = document.createElement("span");
span.index = i;
span.style.display = "inline-block";
span.style.width = "20px";
span.style.height = "20px";
span.style.backgroundColor = "red";
span.innerText = span.index;
fragment.appendChild(span);
}
box.appendChild(fragment);
</script>
</body>
display: none
,操作结束后再把它显示出来。