以上属性和要领都必要返回最新的机关信息,因此赏识器不得不清空行列,触发回流重绘来返回正确的值。因此,我们在修改样式的时辰,最好停止行使上面列出的属性,他们城市革新渲染行列。假如要行使它们,最好将值缓存起来。
镌汰回流和重绘
好了,到了我们本日的重头戏,前面说了这么多配景和理论常识,接下来让我们谈谈怎样镌汰回流和重绘。
最小化重绘和重排
因为重绘和重排也许价钱较量昂贵,因此最好就是可以镌汰它的产生次数。为了镌汰产生次数,我们可以归并多次对DOM和样式的修改,然后一次处理赏罚掉。思量这个例子
- const el = document.getElementById('test');
- el.style.padding = '5px';
- el.style.borderLeft = '1px';
- el.style.borderRight = '2px';
例子中,有三个样式属性被修改了,每一个城市影响元素的几许布局,引起回流。虽然,大部门当代赏识器都对其做了优化,因此,只会触发一次重排。可是假如在旧版的赏识器可能在上面代码执行的时辰,有其他代码会见了机关信息(上文中的会触发回流的机关信息),那么就会导致三次重排。
因此,我们可以归并全部的改变然后依次处理赏罚,好比我们可以采纳以下的方法:
- const el = document.getElementById('test');
- el.style.cssText += 'border-left: 1px; border-right: 2px; padding: 5px;';
- const el = document.getElementById('test');
- el.className += ' active';
批量修改DOM
当我们必要对DOM对一系列修改的时辰,可以通过以下步调镌汰回流重绘次数:
- 使元素离开文档流
- 对其举办多次修改
- 将元素带回到文档中。
该进程的第一步和第三步也许会引起回流,可是颠末第一步之后,对DOM的全部修改都不会引起回流重绘,由于它已经不在渲染树了。
有三种方法可以让DOM离开文档流:
- 潜匿元素,应用修改,从头表现
- 行使文档片断(document fragment)在当前DOM之外构建一个子树,再把它拷贝回文档。
- 将原始元素拷贝到一个离开文档的节点中,修改节点后,再替代原始的元素。
思量我们要执行一段批量插入节点的代码:
- function appendDataToElement(appendToElement, data) {
- let li;
- for (let i = 0; i < data.length; i++) {
- li = document.createElement('li');
- li.textContent = 'text';
- appendToElement.appendChild(li);
- }
- }
- const ul = document.getElementById('list');
- appendDataToElement(ul, data);
假如我们直接这样执行的话,因为每次轮回城市插入一个新的节点,会导致赏识器回流一次。
我们可以行使这三种方法举办优化:
潜匿元素,应用修改,从头表现
这个会在展示和潜匿节点的时辰,发生两次回流
- function appendDataToElement(appendToElement, data) {
- let li;
- for (let i = 0; i < data.length; i++) {
- li = document.createElement('li');
- li.textContent = 'text';
- appendToElement.appendChild(li);
- }
- }
- const ul = document.getElementById('list');
- ul.style.display = 'none';
- appendDataToElement(ul, data);
- ul.style.display = 'block';
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|