浏览器渲染原理解析

作者:贝程学院

浏览器内核分为两部分:渲染引擎(Layout Engine 或者 Rendering Engine)和 JS 引擎。早期渲染引擎和 JS 引擎并没有明显区分,随着 JS 引擎越来越独立,内核逐渐变成了渲染引擎的代名词。渲染引擎包括:

  • HTML 解释器
  • CSS 解释器
  • 布局
  • 网络
  • 存储
  • 图形
  • 音视频
  • 图片解码器
  • 等等

渲染引擎简介

浏览器——Firefox、Chrome和Safari是基于两种渲染引擎构建的,Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safari和Chrome都使用webkit。

Webkit是一款开源渲染引擎,它本来是为Linux平台研发的,后来由Apple移植到Mac及Windows上

一.基本概念

  1. DOM:Document Object Model,浏览器将HTML解析成树形的数据结构,简称DOM。
  2. CSSOM:CSS Object Model,浏览器将CSS解析成树形的数据结构,简称CSSOM。
  3. Render Tree: DOM和CSSOM合并后生成Render Tree。
  4. Layout: 计算出Render Tree每个节点的具体位置。
  5. Painting:通过显卡,将Layout后的节点内容分别呈现到屏幕上。

二.浏览器页面渲染和浏览器工作过程

页面渲染是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的过程。

了解浏览器的基本工作过程:

  1. 用户输入网址(假设是html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
  3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件; 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
  4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
  5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
  7. 浏览器发现了一个包含一行Java代码的<>标签,赶快运行它;
  8. Java脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码; 终于等到了</html>的到来,浏览器泪流满面……
  9. 等等,还没完,用户点了一下界面中的“换肤”按钮,Java让浏览器换了一下<link>标签的CSS路径;
  10. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面 。

三.渲染引擎的两个主要工作过程:解析过程和渲染过程

A.浏览器解析过程

  1. 浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、Images等等)。
  2. HTML 文件加载后,开始构建 DOM Tree
  3. CSS 样式文件加载后,开始解析和构建 CSS Rule Tree
  4. Java 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree

解析一个文档即将其转换为具有一定意义的结构——编码可以理解和使用的东西。解析的结果通常是表达文档结构的节点树,称为解析树或语法树。

B.浏览器渲染过程

  1. 浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree,Rendering Tree 并不与 DOM Tree 对应,比如像标签内容或带有 display: none; 的元素节点并不包括在 Rendering Tree 中 。
  2. 通过 CSS Rule Tree 匹配 DOM Tree 进行定位坐标和大小,是否换行,以及 position、overflow、z-index 等等属性,这个过程称为 Flow 或 Layout 。
  3. 最终通过调用Native GUI 的 API 绘制网页画面的过程称为 Paint 。

三.渲染过程中涉及到的树

  • DOM 树:解析 HTML 以创建的是 DOM 树(DOM tree ):渲染引擎开始解析 HTML 文档,转换树中的标签到 DOM 节点,它被称为“内容树”。
  • CSSOM 树:解析 CSS(包括外部 CSS 文件和样式元素)创建的是 CSSOM 树。CSSOM 的解析过程与 DOM 的解析过程是并行的。
  • 渲染树:CSSOM 与 DOM 结合,之后我们得到的就是渲染树(Render tree )。
  • 布局渲染树:从根节点递归调用,计算每一个元素的大小、位置等,给每个节点所应该出现在屏幕上的精确坐标,我们便得到了基于渲染树的布局渲染树(Layout of the render tree)。
  • 绘制渲染树: 遍历渲染树,每个节点将使用 UI 后端层来绘制。整个过程叫做绘制渲染树(Painting the render tree)。

四.渲染树和Dom树的关系

在DOM树构建的同时,浏览器会构建渲染树(render tree)。渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer。渲染器是在文档解析和创建DOM节点后创建的,会计算DOM节点的样式信息。

在webkit中,renderer是由DOM节点调用attach()方法创建的。attach()方法计算了DOM节点的样式信息。attach()是自上而下的递归操作。也就是说,父节点总是比子节点先创建自己的renderer。销毁的时候,则是自下而上的递归操作,也就是说,子节点总是比父节点先销毁。

渲染对象和Dom元素对应关系不是一对一的,不可见的Dom元素不会被插入渲染树,例如head元素。另外,display属性为none的元素也不会在渲染树中出现(visibility属性为hidden的元素将出现在渲染树中)。

还有一些Dom元素对应几个可见对象,它们一般是一些具有复杂结构的元素,无法用一个矩形来描述。例如,select元素有三个渲染对象——一个显示区域、一个下拉列表及一个按钮。同样,当文本因为宽度不够而折行时,新行将作为额外的渲染元素被添加。另一个多个渲染对象的例子是不规范的html,根据css规范,一个行内元素只能仅包含行内元素或仅包含块状元素,在存在混合内容时,将会创建匿名的块状渲染对象包裹住行内元素。

一些渲染对象和所对应的Dom节点不在树上相同的位置,例如,浮动和绝对定位的元素在文本流之外,在两棵树上的位置不同,渲染树上标识出真实的结构,并用一个占位结构标识出它们原来的位置。

DOM树和渲染树的对应关系如下图:

五 . 为什么了解浏览器渲染原理/机制

页面为什么会慢?因为浏览器要花时间、花精力去渲染,尤其是当它发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,这个回退过程叫reflow。

reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,它们都彼此相互影响着。

所以有必要了解浏览器的渲染原理:

  • 了解浏览器加载过程,前端开发在引用外部style文件和外部JS时,将它们放到合适的位置,浏览器可以以最快的速度,将文件加载完毕;
  • 了解浏览器解析过程/原理,前端开发人员可以在构建DOM结构,组织CSS选择器的时候,选择最优的写法,提高浏览器的解析速率;
  • 了解浏览器渲染过程,明白渲染的过程,前端开发在设置元素属性,编写JS文件时,可以减少“重绘”,“重新布局”的消耗。

了解浏览器渲染原理/机制目的是为了性能优化

六.如何减少回流和重绘

1.重绘(Repaint)和回流(Reflow)

当第一次打开一个页面时,至少会有一次重绘和回流。之后,如果渲染树发生了变动,那么可能会触发重绘或回流中的一个或二者。

如果渲染树的结点发生了结构性变化,例如宽度、高度或者位置上的变化时,那么会触发Reflow(回流)的逻辑。我们第一次进入一个页面时便会至少触发一次这个逻辑。

如果渲染树结点发生了非结构性变化,例如背景色等的变化时,那么会触发Repaint(重绘)的逻辑。

2.重绘(Repaint)和回流(Reflow)的区别

  • Repaint ——改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。
  • Reflow ——元件的几何尺寸变了,我们需要重新验证并计算Render Tree。是Render Tree的一部分或全部发生了变化。
  • reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。
  • 注:display:none会触发reflow,而visibility:hidden只会触发repaint,因为没有发现位置变化。

3.如何降低Reflow对性能的影响

  • 批量修改DOM 样式。预先定义好 css 的 class,只要修改 DOM 的 className,即将多次改变样式属性的操作合并为一次操作:
  • ”离线处理”需要操作的元素,处理完成后一起更新。(使用DocumentFragment进行缓存操作,引发一次回流和重绘;使用display:none技术,引发两次回流和重绘;)
  • 不要用tables布局。因为tables中某个元素一旦触发reflow就会导致table里所有元素reflow。在使用table的场景中,设置table-layout为auto或fixed,目的是让table助逐行渲染,还有就是限制了reflow的影响范围。
  • css中不使用表达式expression
  • 降低频繁增加,修改,删除元素的次数,因为这种操作会频繁的引起页面reflow,可以先将该dom节点抽离到内存中进行复杂的操作然后再display到页面上。
  • 请求offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,会引起浏览器会reflow,建议将它们合并到一起操作,可以减少回流的次数。

原文地址:https://www.cnblogs.com/beichengjiaoyu/p/11641352.html

时间: 2024-10-19 08:38:08

浏览器渲染原理解析的相关文章

React 服务器渲染原理解析与实践

第1章 服务器端渲染基础本章主要讲解客户端与服务器端渲染的概念,分析客户端渲染和服务器端渲染的利弊,带大家对服务器端渲染有一个粗浅认识. 1-1 课程导学1-2 什么是服务器端渲染1-3 什么是客户端渲染1-4 React 客户端渲染的优势与弊端第2章 React中的服务器端渲染本章将借助Node.js,Webpack等工具的帮助,带大家实现一个非常基础的基于React.js技术栈的服务器端渲染模型,过程中还会讲解虚拟DOM与服务器端渲染的内在联系. 2-1 在服务器端编写 React 组件2-

浏览器渲染原理--reflow

Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都是怎么干活的:1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件:2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件:3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件:4.

浏览器渲染原理及流程

我们可能都知道浏览器含有一个渲染引擎,用来渲染窗口所展示的内容.默认情况下,渲染引擎可以显示html.xml文档及图片,它也可以借助插件(一种浏览器扩展)显示其他类型数据,例如使用PDF阅读器插件,用于显示PDF格式.但是其具体的渲染原理和流程估计也有很多人都不知道或者不清楚吧.这些天研究了一下浏览器的渲染原理,有了些心得,在这里跟大家分享一下,这里只讨论渲染引擎最主要的用途--显示应用了CSS之后的html及图片. 渲染引擎简介 本文所讨论的浏览器--Firefox.Chrome和Safari

浏览器渲染原理的个人整理

近年来,随着各种virtual dom的技术大行其道,越来越多新入行的同学对于dom的概念,乃至浏览器渲染的知识的了解和熟悉程度都越来越低了,当然,毕竟浏览器渲染牵涉到内容广大而深远,不同浏览器的策略又不完全相同,但是近来团队里的童鞋频繁遇到了动效实现的具体方式上选择的困扰,于是笔者从前到后梳理了一下有关的知识点,只是没想到不理不知道,一理吓一跳,整个过程感觉自己也有了很多新的收获,真可谓温故而知新. 首先是大家都熟悉的一张传统的浏览器渲染流程图,图来源为耗子叔的blog,笔者最开始入门的时候也

浏览器渲染原理

浏览器输入url到页面呈现发生了什么? 1:输入url 浏览器会开启一个线程来处理这个请求,对URL分析判断如果是http协议就按照Web方式来处理,浏览器会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址.对于 google的chrome 的浏览器,他甚至会直接从缓存中把网页展示出来. 2:域名解析 通过DNS解析获取网址的IP地址, IP 地址:IP 协议为互联网上的每一个网络和每一台主机分配的一个逻辑地址.IP 地址如同门牌号码,通过

【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创建的,会计算DOM节点的样式信息. 在webkit中,renderer是由DOM节点调用attach()方法创建的.attach()方法计算了DOM节点的样式信息.attach()是自上而下的递归操作.也就是说,父节点总是比子节点先创建自己的renderer.销毁的时候,则是自下而上的递归操作,也就

不同内核的浏览器,以及渲染原理

一. "Rendering Engine"渲染引擎,也可以叫做浏览器内核(这个部分要扩展一下,原本的浏览器内核分为渲染引擎和Js引擎,后来Js引擎越来越独立,内核就倾向于只指渲染引擎了),是浏览器最核心的部分,浏览器内核的不同对于网页的语法解释会有不同,所以渲染出来的效果也不同,简单说就是不同的内核决定了浏览器如何显示页面,也是因为这个原因导致了浏览器兼容性问题的出现. 下面是5种浏览器分别采用的不同引擎: - IE内核 Trident- 谷歌内核 WebKit / Blink(由we

浏览器渲染

浏览器渲染原理简介 2014年8月30日 0:40 看到这个标题大家一定会想到这篇神文<How Browsers Work>,这篇文章把浏览器的很多细节讲得很细,而且也被翻译成了中文.为什么我还想写一篇呢?因为两个原因, 这篇文章太长了,阅读成本太大,不能一口气读完. 花了大力气读了这篇文章后可以了解很多,但似乎对工作没什么帮助. 所以,我准备写下这篇文章来解决上述两个问题.希望你能在上班途中,或是坐马桶时就能读完,并能从中学会一些能用在工作上的东西. 浏览器工作大流程 废话少说,先来看个图:

不同内核浏览器的差异以及浏览器渲染(转)

一.简单介绍一下什么是浏览器内核. 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“解释引擎”,不过我们一般习惯将之称为“浏览器内核”.负责对网页语法的解释(如HTML.JavaScript)并渲染(显示)网页. 所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息.不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核