火狐浏览器title过长显示不全_浏览器渲染

8b0dd300e6f92099f46a0d1624752fb0.png

简述

浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是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 树。宏观上,可以分为几个步骤:

387be6a9fca87cc73098cefcc48826db.png

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

在网络中传输的内容其实都是0和1这些字节数据。当浏览器接收到这些字节数据以后,它会将这些数据转换为字符串,就是我们的代码。
  • 将字符串转换成Token,例如:<html><body>等。Token中会标识出当前Token是“开始标签”或是“结束标签”亦或是“文本”等信息
这时候你一定会有疑问,节点与节点之间的关系如何维护?

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

d21fdfd3382f2c57793393c6788e4657.png

上图给出了节点之间的关系,例如:“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>

会构建为下方图示:

20d09e0fb9b875b4fc6e722b2b291902.png

构建CSSOM

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

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

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

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

构建渲染树

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

3c8811e3cb70ce4d6a031cd18eaa4deb.png

在这一过程中,不是简单的将两者合并就行了。渲染树只会包括需要显示的节点和这些节点的样式信息,如果某个节点是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql建表指定引擎_请教mysql建表指定data directory 报错

--如下:语句1... create table test(id int) enginemyisam data directory/tmp index directory/tmp/abc;在目录/tmp /tmp/abc 可以执行成功[mysqllocalhost tmp]$ pwd/tmpdrwxrwxr-x 2 mysql mysql 4096 Mar 30 14:37 abcmysql> create table test(id int) enginemyisam d…

查看目录是否为内存盘_Linux buff/cache内存释放

free 命令 产看内存占用一览&#xff1a;free 参数&#xff1a;今天部署项目的时候&#xff0c;发现pm2命令卡顿不能正确执行&#xff0c;一开始以为是pm2版本的问题&#xff0c;后面升级pm2到最新版本也没有解决问题。既然和pm2本身没有关系&#xff0c;那么就从其它地方检查&…

java用内部类实现多重继承

最常见的实现多重继承的方式&#xff0c;是implements interface1,interface2,interface3… 也可以通过多个内部类extends多个抽象类。 示例如下 public class Father {public int strong(){return 9;} }public class Mother {public int kind(){return 8;} }public class S…

python爬虫找工作要掌握什么_python爬虫实战:判断招聘信息的存在

在找工作的时候&#xff0c;我们会选择上网查询招聘的信息&#xff0c;或者是通过一些招聘会进行现场面试。但由于信息更新不及时&#xff0c;有一些岗位会出现下架的情况&#xff0c;如果我们不注意的话&#xff0c;可能就扑了空。在时间上耽误了不说&#xff0c;面试的信息也…

kafka是存储到本地磁盘么_Kafka 中的消息存储在磁盘上的目录布局是怎样的?

Kafka 中的消息是以主题为基本单位进行归类的&#xff0c;各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区&#xff0c;分区的数量可以在主题创建的时候指定&#xff0c;也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中&#xff0c;分…

ps efgrep mysql 命令_mysql常用管理命令

安装直接yum install mysql-serveryum install mysqlservice mysqld start //启动mysql服务登录mysql -u root -p初次设置密码set password password(qwer,1234);flush privileges;GRANT ALL PRIVILEGES ON *.* TO rootlocalhost IDENTIFIED BY MyPassword WITH GRANT OPTION;F…

英特尔全部cpu列表_Debian发布安全更新 以修复近期披露的英特尔MDS安全漏洞

Debian项目团队今天发布了针对英特尔微代码固件的新安全更新&#xff0c;以修复近期披露的英特尔MDS(微架构数据采样)漏洞。今年5月14日&#xff0c;英特尔披露了影响旗下诸多英特尔微处理器系列的四个新安全漏洞&#xff0c;不过随后很快发布了缓解这些漏洞的安全升级&#xf…

if or函数套用_IF函数和OR函数的套用我想利用IF函数和 – 手机爱问

1 设函数f(x)在(&#xff0d;∞&#xff0c;∞)上为减函数&#xff0c;则( )A f(a)大于f(2a)B f(a^2)小于f(a)C f (a^2a)小于f(a)D f(a^21)小于f(a)请求解题过程&#xff01;&#xff01;感谢&#xff01;2 函数f(x)x^22(a-1)x2在区间(-∞&#xff0c;4】上单调递减&#xff0c…

poi 设置word表格颜色_POI工具练习

POI是一个可以对excel文件进行操作的jar包&#xff0c;使用它可以帮助我们对excel进行操作&#xff0c;也就可以帮助我们实现在jsp页面添加导入数据的功能。只要我们在控制层servlet中加入处理的方法就可以了&#xff1b;首先使用到POI都会与JXL进行对比&#xff1a;查阅之后大…

Java类的定义

类是 Java 中的一种重要的引用数据类型&#xff0c;也是组成 Java 程序的基本要素&#xff0c;因为所有的 Java 程序都是基于类的。 在 Java 中定义一个类&#xff0c;需要使用 class 关键字、一个自定义的类名和一对表示程序体的大括号。完整语法如下&#xff1a; [public][…

excel文件存入mysql_解析excel文件并将数据导入到数据库中

今天领导给安排了一个临时工作&#xff0c;让我将一个excel里面的数据解析后放入数据库中&#xff0c;经过一个下午的努力成功完成&#xff0c;现在将代码献上&#xff0c;希望对大家有所帮助一、需要导入的jar1.commons-collections4-4.1.jar2.poi-3.17-beta1.jar3.poi-ooxml-…

android app性能优化_Android性能优化之Apk 瘦身优化

瘦身主要是下载转换率提高头部App都有Lite版本渠道合作产商要求APK 分析工具ApkTool 反编译工具官网&#xff1a;https://ibotpeaches.github.io/ApkTool apktool d students.apkAnalyze apkAndroid studio 2.2之后使用 - 查看apk组成大小&#xff0c;各资源占比 - 查看dex文件…

Java类的属性

在 Java 中类的成员变量定义了类的属性。例如&#xff0c;一个学生类中一般需要有姓名、性别和年龄等属性&#xff0c;这时就需要定义姓名、性别和年龄 3 个属性。声明成员变量的语法如下&#xff1a; [public|protected|private][static][final]<type><variable_nam…

vue 拖动 datatransfer 问题_electron-vue跨平台桌面应用开发实战教程(四)——窗口样式amp;打开新窗口...

&#xfeff;> 本文我们讲解下怎么修改窗口样式&#xff0c;系统默认的窗口非常普通&#xff0c;通常与设计不符&#xff0c;所以我们要自定义&#xff0c;接下来我们讲解下怎么去掉原有样式&#xff0c;怎么实现实现窗口的最小化&#xff0c;最大化和关闭按钮。还有怎么打开…

string 包含_一文搞懂String常见面试题,从基础到实战,到原理分析和源码解析...

01 string基础1.1 Java String 类字符串广泛应用 在 Java 编程中&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。1.2 创建字符串创建字符串最简单的方式如下:String greeting "菜鸟教程";在代码中遇到字符串常量时&…

RPN网络在图像处理中的应用

RPN&#xff08;Region Proposal Network&#xff0c;区域建议网络&#xff09;是深度学习中用于目标检测的关键组件之一&#xff0c;它通常与后续的目标检测网络&#xff08;如Fast R-CNN、Faster R-CNN等&#xff09;结合使用。RPN的主要作用是生成候选目标区域&#xff0c;从…

Java创建一个学生类

创建一个表示学生的实体类 Student&#xff0c;其中有学生姓名、性别和年龄信息。要求使用属性来表示学生信息&#xff0c;最终编写测试代码。 首先定义一个名为 Student 的类&#xff0c;代码如下&#xff1a; public class Student {// 学生类 }在类中通过属性定义学生、性…

pythonwhile爬虫教程_Python 爬虫从入门到进阶之路(十一)

之前的文章我们介绍了一下 Xpath 模块&#xff0c;接下来我们就利用 Xpath 模块爬取《糗事百科》的糗事。之前我们已经利用 re 模块爬取过一次糗百&#xff0c;我们只需要在其基础上做一些修改就可以了&#xff0c;为了保证项目的完整性&#xff0c;我们重新再来一遍。我们通过…

python中fd是什么意思_python里fd是什么意思

文件描述字(file descriptor&#xff0c;fd)是系统中用来唯一记录当前已经打开的文件的标识号&#xff0c;fd是一个整数。除了file对象外&#xff0c;Python还提供对fd的操作&#xff0c;对fd的操作更加底层&#xff0c;fd和Python中的file对象是不同的概念。在介绍file对象时已…

show index mysql_MySQL SHOW INDEX语法的实际应用

以下的文章主要描述的是MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述&#xff0c;如果你对这一技术&#xff0c;心存好奇的话&#xff0c;以下的文章将会揭开它的神秘面纱。SHOW INDEX FROM tbl_name [FROM db_name]MySQL SHOW INDEX会返回…