了解重绘和重排吗,知道怎么去减少重绘和重排吗,让文档脱离文档流有哪些方法
var div = document.querySelector('.div'); div.style.width = '200px'; div.style.background = 'red'; div.style.height = '300px';在新版本的浏览器中,本应出现两次的重排,被合并成为了一次。
// css .active { padding: 5px; border-left: 1px; border-right: 2px; } // javascript var el = document.querySelector('.el'); el.className = 'active';
批量修改DOM元素的核心思想是:
具体方法:
当访问诸如offsetLeft,clientTop这种属性时,会冲破浏览器自有的优化,应该尽量减少对布局信息的查询次数,查询时,将其赋值给局部变量,使用局部变量参与计算。
可以参考这篇文章:
任何会改变元素的位置和尺寸大小的操作,都会触发重排。常见的例子如下:
几何属性:包括布局、尺寸等可用数学几何衡量的属性。
获取布局信息的属性如下:
看到这里有的人可能会疑惑,我们只是获取这些属性值,并没有改变它,为什么会触发重排?
现代的浏览器都是很聪明的,由于每次重排都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。浏览器会将修改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列。但是!当你获取布局信息的操作的时候,会强制清空队列,因为队列中,可能会有影响到这些值的操作,为了给我们最精确的值,浏览器会立即重排+重绘。
所以我们应避免频繁使用上述的属性。