浏览器衬着的那些事(三)

终究到了规划的部分了!

规划

当衬着对象被建立并增加到树中,是没有位置和大小的,盘算这些值的历程称为layout或reflow。
规划是一个递归历程,由根衬着对象最先,对应html文档元素,规划继承递归的经由过程一些或一切的frame层级,为每一个须要多少信息的衬着对象举行盘算。跟衬着对象位置是0,0。一切衬着对象都有一个layout或reflow要领,每一个衬着对象挪用须要规划的children的layout要领。
浏览器会对发作变化的显现器以及其子代标注为”dirty”,示意须要举行layout
标记分为两种:”dirty”和”children are dirty”。
“children are dirty”示意只管显现器自身没有变化,但它至少有一个子代须要规划。
这里须要申明一下重排reflow和重绘repaint。

重排 reflow

当转变影响到文本内容、构造或元素位置时,就会发作重排。
一般有以下事宜触发:

  • 网页初始化时

  • DOM操纵(元素增加、删除、修正、元素递次变化)

  • 内容变化,包含表单域内文本转变

  • CSS属性的盘算或转变

  • 增加或删除款式表

  • 变动“类”属性

  • 浏览器窗口的缩放、转动等

  • 伪类激活(比方:hover悬停)

重绘 repaint

转变不会影响元素的位置及大小的款式时,则会触发重绘。换句话说,元素转变表面时会触发这个行动,不包含修正元素的多少属性。比方background,visibility。

异步layout和同步layout

异步layout,简朴来讲,就是指浏览器为了尽量削减reflow和repaint的操纵,而将这些操纵积累起来,再统一做一次reflow。
什么时候会发生同步layout呢?
比方resize窗口、转变页面默许字体时,或者是剧本作出以下要求:

  • offsetTop, offsetLeft, offsetWidth, offsetHeight

  • scrollTop/Left/Width/Height

  • clientTop/Left/Width/Height

  • IE中的 getComputedStyle(), 或 currentStyle
    那末浏览器须要马上layout以返回最新的值。

layout历程

  1. parent衬着对象决议宽度

  2. parent衬着对象读取children,设置其x,y;在须要时【标记为dirty或全局layout等】挪用child衬着对象的layout,盘算child高度;parent运用child的积累高度,以及margin和padding的高度来设置本身的高度;末了将dirty标志设置为false

绘制

和规划一样,绘制也可所以全局的——绘制完全的树——或增量的。在增量的绘制历程当中,一些衬着对象以不影响整棵树的体式格局转变,转变的衬着对象使其在屏幕上的矩形地区失效,这将致使操纵系统将其看做dirty地区,并发生一个paint事宜,操纵系统很奇妙的处置惩罚这个历程,并将多个地区合并为一个。Chrome中,这个历程更庞杂些,由于衬着对象在差别的历程中,而不是在主历程中。Chrome在肯定程度上模仿操纵系统的行动,表现为监听事宜并派发消息给衬着根,在树中查找到相干的衬着对象,重绘这个对象(往往还包含它的children)。

绘制递次

一个块衬着对象的客栈递次是:

  1. 背景色

  2. 背景图

  3. border

  4. children

  5. outline

【待更新】
参考文献:

  1. 浏览器内部事情道理

  2. 浏览器的衬着道理简介

  3. How browsers work

  4. 有关网页衬着,每一个前端开发者都该晓得的那点事

  5. 前端文摘:深切剖析浏览器的幕后事情道理

  6. MDN:Style System Overview

    原文作者:lsxj
    原文地址: https://segmentfault.com/a/1190000005598925
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞