浏览器渲染页面和加载页面机制

article/2025/10/6 19:11:27

        为什么有些网站打开的时候会加载会很慢,而且是整个页面同时显示的,而有些网站是从顶到下逐步显示出来的?弄懂这些对前端性能优化有很大帮助。要搞懂这个可以先从下面这个常规流程开始:

 

常规流程

 

 

  1. 浏览器下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。

  2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。

  3. 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。

  4. 并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。

  5. 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。


  6. JS、CSS中如有重定义,后定义函数将覆盖前定义函数。

  这里关键的是第2-5这三点。渲染效率与下面三点有关:

  1. CSS 选择器的查询定位效率

  2. 浏览器的渲染模式和算法

 

 

  3. 要进行渲染内容的大小

 

浏览器的主要组件包括:

 

  1. 用户界面 - 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。

  2. 浏览器引擎 - 用来查询及操作渲染引擎的接口。

  3. 渲染引擎 - 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。

  4. 网络 - 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作。

  5. UI后端 - 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。

  6. JS解释器 - 用来解释执行JS代码。

  7. 数据存储 - 属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术(localstorage),这是一种轻量级完整的客户端存储技术

   浏览器渲染引擎(the rendering engine)

     默认情况下,渲染引擎可以显示html、xml文档及图片,它也可以借助插件(一种浏览器扩展)显示其他类型数据,例如使用PDF阅读器插件,可以显示PDF格式,将由专门一章讲解插件及扩展,这里只讨论渲染引擎最主要的用途——显示应用了CSS之后的html及图片。

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

  Webkit是一款开源渲染引擎,它本来是为Linux平台研发的,后来由Apple移植到Mac及Windows上,相关内容请参考http://webkit.org。

 

渲染主流程

 

 

   渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成。

下面是渲染引擎在取得内容之后的基本流程:

 

 

  解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树

 

       渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。

  Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。

  Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。

值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

HTML DTD

       Html有一个正式的格式定义——DTD(Document Type Definition文档类型定义)——但它并不是上下文无关文法,html更接近于xml,现在有很多可用的xml解析器,html有个xml的变体——xhtml,它们间的不同在于,html更宽容,它允许忽略一些特定标签,有时可以省略开始或结束标签。总的来说,它是一种soft语法,不像xml呆板、固执。

  显然,这个看起来很小的差异却带来了很大的不同。一方面,这是html流行的原因——它的宽容使web开发人员的工作更加轻松,但另一方面,这也使很难去写一个格式化的文法。所以,html的解析并不简单,它既不能用传统的解析器解析,也不能用xml解析器解析。

 Html适用DTD格式进行定义,这一格式是用于定义SGML家族的语言,包括了对所有允许元素及它们的属性和层次关系的定义。正如前面提到的,html DTD并没有生成一种上下文无关文法。

  DTD有一些变种,标准模式只遵守规范,而其他模式则包含了对浏览器过去所使用标签的支持,这么做是为了兼容以前内容。最新的标准DTD在http://www.w3.org/TR/html4/strict.dtd

DOM

  输出的树,也就是解析树,是由DOM元素及属性节点组成的。DOM是文档对象模型的缩写,它是html文档的对象表示,作为html元素的外部接口供js等调用。

  树的根是“document”对象。

  DOM和标签基本是一一对应的关系,例如,如下的标签:

 

<html>
<body>
<p>
Hello DOM
</p>
<div><img src=”example.png” /></div>
</body>
</html>

 

 

 

  将会被转换为下面的DOM树:

bubuko.com,布布扣

原文链接:http://www.mamicode.com/info-detail-94119.html


http://chatgpt.dhexx.cn/article/WQNWwGQC.shtml

相关文章

页面实现加载进度条

文章目录 一、定时器实现进度条二、css3实现进度条三、加载状态事件实现进度条 一、定时器实现进度条 原理&#xff1a;设置了固定的时间后将图片和遮罩层隐藏,显示出页面的内容 效果1&#xff1a; 定时器实现的进度条效果 代码实现 <!DOCTYPE html> <html langen>…

VUE页面中加载外部HTML

方法1&#xff0c;用iframe vue页面 <template><button click"invokeHtmlMethod">调用html种方法</button><div class"iframestyleset"><iframe name "iframeMap" id"iframeMapViewComponent" v-bind…

页面还未加载完成显示loading

页面未加载完成&#xff0c;显示loading的图标 html代码 <div id"loading"><i></i> </div> css 代码 #loading{width: 100%;height: 100%;background-color: #fff;position: fixed;top:0;left: 0;z-index: 9999; }#loading >i{width: …

浏览器加载页面的过程

开源浏览器一般以8k每块下载html页面。 1、然后解析页面生成DOM树&#xff0c; 2、遇到css标签或JS脚本标签就新起线程去下载他们&#xff0c;并继续构建DOM。 3、下载完后解析CSS为CSS规则树&#xff0c;浏览器结合CSS规则树和DOM树生成Render Tree。 注意&#xff1a;构建…

浏览器加载网页过程

1.概要&#xff1a;从用户在浏览器输入域名开始&#xff0c;到web页面加载完毕&#xff0c;这个过程叫做网页加载过程&#xff0c;个人总结&#xff0c;长期更新 2.分析&#xff1a;打开一个网页&#xff0c;浏览器会因为页面上的css/js/image等静态资源多次发起连接请求&#…

登录页面加载效果

说明&#xff1a;我们在做后台管理系统的时候&#xff0c;都会有一个登录页面&#xff0c;有的时候网速比较慢&#xff0c;登录速度比较慢&#xff0c;有的用户就会一直点登录按钮&#xff08;图1&#xff09;&#xff0c;体验不是特别好&#xff0c;基于此&#xff0c;优化一下…

加载页面的几种方法

通常js中的方法是window.onload方法&#xff0c;但是&#xff0c;这有一个缺点&#xff0c;就是当出现多个加载事件时&#xff0c;后面的内容会直接覆盖前面的内容&#xff0c;譬如拿控制台输出为例子&#xff1a; window.onload function () {console.log("BOM方法1&quo…

js重新加载页面的方法

方法/步骤 1、window.location.reload()&#xff0c;刷新页面&#xff0c;不重复提交页面。 2、window.location.hrefwindow.location.href,刷新页面&#xff0c;不重复提交页面。 3、location location 4、location.replace(location.href),刷新页面&#xff0c;不重复…

页面加载的过程

1、创建Document对象&#xff0c;开始解析web页面。解析HTML元素和他们的文本内容后添加Element对象和Text节点到文档中。这个阶段document.readyState ‘loading’。 2、遇到link外部css&#xff0c;创建线程加载&#xff0c;并继续解析文档。 3、遇到script外部js&#xf…

HTML 页面加载过程

window.onload 和 DOMContentLoaded 的区别从输入 url 到得到 html 的过程浏览器渲染页面的过程 window.onload 和 DOMContentLoaded 的区别 DOMContentLoaded&#xff1a;DOM结构加载完毕window.onload&#xff1a;DOM结构和静态资源加载完毕 从输入 url 到得到 html 的过程 …

html运行页面一直处在加载状态的解决

前两天在制作一个页面的时候&#xff0c;发现左上方浏览器一直在加载&#xff0c;如下图所示&#xff1a; 并且我的一些图片也不显示了 查看代码&#xff0c;引用图片整合部分的图片路径出现错误&#xff1a; 改正如下&#xff1a; 重新运行界面&#xff1a; 界面运行完毕&am…

页面预加载

目录 一、<link> 标签预加载1、<link> 标签的 preload 属性的属性介绍2、避免滥用 preload3、避免混用 preload 和 prefetch&#xff08;1&#xff09;、preload&#xff08;2&#xff09;、prefetch 4、避免错用 preload 加载跨域资源5、defer 与 async 二、JavaS…

HTML页面的加载

HTML页面的加载实际上是基于http过程浏览器对数据的解析渲染。 http协议的请求过程是基于TCP协议的。http是要基于TCP连接基础上&#xff0c;简单的说&#xff0c;TCP单纯建立连接&#xff0c;不涉及任何我们需要请求的实际数据&#xff0c;简单的传输。http基于TCP建立的连接…

Redis集群原理详解

一、Redis集群介绍&#xff1a; 1、为什么需要Redis集群&#xff1f; 在讲Redis集群架构之前&#xff0c;我们先简单讲下Redis单实例的架构&#xff0c;从最开始的一主N从&#xff0c;到读写分离&#xff0c;再到Sentinel哨兵机制&#xff0c;单实例的Redis缓存足以应对大多数…

2022.4.7网页一直在加载中,无提示

项目场景&#xff1a; 项目中有一个查看一些数据的页面&#xff0c;点击“查看详情”按钮&#xff0c;可以进入这个页面&#xff0c;查看详情信息。 问题描述 点击“查看详情”按钮&#xff0c;页面一直在加载中&#xff0c;页面没有相关提示。 原因分析&#xff1a; 再次点…

softmax layer

一张图&#xff0c;简单易懂、清晰明了。

softmax中axis参数

从caffe中我们看到softmax有下面这些参数 // Message that stores parameters used by SoftmaxLayer, SoftmaxWithLossLayer message SoftmaxParameter {enum Engine {DEFAULT 0;CAFFE 1;CUDNN 2;}optional Engine engine 1 [default DEFAULT];// The axis along which t…

Softmax回归

softmax回归学习笔记&#xff1a; 分类问题&#xff1a; 假设数据集图像高和宽均为2像素&#xff0c;色彩为灰度。 例&#xff1a; 数据集真实标签&#xff1a; 狗 y1 猫 y2 鸡 y3 softmax回归模型&#xff1a; softmax回归和线性回归都需要将输入特征与权重做线性叠加。不同的…

softmax函数

输出层的设计 神经网络可以用在分类问题和回归问题上&#xff0c;不过需要根据情况改变输出层的激活函数。一般而言&#xff0c;回归问题用恒等函数&#xff0c;分类问题用softmax函数。机器学习的问题大致可以分为分类问题和回归问题。分类问题是数据属于哪一个类别的问题。比…

输出层的激活函数——softmax函数

概括 机器学习的问题大致可以分为分类问题和回归问题。分类问题是数据属于哪一个类别的问题。比如&#xff0c;区分图像中的人是男性还是女性的问题就是分类问题。而回归问题是根据某个输入预测一个&#xff08;连续的&#xff09;数值的问题。比如&#xff0c;根据一个人的图…