布局(Layout/Reflow):

当渲染对象被创建并添加到树中,它们并没有位置和大小,计算这些值的过程称为layout或reflow。
Html使用基于流的布局模型,意味着大部分时间,可以以单一的途径进行几何计算。流中靠后的元素并不会影响前面元素的几何特性,所以布局可以在文档中从右向左、自上而下的进行。也存在一些例外,比如html tables。 坐标系统相对于根frame,使用top和left坐标。
布局是一个递归的过程,由根渲染对象开始,它对应html文档元素,逐级递归,为每个渲染对象计算需要的几何信息。根渲染对象的位置是0,0,它的大小是viewport-浏览器窗口的可见部分。
所有的渲染对象都有一个layout或reflow方法,同时每个渲染对象调用需要布局的children的layout方法。

1.Dirty bit 系统

为了不因为每个小变化都全部重新布局,浏览器使用一个Dirty bit系统,一个渲染对象发生了变化或是被添加了,就标记它及它的子节点为dirty——需要layout。
存在两个标识:“dirty”和“children are dirty”,"children are dirty"说明即使这个渲染对象已经渲染完了,但是它的孩子节点还需要一个layout.

2.全局和增量Layout

在整棵渲染树触发Layout时,称为全局Layout,这可能在下面这些情况下发生:
a>一个全局样式的改变,影响所有渲染对象,例如font-size的改变
b>窗口缩放
Layout也可以是增量的,这样只有标志为dirty的渲染对象会重新布局(也将导致一些额外的布局)。增量 Layout会在渲染对象dirty时异步触发,例如,当网络接收到新的内容并添加到Dom树后,新的渲染对象会添加到渲染树中。如下图5.1

3.异步和同步Layout

增量layout的过程是异步的,Firefox为增量layout生成了reflow队列,以及一个调度执行这些批处理命令。Webkit也有一个计时器用来执行增量layout-遍历树,为dirty状态的渲染对象重新布局。
另外,当脚本请求样式信息时,例如“offsetHeight”,会同步的触发增量布局。
全局的layout一般都是同步触发。
有些时候,layout会被作为一个初始layout之后的回调,比如滚动条的滚动。

4.优化

当一个layout因为resize或是渲染位置改变(并不是大小改变)而触发时,渲染对象的大小将会从缓存中读取,而不会重新计算。
一般情况下,如果只有子树发生改变,则layout并不从根开始。这种情况发生在元素自身并且不影响它周围元素,例如,将文本插入文本域(否则,每次击键都将触发从根开始的重排)。

5.Layout过程

Layout 通常有以下几个部分:
a>parent 渲染对象决定它自己的宽度
b>parent 渲染对象读取children
1)设置children渲染对象(设置它的x和y)
2)在需要时(它们当前为dirty或是处于全局layout或者其他原因)调用child渲染对象的Layout,并计算child的高度
3)parent渲染对象使用child渲染对象的累积高度,以及margin和padding的高度来设置自己的高度-这将被

parent渲染对象的parent使用,即通过child高度来定义parent高度。
4)将dirty标识设置为false
Firefox使用一个“state”对象(nsHTMLReflowState)做为参数去布局(firefox称为reflow),state包含

parent的宽度及其他内容。
Firefox布局的输出是一个“metrics”对象(nsHTMLReflowMetrics)。它包括渲染对象计算出的高度。

6.宽度的计算

渲染对象的宽度使用容器的宽度、渲染对象样式中的宽度及margin、border进行计算。例如,下面这个div的

宽度:<div style="width:50%"></div>
ebkit中宽度的计算过程是(RenderBox类的calcWidth方法):
a>容器的宽度是容器的可用宽度和0中的最大值,这里的可用宽度为:contentWidth=clientWidth()-

paddingLeft()-paddingRight(),clientWidth和clientHeight代表一个对象内部的不包括border和滑动条的

大小
b>元素的宽度指样式属性width的值,它可以通过计算容器的百分比得到一个绝对值,加上水平方向上的

border和padding。到这里是最佳宽度的计算过程,现在计算宽度的最大值和最小值,如果最佳宽度大于最大

宽度则使用最大宽度,如果小于最小宽度则使用最小宽度。最后缓存这个值,当需要layout但宽度未改变时

使用。

7.折行

当一个渲染对象在布局过程中需要折行时,则暂停并告诉它的parent它需要折行,parent将创建额外的渲染对象并调用它们的layout。

转载于:https://www.cnblogs.com/suncoolcat/p/3313315.html

浏览器是如何工作的系列:页面布局相关推荐

  1. 浏览器是如何工作的系列:渲染引擎

    渲染引擎的功能就是渲染,在浏览器上显示请求的内容. 默认情况下,渲染引擎可以显示HTML和XML文档和图像.他也可以显示其他类型的插件(浏览器扩展).例如显示PDF使用PDF浏览器插件. 我们将用一个 ...

  2. Android 页面布局xd,Adobe XD强大的布局系列工具 助你事半功倍

    数字设计有多种形式-从移动端.桌面网站到显示屏应用程序.智能助手.车载娱乐系统(例如CarPlay和Android Auto)等等.为当今的应用程序打造数字体验意味着需要针对各种屏幕尺寸.布局和交互类 ...

  3. android界面布局错位,IOS 浏览器页面布局错位(如:点不到)的分析与解决

    IOS 浏览器页面布局错位(如:点不到)的分析与解决 IOS 浏览器软键盘的拉起与收缩.微信 IOS 浏览器底部导航条的显示与隐藏,很容易导致页面布局错位(相对窗体的绝对定位元素): 明明按钮在这里, ...

  4. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  5. 浏览器放大缩小,页面布局不变,浏览器放大百分比,页面放大到左上角,浏览器缩小百分比,页面缩小至中间(类似csdn官网效果)

    效果如下: 加了红色边框的就是你实际的xxx.vue页面,放大时放大至页面左上角,缩小时,缩小至中间 这是浏览器最小化后 一.给App.vue设置minWidth.minHeight.maxWidth ...

  6. 【秃头系列】-【本科生毕设论文格式Word】自动生成页面布局

    文章目录 01 - 页面布局 02 - 如何自动生成 2.1 - 格式约定 2.1 - 设置页边距 2.2 - 设置页眉 2.3 - 设置页脚 2.3 - 善后操作 03 - 操作GIF 3.1 - ...

  7. CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  8. 计算机页面布局与文档打印,Excel 2013中工作表的页面设置与打印——想象力电脑应用...

    工作表制作完成之后,很多时候还需要将工作表打印出来,在打印工作表之前一般需要先进行页面设置,并通过打印预览查看效果是否满意,当设置的效果达到所需要的效果后再进行打印. 一.页面设置 通过页面设置可以使 ...

  9. Ext Js MVC系列二 利用Application和Viewport进行应用程序初始化和页面布局

    通过上一篇我们已经对Ext js MVC框架开发有了一个大概的了解,这一篇将利用Application和Viewport进行应用程序的初始化和页面布局.我想从以下几方面来进行总结. 1,通过Ext.L ...

最新文章

  1. 腾讯云视频流量服务器,腾讯云服务器有流量限制吗
  2. 用Python爬取WordPress官网所有插件
  3. 9path 导致的一场冤假错案
  4. php创建压缩文件 保存路径,通过php生成zip压缩文件,支持文件和压缩包路径查找...
  5. stream进行分组统计
  6. c语言选择法排序案例,谁能给我一个c语言选择排序法的简单例子
  7. 树:二叉树的层序遍历算法(超简洁实现及详细分析)
  8. numpy教程:随机数模块numpy.random
  9. java实训小结_java实训心得体会(精选4篇)
  10. 闪字在线制作php源码,闪光字图片制作 在线制作图片加闪光字
  11. mysql导入大量数据时jbd2 io过高效率低下问题
  12. 华东理工大学计算机专业研究生,华东理工大学硕士研究生培养方案计算机科学与技术一级学科(学科代码:0812)信息科学与工程学院...
  13. 【vue3.0学习】父传子 子传父
  14. 面向对象的一些概念及举例说明
  15. 老刘说NLP:这几年的NLP历程回顾,以及关于NLP(知识图谱等)落地的思考
  16. 《STL源码剖析》-- stl_map.h
  17. Bt(宝塔面板)安装wordpress以及如何开启最简单实用的动静分离优化
  18. Hexo站点SEO优化攻略
  19. No interface expected here
  20. appium android数字字母切换键,Android自定义键盘:数字键盘和字母键盘

热门文章

  1. Python 语言程序设计(3-1)字符串处理函数和相关功能
  2. 北京大学生物信息学(转录组)
  3. mysql语句中多表查询_6.MySql中的SQL语句(五):多表查询
  4. 北京理工大学计算机学院杨晨,杨旭_北京理工大学计算机学院
  5. mysql innodb启动失败_关于mysql innodb启动失败无法重启的处理方法讲解
  6. 运筹优化(十一)--无约束非线性规划
  7. WFDB软件包简介——ECG数据在Matlab下的读取/显示方法
  8. C语言:输入一个华氏温度f,计算并输出对应的摄氏温度。计算摄氏温度的公式为:c=5/9*(f-32),输出取两位小数。
  9. php助理工作内容,生产助理的工作职责
  10. 小学计算机课教学工作总结,小学六年级信息技术教学工作总结