简述

浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是JS引擎。渲染引擎在不同的浏览器中也不是都相同的。目前市面上常见的浏览器内核可以分为这四种:Trident(IE)、Gecko(火狐)、Blink(Chrome、Opera)、Webkit(Safari)。这里面大家最耳熟能详的可能就是 Webkit 内核了,Webkit 内核是当下浏览器世界真正的霸主。本文我们就以 Webkit 为例,对现代浏览器的渲染过程进行一个深度的剖析。

页面加载过程:

  • 根据DNS域名解析得到对应的IP地址
  • 构建HTTP请求,并且向这个IP地址发送请求
  • 服务器接收请求并处理请求,返回响应数据
  • 浏览器得到返回内容

浏览器渲染过程:

浏览器渲染过程大体分为如下三部分:

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

  • 一是HTML/SVG/XHTML,HTML字符串描述了一个页面的结构,浏览器会把HTML结构字符串解析转换DOM树形结构。
  • 二是CSS:遇到了css样式会构建css规则树 css rules tree
  • 三是Javascript脚本,等到Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree。

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

  • Rendering Tree 渲染树 不同于 DOM树,渲染树只会包括需要显示的节点和这些节点的样式信息。
  • css的Rule Tree主要是为了完成匹配并把CSS Rule附加在 Rendering Tree上的每个Element(也就是每个节点)
  • 然后计算每个节点的位置,这个过程又叫layout(布局)和reflow(回流)。

3、最后通过操作系统进行绘制

构建DOM

浏览器会遵守一套步骤将HTML 文件转换为 DOM 树。宏观上,可以分为几个步骤:

浏览器从磁盘或网络读取HTMl的原始字节,并根据文件的指定编码(例如UTF-8)将它们转换成字符串。

在网络中传输的内容其实都是0和1这些字节数据。当浏览器接收到这些字节数据以后,它会将这些数据转换为字符串,就是我们的代码。

  • 将字符串转换成Token,例如:<html><body>等。Token中会标识出当前Token是“开始标签”或是“结束标签”亦或是“文本”等信息

这时候你一定会有疑问,节点与节点之间的关系如何维护?

事实上,这就是Token要标识“起始标签”和“结束标签”等标识的作用。例如“title”Token的起始标签和结束标签之间的节点肯定是属于“head”的子节点。

上图给出了节点之间的关系,例如:“Hello”Token位于“title”开始标签与“title”结束标签之间,表明“Hello”Token是“title”Token的子节点。同理“title”Token是“head”Token的子节点。

生成节点对象并构建DOM

事实上,构建DOM的过程中,不是等所有Token都转换完成后再去生成节点对象,而是一边生成Token一边消耗Token来生成节点对象。换句话说,每个Token被生成后,会立刻消耗这个Token创建出节点对象。注意:带有结束标签标识的Token不会创建节点对象。

接下来我们举个例子,假设有段HTML文本:

<html>
<head><title>Web page parsing</title>
</head>
<body><div><h1>Web page parsing</h1><p>This is an example Web page.</p></div>
</body>
</html>

会构建为下方图示:

构建CSSOM

DOM会捕获页面的内容,但浏览器还需要知道页面如何展示,所以需要构建CSSOM。

构建CSSOM的过程与构建DOM的过程非常相似,当浏览器接收到一段CSS,浏览器首先要做的是识别出Token,然后构建节点并生成CSSOM。

在这一过程中,浏览器会确定下每一个节点的样式到底是什么,并且这一过程其实是很消耗资源的。因为样式你可以自行设置给某个节点,也可以通过继承获得。在这一过程中,浏览器得递归 CSSOM 树,然后确定具体的元素到底是什么样式。

注意:CSS匹配HTML元素是一个相当复杂和有性能问题的事情。所以,DOM树要小,CSS尽量用id和class,千万不要过渡层叠下去

构建渲染树

当我们生成 DOM 树和 CSSOM 树以后,就需要将这两棵树组合为渲染树。

在这一过程中,不是简单的将两者合并就行了。渲染树只会包括需要显示的节点和这些节点的样式信息,如果某个节点是display: none的,那么就不会在渲染树中显示。

布局与绘制

当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流)。这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。通常这一行为也被称为“自动重排”。

布局流程的输出是一个“盒模型”,它会精确地捕获每个元素在视口内的确切位置和尺寸,所有相对测量值都将转换为屏幕上的绝对像素。

布局完成后,浏览器会立即发出“Paint Setup”和“Paint”事件,将渲染树转换成屏幕上的像素。

总结:

  • 浏览器工作流程:构建DOM -> 构建CSSOM -> 构建渲染树 -> 布局 -> 绘制。
  • CSSOM会阻塞渲染,只有当CSSOM构建完毕后才会进入下一个阶段构建渲染树。
  • 通常情况下DOM和CSSOM是并行构建的,但是当浏览器遇到一个script标签时,DOM构建将暂停,直至脚本完成执行。但由于JavaScript可以修改CSSOM,所以需要等CSSOM构建完毕后再执行JS。
  • 如果你想首屏渲染的越快,就越不应该在首屏就加载 JS 文件,建议将 script 标签放在 body 标签底部。

渲染页面时常见哪些不良现象?

由于浏览器的渲染机制不同,在渲染页面时会出现两种常见的不良现象—-白屏问题和FOUS(无样式内容闪烁)

FOUC:由于浏览器渲染机制(比如firefox),在CSS加载之前,先呈现了HTML,就会导致展示出无样式内容,然后样式突然呈现的现象;

白屏:有些浏览器渲染机制(比如chrome)要先构建DOM树和CSSOM树,构建完成后再进行渲染,如果CSS部分放在HTML尾部,由于CSS未加载完成,浏览器迟迟未渲染,从而导致白屏;也可能是把js文件放在头部,脚本会阻塞后面内容的呈现,出现白屏问题。

参考文章

  • async 和 defer 的区别 | SegmentFault
  • 浏览器的渲染原理简介
  • 前端面试之道
  • 浏览器的渲染:过程与原理
  • 你真的了解回流和重绘吗
  • 关键渲染路径
  • 页面重绘和回流以及优化
  • 浏览器重绘(repaint)重排(reflow)与优化[浏览器机制]

本文转载自:

https://zhuanlan.zhihu.com/p/53913989​zhuanlan.zhihu.com

火狐浏览器title过长显示不全_浏览器渲染相关推荐

  1. 火狐FireFox和IE浏览器的title属性文本过长显示不全问题

    火狐FireFox和IE浏览器的title属性文本过长显示不全问题 场景 当显示文本的内容过长,可以截断文本,省略号显示,然后给标签设置title属性,鼠标移入的时候显示完整内容.但在火狐和IE浏览器 ...

  2. 火狐浏览器table表格的显示不全问题

    解决火狐浏览器的表格展示不全 由于本人在学习前端开发以来一直使用的是谷歌浏览器,在前两天的代码提交过程中碰到了table表格的边框展示问题,在我这边是没有什么问题的,但是在我们老大那里却出现了tabl ...

  3. jsptitle换行_fullcalendar中title内容过长显示不全的问题

    添加属性: eventRender: function (event, element) { element.html(event.title); } 页面详细代码: #calendar { max- ...

  4. Echarts中折线图Y轴数据值太长显示不全-解决办法

    正常状态 不全的情况 所有的数据都是从后台取的,也就是说动态变化的,一开始的时候数据量不大不会出现问题,后面y轴的值越来越大的时候就出现了这个显示不全的情况 代码 <div id="c ...

  5. Echarts给折线图给横竖坐标轴添加箭头与标签文字过长显示不全处理

    本人在做监控数据大屏时曾踩过不少坑,现将踩坑经验总结如下,数据大屏demo请点击这里 一.饼图处理标签文字过长而显示不全的解决方案 在使用echarts的过程中,有时会遇到标签文字过长导致显示不全的问 ...

  6. html手机端背景显示不全,手机浏览器打开PC端网站,背景显示不全怎么办?

    原标题:手机浏览器打开PC端网站,背景显示不全怎么办? 随着移动互联网的发展,大多数企业在制作网站的时候,为了兼容各种设备,会制作出PC端.移动端二种版,根据不同的设备跳转到不同的网站,从而实现用户体 ...

  7. html 横屏内容显示不全_为什么我的文本显示不全?

    在实际工作中,经常会遇到文本显示不全的情况,比如表格里的文本显示不全等情况,你一般是怎么操作呢?本期与大家分享几种常见的原因. 1.Word表格文本显示不全 如下图所示,表格里面的文本显示不全,这时该 ...

  8. 天正坐标标注显示不全_广联达导入CAD图纸不显示怎么办?

    第一步,操作之前先点击CAD左上角,点开后有一个图形实用工具,点开有一个核查,输入y,然后核查完后,在框选输入purge,回车全部清理. 情况一:图纸导入不显示或者显示不全,但是在CAD里显示正常. ...

  9. word中图片为嵌入式格式时显示不全_打印Word图片显示不全 Word2007图片显示不全解决方法...

    打印Word图片显示不全 Word2007图片显示不全解决方法,平凡的世界平凡的你,努力学习使我们变得不平凡,今天要介绍的知识是打印Word图片显示不全的相关知识,你准备好学习打印Word图片显示不全 ...

最新文章

  1. HTML的标签描述14
  2. 【Linux】28.Linux脚本判断是否安装了某软件
  3. 厉害的壁纸,亲测有效
  4. Java Web托管选项流程图
  5. DataBinder.Eval数据绑定中的使用
  6. Bailian4041 矩阵运算【数学计算】
  7. 服务器中C盘的虚拟大文件,查看虚拟机的大文件系统
  8. 软件项目管理 2.1.项目立项
  9. Excel线性回归分析
  10. DotNetBar布局(一)
  11. 等比数列和等差数列求和公式
  12. CF卡显示位置不可用无法访问介质受写入保护怎么办
  13. 手机微信和QQ接收到的文件路径
  14. Number theory 1_2, To prove there is no rational solution of equation: x^2+y^2=7
  15. 笔记本扩展显示器,微信界面显示字体模糊如何解决?
  16. Odoo owl 学习笔记之13—event_handing
  17. 大数据时代,企业如何做好数据防泄漏?
  18. Hbase最全面入门指南
  19. ardupilot 中关键坐标系
  20. Python,requests爬虫,使用代理爬取大众点评(含爬取结果。。。在文末)

热门文章

  1. expressjs如何做mysql注入_Node.js+Express+Mysql 实现增删改查
  2. linux系统nginx启动不了,nginx启动不了,求大神帮助!
  3. Win7旗舰版禁止修改文件属性的设置方法
  4. win7如何关闭密码保护共享
  5. Java,AXIS,webService 调用 完整实例 xml 入参出参
  6. struts2升级jar包遇到无法正常访问action的方法的问题
  7. Linux中使用netstat命令的基本操作,排查端口号的占用情况
  8. python打飞机源码_python 飞机大战 游戏源码(pygame入门级)
  9. Java 主流垃圾收集器
  10. php面向对象异常处理,PHP 错误和异常处理(下)