渲染的流程基本上是这样(以下图黄色的四个步骤):1.计算CSS样式 2.构建Render Tree 3.Layout – 定位坐标和大小 4.正式开画浏览器
这里重要要说两个概念,一个是Reflow,另外一个是Repaintbash
回流一定会发生重绘,重绘不必定会引起回流。重绘和回流会在咱们设置节点样式时频繁出现,同时也会很大程度上影响性能。回流所需的成本比重绘高的多,改变父节点里的子节点极可能会致使父节点的一系列回流。ide
任何会改变元素几何信息(元素的位置和尺寸大小)的操做,都会触发回流,布局
添加或者删除可见的DOM元素; 元素尺寸改变——边距、填充、边框、宽度和高度 内容变化,好比用户在input框中输入文字 浏览器窗口尺寸改变——resize事件发生时 计算 offsetWidth 和 offsetHeight 属性 设置 style 属性的值性能
for(let i = 0; i < 1000; i++) {
// 获取 offsetTop 会致使回流,由于须要去获取正确的值
console.log(document.querySelector('.test').style.offsetTop)
}
复制代码
不要使用 table 布局,可能很小的一个小改动会形成整个 table 的从新布局动画
动画实现的速度的选择,动画速度越快,回流次数越多,也能够选择使用 requestAnimationFrameui
CSS 选择符从右往左匹配查找,避免节点层级过多spa
将频繁重绘或者回流的节点设置为图层,图层可以阻止该节点的渲染行为影响别的节点。好比对于 video 标签来讲,浏览器会自动将该节点变为图层。code