从输入 URL 到页面打开

2021-07-07  本文已影响0人  弹力盒

1、浏览器渲染大致流程

2、生成渲染树流程(渲染树只包含可见的节点)

第一步遍历节点的时候,需要知道什么节点是不可见的

3、回流(reflow)

回流:
当 Render Tree 中部分或全部, 因元素的尺寸、布局、隐藏等改变而需要重新构建,浏览器重新渲染的过程

会导致回流的操作

一些常用且会导致回流的属性和方法

4、重绘(repaint)

重绘:
当页面中元素样式的改变并不影响b布局时(eg:color、background-color等),浏览器会将新样式赋予给元素并重新绘制它的过程

==回流必将引起重绘,重绘不一定会引起回流==

性能影响

有时即使仅仅回流一个单一的元素,它的父元素以及任何跟随它的元素也会产生回流

现代浏览器会对频繁的回流或重绘操作进行优化

浏览器会维护一个队列,把所有引起回流和重绘的操作放入队列中,如果队列中的任务数量或者时间间隔达到一个阈值的,浏览器就会将队列清空,进行一次批处理,这样可以把多次回流和重绘变成一次

当你访问以下属性或方法时,浏览器会立刻清空队列

clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
scrollIntoView()、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()

因为队列中可能会有影响到这些属性或方法返回值的操作,即使你希望获取的信息与队列中操作引发的改变无关,浏览器也会强行清空队列,确保你拿到的值是最精确的

优化重绘回流

具体体现在 CSS 和 JS 方面为

// bad
for (var i = 0; i < len; i++) {
  el.style.left = el.offsetLeft + x + "px";
  el.style.top = el.offsetTop + y + "px";
}

// good
var x = el.offsetLeft,
    y = el.offsetTop;
for (var i = 0; i < len; i++) {
  x += 10;
  y += 10;
  el.style = x + "px";
  el.style = y + "px";
}

c、尽量将需要改变DOM的操作一次完成

let box = document.getElementById("box").style;

// bad
box.color = "red";    // 重绘
box.size = "14px";    // 回流、重绘

// good
box.bord = '1px solid red'

d、对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流
e、避免频繁操作 DOM,创建一个documentFragment,在它上面应用所有 DOM 操作,最后再把它添加到文档中

DocumentFragment:

文档片段接口,表示一个没有父级文件的最小文档对象. 与 Document 最大的区别是因为 DocumentFragment 不是真实 DOM 树的一部分,它的变化不会触发 DOM 树的(重新渲染) ,且不会导致性能等问题;可以使用 document.createDocumentFragment 方法或者构造函数来创建一个空的 DocumentFragment

上一篇下一篇

猜你喜欢

热点阅读