浏览器如何渲染页面?

news/2024/5/18 23:14:11/文章来源:https://blog.csdn.net/qq_40992225/article/details/126967430

DOM

浏览器渲染页面的过程就像是盖房子,一般先请求服务器得到HTML文件,HTML文件就相当于网页的框架结构,不过一开始浏览器得到的是显示字节内容的HTML文件,必须要内化为自己看的懂的语言才行,于是就把字节转化为字符,也就是程序员能够看的懂的html代码。但是此时我们可以看得懂,机器却不行,于是我们需要转化为机器能够看得明白的语言,HTML是标记语言,里面有很多小于号<和大于号>分别标识不同的结构,于是浏览器就把字符转化为Token,可以简单把Token理解为符号标签,比如遇见的第一个的时候转化为一个起始标签,遇到结尾的</ body>时转化为结束标签,这样字符就被Token化了,不同字符就变成有不同特殊意义的东西了。Token化 以后就要开始升华,也就是把token转化为节点对象。在编程里面,对象虽然只是用代码表示而已,但是对象是可以进行编程操作的,因为对象会有自己的属性方法,相当于把token盘活了。最后就是把这些节点对象都连到一起,形成文本对象模型,也就是DOM。DOM其实就是浏览器自己的语言,每个节点对象相连,形成父子关系,这样后面要对某个节点对象进行操作,对于浏览器来讲就非常友好了。在这里插入图片描述

CSSOM

从HTML转化为DOM,就像建房时把施工合同转化为迷你框架模型,在阅读施工合同时,其实也同时阅读了甲方的装饰要求,在制作迷你框架结构模型的同时我也正在给模型做“装修”,比如给墙面上色之类的。一般来说我们会把css样式作为外链加入到link标签里面,css就相当于网页的“装饰”。浏览器在构架DOM的时候,就会遇到link标签,然后向服务器发送请求,接着得到css文件,后面的流程就和处理HTML文件非常相似。把字节转换成字符,字符转换为token,Token转化为节点。最后就是不同的地方了,这里节点会结合为css对象模型,也就是CSSOM

在这里插入图片描述

渲染树

迷你模型再加上装修,也就是房子的模型完成了,有了模型,房子就更容易搭建了。虽然DOM和CSSOM都是独立的对象模型,但是一个网页的呈现离不开两者,因为一个网页就是由框架和样式结合起来的,DOM和CSSOM就和起来就是渲染树。页面就是要根据渲染树的结构样式来进行的,但是DOM和CSSOM并不是简单的结合就完事了。因为渲染树上的节点是页面能够呈现的内容,也就是一些HTML标签和某些样式是不会被呈现出来的,不会被呈现出来的就不挂在渲染树上了,比如meta和link标签就不会当作内容呈现出来,设置了display:none的样式也不会被呈现出来。渲染树的任务就是匹配DOM和CSSOM的节点,并且捕获可见内容。
在这里插入图片描述

布局

虽然房子模型已经做好了,但不代表马上就能建房子了,实际上还需要安排房子的布局。实际上房子上需要多少块砖头,需要多少吨水泥等等。在渲染树构造完成以后,页面也是不能被马上渲染的,因为还需要进行布局。布局的意思就是获取渲染树的结构,节点位置和大小,而布局是依据盒子模型来进行的,也就是每个元素都用一个盒子来表示,然后这些盒子在页面上进行排列和嵌套。
在这里插入图片描述

绘制

在安排好房子的布局以后,就要开始建房子了。浏览器在布局以后其实就可以安排页面的绘制了,把渲染树以像素的形式绘制在页面上,这样我们的页面就呈现出来了。

渲染HTML+CSS+JS

了解了渲染的基本过程以后,结合实际深入理解。来看一下以下的html代码

<html>
<head><link rel="stylesheet" type="text/css" href="index.css"><script src="index.js"></script>
</head>
<body> 
</body>
</html>

首先第一步:浏览器发送请求以后,服务器或者本地返回给浏览器HTML文件,这个时候第一步就是解析HTML文件,并且构建DOM树。在解析HTML文件的时候遇见 了link标签,浏览器就去请求css文件,请求css文件的同时也继续解析HTML文件。此时遇到了script标签,浏览器就去请求JS文件。服务器或者本地就会陆续返回CSS和JS文件,实际操作中会先得到css还是JS文件是要看及具体情况的。在这里,如果先返回并且解析完成JS文件也是会发生阻塞的,我们不能先执行JS文件,必须要等到CSSOM构建完成了才能执行JS文件。因为前面说过了渲染树是需要DOM和CSSOM构建完成以后才能构建,而且JS是可以操控CSS样式的,所以这一步就是解析CSS文件并且构建CSSOM。如果是script标签里面写的是行内JS代码,而不是外部JS代码,也会发生阻塞吗?还是会。CSSOM的构建就是渲染中一个重要的阻塞因素,其实DOM也是会阻塞渲染过程的,毕竟没有DOM,页面的框架都建造不起来。但是DOM有一点好处,就是可以部分解析,而CSSOM不能部分解析,这就是DOM和CSSOM不同之处。那么为什么DOM可以部分解析,但是CSSOM却不可以呢?比如我们给body设置了字体为32px,然后又给body里面的div设置了字体为16px,如果CSSOM只解析了body,后面的div没有解析或者延迟解析,那就乱套了,所以CSSOM不能部分解析。不过在解析CSS文件并且构建CSSOM的时候,浏览器依旧去下载并且解析JS文件,等CSSOM构建完成以后就可以执行JS里的内容,但是HTML的解析刚刚就已经停止了,因为JS会阻塞HTML解析。虽然看起来JS并没有直接阻塞渲染过程,但是有间接的影响,因为JS既可以操作DOM又可以操作CSSOM,如果不等JS下载解析执行完以后再构建DOM,那有可能会导致网页的有些内容出现了又消失,所以在解析HTML的时候,不管是行内JS代码还是外部JS代码,都会让HTML的解析停止下来,虽然DOM是可以部分解析的,但是对于这个网页来说就相当于阻塞了第一次的渲染。JS执行完成之前什么内容都没有,在JS执行完了以后,下面的流程就很正常了,也就是形成渲染树(构建DOM后),进行布局,最后绘制。
在这里插入图片描述

再看下面一个例子。在请求得到HTML文件的时候就开始解析HTML文件以构建DOM树,解析遇到link标签,需要请求css文件,在请求css文件的同时,继续解析HTML,遇到了script标签,需要请求JS文件,不过这里因为设置了async,也就是异步执行JS,因此不会阻塞HTML的解析,这时遇到了img标签,因此需要下载图片资源,但是不要以为图片会阻塞HTML解析,因此继续往下进行解析,知道把DOM构建完成。不过即使DOM构建完成也不能渲染页面,因为要等CSSOM,因此等待解析CSS文件,构建CSSOM。由于设置了async的script标签执行时间要看实际情况。假设我们就在这里执行了JS内容,接着就是构建渲染树,布局以及绘制了。
在这里插入图片描述

总结

第一步构建DOM,第二步构建CSSOM,第三步构建渲染树,第四步布局,第五步绘制。如果构建DOM的时候遇到了JS,就请求下载执行JS。JS如果没有额外的设置,默认要等CSSOM构建完成。而JS既可以对DOM,也可以对CSSOM进行修改,这样后面的三步又会再运行一次。
在这里插入图片描述
详细可见视频:浏览器渲染页面的流程

阻塞

css在加载的时候会不会造成阻塞?css加载不会阻塞DOM树的解析,css加载会阻塞DOM树的渲染,css加载会阻塞后面js语句的执行。Render Tree渲染树是依赖于dom树和css规则的,所以css加载会阻塞DOM树的渲染。JavaScript要操作dom节点和css样式,所以js要等css和dom渲染就位之后才能工作,所以css加载会阻塞后面js语句的执行。

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

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

相关文章

vue小案列(hello world)

目录 1 页签图标的报错解决 2 创建vue实例 3 初识Vue分析 1 页签图标的报错解决 1 首先&#xff0c;在我们的html中定义一个容器&#xff0c;然后右键&#xff08;Open with LIve Server&#xff09;打开&#xff0c;需要安装LIve Server插件 打开之后发现控制台报如下错误&a…

2022年服装进销存软件排行榜重磅出炉!

小编调研了一下身边做服装行业的老板&#xff0c;普遍反映如今服装实体店越来越难做了&#xff0c;日常经营过程中&#xff0c;难免会遇到各种问题&#xff1a;商品种类多、款式多、库存多、活动多……这些都让老板们应接不暇&#xff0c;尽管每天早出晚归地管理店铺&#xff0…

怎么音频转文字?快把这些方法收好

相信不少的小伙伴&#xff0c;经常需要对自己的录音文件进行整理归纳吧&#xff0c;其中不乏是课堂的重点知识、会议上的重点纪要、谈判中的重点内容。那小伙伴们平时在整理的时候&#xff0c;大概都需要花费多少时间呢&#xff1f;为了能够将音频的内容完整呈现出来&#xff0…

SpringBoot多数据源

使用场景 在实际开发中&#xff0c;可能遇到多数据源的场景。 业务复杂&#xff08;数据量大&#xff09; 数据分布在不同的数据库中&#xff0c;对业务数据进行垂直拆分。 可以拆分为微服务架构&#xff0c;依赖的业务可以通过远程调用的方式来是实现&#xff0c;那么这种方…

机器学习中常见性能度量汇总

前言 如果你对这篇文章可感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 回归 在回归任务上&#xff0c;目前最常用的性能度量方式是均方误差 (Mean Squared Error, MSE)&#xff1a; MSE1m∑i1…

flex布局

flex布局 开启flex功能 <html><head><style>.container{border: 1px solid #000;width: 400px;height: 400px;margin-left: 20px;margin-top: 20px;display: flex; // 开启flex布局}.item{width: 100px;height: 100px;color: #fff;text-align: center;line…

kubernetes(2)k8s环境搭建:kubeadm安装、二进制方式安装

环境平台规划 k8s里面之前我们了解过&#xff0c;主要的内容是master和node&#xff0c;所有这里可以划分为 单master集群多master集群 单master集群 缺点&#xff1a;master挂掉后&#xff0c;便不能去管理node节点了 多master集群 与之前的区别便是多了master 服务器硬件…

Prometheus监控进程

Prometheus监控进程 process-export主要用来做进程监控&#xff0c;比如某个服务的进程数、消耗了多少CPU、内存等资源。 一、process-exporter使用 ‍ 1.1 下载 process-exporter process-exporter GibHUB地址 process-exporter 下载地址 process-exporter可以使用命令行…

图解LeetCode——854. 相似度为 K 的字符串(难度:困难)

一、题目 对于某些非负整数 k &#xff0c;如果交换 s1 中两个字母的位置恰好 k 次&#xff0c;能够使结果字符串等于 s2 &#xff0c;则认为字符串 s1 和 s2 的 相似度为 k 。 给你两个字母异位词 s1 和 s2 &#xff0c;返回 s1 和 s2 的相似度 k 的最小值。 二、示例 2.1…

C语言手写HTTPD网站服务器

网站服务器&#xff08;HTTPD&#xff09;已经有很多版本&#xff0c;但是大部分对初学者都非常不友好。适合初学者学习的httpd服务器&#xff0c;最负盛名的当数tinyhttpd, 但是这个版本&#xff0c;是基于Linux系统的&#xff0c;而且配套的CGI也是使用perl语言写的&#xff…

宝塔面板修改secure_file_priv设置

1、secure_file_priv文件作用 mysql读取系统文件权限的设置参数 2、查询secure_file_priv设置 show variables like %secure%; 3、修改secure_file_priv设置 设置 secure_file_priv"/" 需要修改mysql配置文件my.cnf my.cnf文件有两个位置 /etc/my.cnf /www/serv…

线程安全简述

目录 1、线程是否安全 2、出现线程安全的原因如下&#xff1a; 3、原子性问题 4、synchronized关键字 1、锁对象 2、用法&#xff1a; 3、可重入锁 5、内存可见性 6、volatile关键字 7、JMM 1、线程是否安全 线程不安全就是一些代码在多线程的运行状态下&#xff0c…

一个基于.Net Core开发的适合外贸商城系统

今天给大家推荐一个适合外贸的商城系统。 项目简介 这是一个基于.Net Core开发的&#xff0c;兼容PC、平板、移动端的商城系统。被下载次数超过300w&#xff0c;拥有最活跃的成员&#xff0c;由专业团队开发与支持。支持PayPal、信用卡、发票支付。 技术架构 1、跨平台&…

Jmeter电商系统压测实战<二>

目录一、Jmeter优化tips二、Jmeter的使用建议-参数配置1. XX:MaxMataspaceSize&#xff08;jdk8的参数&#xff09;2. -Xmx2048m3. -Xms1g三、Jmeter插件1. 介绍及安装2. 常用插件四、Jmeter日志收集1. 概览2. elk&#xff0c;kibana和es的安装和配置3. Prometheus和Node Expor…

全系标配L2占比首次突破30%,「数据」赛道争夺战一触即发

智能驾驶的进阶战&#xff0c;无论是提升车型产品竞争力&#xff0c;还是为高阶功能和现有功能优化提供闭环数据迭代&#xff0c;全系标配已经成为主流趋势。 如果说智能化1.0阶段&#xff0c;车企拼的是技术的快速落地和高阶能力的标杆效应&#xff0c;那么2.0阶段就是拼规模…

python中validators库用法详解

首先安装validators库&#xff1a; pip install validators validators.between(value, minNone, maxNone) 验证一个数字value是否在最小值min和最大值max之间&#xff0c;value不仅仅可以是整数&#xff0c;也可以是其它数据类型&#xff0c;例如floats, decimals 和 dates。…

Three使用OimoPhysics实现物体相关物理特性实例

基础环境搭建&#xff1a; InstancedMesh()创建的立方体物品集合&#xff1a; boxes new THREE.InstancedMesh(new THREE.BoxGeometry(0.1, 0.1, 0.1),new THREE.MeshLambertMaterial(),100)const matrix new THREE.Matrix4()const color new THREE.Color()for (let i 0; i…

Win11 22H2 22621.521大版本更新!

注意&#xff01;注意&#xff01;Win11 22H2 22621.521大版本更新啦&#xff0c;此次更新带来了不小的优化和改进&#xff0c;包括带有标签的更新文件资源管理器、更丰富的开始菜单和任务栏体验、增强的搜索功能、对改进的安全性和无密码登录的支持等等。 让每个人都能更轻松、…

生成网络论文阅读styleGAN1(一):论文速览

研究什么内容 研究如何把生成图片当中的内容拆分开 研究方法 为了把各种风格分开先得把控制信息分开输入&#xff0c;于是作者就分开输入了&#xff0c;在PGGAN的基础上分开输入&#xff0c;取得了好的效果。 个人理解 1.这里能取得好效果的主要原因是PGGAN的逐渐提升像素…

多模块间通信存在完美的设计么?

一、前言 在 App 的使用中&#xff0c;常常会有一些功能的依赖&#xff0c;比如评论需要用户登录、支付需要用户实名绑定银行卡等。从代码开发角度而言&#xff0c;如果我们的项目使用了多模块&#xff0c;那么也就会出现模块依赖的场景&#xff0c;比如评论模块依赖登录模块提…