这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【浏览器如何渲染页面?】

一、背景介绍
浏览器是前端工程师或页面重构师工作中必不可少的,WEB页面运行在各种各样的浏览器当中,浏览器载入、渲染页面的速度直接影响着用户体验,特别是浏览器渲染页面的原理,页面渲染就是浏览器将HTML代码根据CSS定义的规则显示在浏览器窗口中的这个过程,理解了原理就更会容易理解前端优化的一些准则。

二、知识剖析
2.1 reflow(回流)

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

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

2.2 repaint(重绘)

如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint(重绘)。repaint的速度明显快于reflow(在IE下需要换一下说法,reflow要比repaint更缓慢)。

下面是一个打开Wikipedia时的Layout/reflow的视频(注:HTML在初始化的时候也会做一次reflow,叫intial reflow),你可以感受一下:视频

三、常见问题
浏览器如何渲染页面?

四、解决方案
4.1浏览器工作大流程

先看图

1)浏览器会解析三个东西:

一个是HTML/SVG/XHTML,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。

CSS,解析CSS会产生CSS规则树。

Javascript,脚本,主要是通过DOM API(Application Programming Interface)和CSSOM(CSS对象模型) API来操作DOM Tree和CSS Rule Tree.

2)解析完成后,浏览器引擎会通过DOM Tree和CSS Rule Tree来构造Rendering Tree。注意:

Rendering Tree渲染树并不等同于DOM树,因为一些像Header或display:none的东西就没必要放在渲染树中了。CSS的Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。然后,计算每个Frame(也就是每个Element)的位置,这又叫layout和reflow过程。

3)最后通过调用操作系统Native GUI的API绘制。

4.2 DOM解析

上面这段HTML会解析成这样:

下面是另一个有SVG标签的情况:

4.3 CSS解析

CSS的解析大概是下面这个样子(下面主要说的是Firefox的玩法),假设我们有下面的HTML文档:

于是DOM Tree是这个样子

然后我们的CSS文档是这样的:

/ rule 1 / doc { display: block; text-indent: 1em; }

/ rule 2 / title { display: block; font-size: 3em; }

/ rule 3 / para { display: block; }

/ rule 4 / [class="emph"] { font-style: italic; }

于是我们的CSS Rule Tree会是这个样子:

注意:CSS匹配HTML元素是一个相当复杂和有性能问题的事情。所以,你就会在N多地方看到很多人都告诉你,DOM树要小,CSS尽量用id和class,千万不要过渡层叠下去,……

通过这两个树,我们可以得到一个叫Style Context Tree,也就是下面这样(把CSS Rule结点Attach到DOM Tree上):

所以,Firefox基本上来说是通过CSS解析 生成CSS Rule Tree,然后,通过比对DOM生成Style Context Tree,然后Firefox通过把Style Context Tree和其Render Tree(Frame Tree)关联上,就完成了。注意:Render Tree会把一些不可见的结点去除掉。而Firefox中所谓的Frame就是一个DOM结点,不要被其名字所迷惑了。

4.4渲染

渲染的流程基本上如下(黄色的四个步骤):

1)计算CSS样式;2)构建Render Tree;3)Layout –定位坐标和大小,是否换行,各种position, overflow, z-index属性……;4)正式开画;

注意:上图流程中有很多连接线,这表示了Javascript动态修改了DOM属性或是CSS属会导致重新Layout,有些改变不会,就是那些指到天上的箭头,比如,修改后的CSS rule没有被匹配到,等。

5.编码实战
详见视频

点击这里

六、扩展思考
1.影响页面渲染速度主要因素有哪些?

reflow(回流)和repaint(重绘)

2.哪些情况下会导致reflow发生?

改变窗囗大小;改变文字大小;添加/删除样式表;内容的改变,如用户在输入框中敲字;激活伪类,如:hover (IE里是一个兄弟结点的伪类被激活);操作class属性;脚本操作DOM;计算offsetWidth和offsetHeight;设置style属性。

3.如何避免reflow(回流)?

reflow是不可避免的,只能将reflow对性能的影响减到最小。

1.尽可能限制reflow的影响范围。需要改变元素的样式,不要通过父级元素影响子元素。最好直接加在子元素上。

2.通过设置style属性改变结点样式的话,每设置一次都会导致一次reflow。所以最好通过设置class的方式。

3.减少不必要的DOM层级(DOM depth)。改变DOM树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行reflow上面。

4.避免不必要的复杂的CSS选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的CPU。

七、参考文献
参考一:浏览器的渲染原理简介

参考二:为什么每个前端开发者都要理解网页渲染?

八、更多讨论
1.提高浏览器性能的方法还有哪些?

2.浏览器的主要功能有哪些?

3.哪款浏览器的综合性能最优?

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。

这里是技能树.IT修真院:http://www.jnshu.com,初学者转行到互联网行业的聚集地。"

欢迎加IT交流群565734203与大家一起讨论交流

浏览器如何渲染页面?相关推荐

  1. 浏览器如何渲染页面? 1

    这里是修真院前端小课堂,本篇分析的主题是 [浏览器如何渲染页面?] 每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端 ...

  2. 从渲染页面的角度来聊一聊浏览器的工作原理

    从渲染页面的角度来聊一聊浏览器的工作原理 页面内容快速加载和流畅的交互是用户希望得到的Web体验,因此,开发者应力争实现这两个目标. 了解如何提升性能和感知性能,有助于了解浏览器的工作原理. 概述 快 ...

  3. JS高级 之 深入浏览器的渲染原理

    在浏览器中输入网址按回车后发生了什么, 其实,发生的事情很简单,主要有三大步 找到资源 下载资源 解析资源渲染到页面 目录 一.DNS解析,找到资源 1. 查询浏览器缓存 2. 查询操作系统缓存 4. ...

  4. day002-HTML知识点总结:浏览器兼容性之指定IE浏览器使用chrome内核渲染页面

    今天再浏览大淘宝首页时,突然看到这么一个东东: ,顿时好费解,莫非万恶的IE浏览器认识到自己以往的罪孽,开始兼容chrome了??! 于是本着不懂就百度的神精,开始纵横于各大铁耙,勃哥,终于找到了许许 ...

  5. div置于页面底部_浏览器渲染页面的原理及流程

    浏览器渲染页面的原理及流程 浏览器将域名通过网络通信从服务器拿到html文件后,如何渲染页面呢? 1.根据html文件构建DOM树和CSSOM树.构建DOM树期间,如果遇到JS,阻塞DOM树及CSSO ...

  6. 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘

    一.浏览器渲染页过程描述   1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...

  7. vuex中的值变化 页面重新渲染_浅谈浏览器的渲染过程,重绘与回流

    浏览器的渲染过程 首先,我们先来了解一下浏览器的渲染过程是什么样的,也就是说浏览器把一堆代码呈现到页面上的过程是什么样子的,浏览器采用流式布局模型(Flow Bsaed Layout),根据下图,我们 ...

  8. 多个html页面拼接成一个页面_浏览器渲染页面机制以及如何减少DOM操作

    为了能更好.更快的为用户呈现出他们想要的页面,基于浏览器的渲染机制,我们在开发中应该了解浏览器,了解浏览器的运行机制,以及在开发中我们能更好的提高性能,虽然现在市面上流行的VUE和react,但也应该 ...

  9. 浏览器渲染页面的原理及流程---------重绘与重排(回流)--优化

    浏览器渲染页面的原理及流程 浏览器将域名通过网络通信从服务器拿到html文件后,如何渲染页面呢? 1.根据html文件构建DOM树和CSSOM树.构建DOM树期间,如果遇到JS,阻塞DOM树及CSSO ...

最新文章

  1. 《Linux内核设计与实现》读书笔记(七)- 中断处理【转】
  2. [git/svn]Git和SVN差异
  3. docker 在容器外执行某个容器内的某个命令
  4. 《HTML5多媒体应用开发》——第2章 HTML5多媒体元素2.1 Web多媒体历史
  5. perf script 执行时间_在Python中准确地测量代码执行时间
  6. Linux使用sendmail发送邮件
  7. 代码片段---重定向
  8. java常量 修改_Java 自定义常量
  9. Zabbix报告无交换内存主机“Lack of free swap space”问题解决
  10. Java实现若干个数计算平均值并保留小数位 java计算平均值 java四舍五入保留小数
  11. Logstash 原理分析/配置文件详解 时间 日期 时区 ip 反斜杠 grok在线地址 类型转换
  12. 英伟达 NVIDIA-Tesla-P40 GPU 直透
  13. linux系统周几的格式是,linux cal命令显示日历信息周几天数差
  14. C语言的关键字和标识符
  15. android加密设备,用于Android手机的加密设备和加密外部SD卡
  16. 【玩转华为云】手把手教你用Modelarts实现猫狗数据集的智能标注
  17. 闪讯路由器linux系统,Linux操作系统下连接闪讯的方法(支持有线与无线)
  18. 【历史上的今天】7 月 17 日:软银收购 ARM;第一次电子邮件中断;维基媒体国际会议
  19. 计算机专业竞聘词150,计算机专业组长竞聘优秀演讲稿
  20. Android - 自定义Dialog内部透明,外部有遮罩

热门文章

  1. .net remoting在wpf中的应用
  2. C#[Serializable]在C#中的作用-NET 中的对象序列化
  3. SharePoint 2013 商城
  4. WinCE5.0中文模拟器SDK(VS2005,VS2008)的配置
  5. 用boolalpha输出true或false的问题
  6. system , DOS 命令
  7. 【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例二 | 修改边界条件 | 使用递推方法证明 )
  8. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
  9. Codeforces 1215
  10. Linux 下 top 命令的使用详解