整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端面试题:浏览器如何解析HTML文件?

览器解析HTML文件的过程是网页呈现的关键步骤之一。具体介绍如下:


HTML文档的接收和预处理

  1. 网络请求处理:当用户输入URL或点击链接时,浏览器发起HTTP请求,服务器响应并返回HTML文件。此过程中,浏览器需要处理DNS查询、建立TCP连接等底层网络通信操作。
  2. 预解析优化:为了提高性能,现代浏览器在主线程解析HTML之前会启动一个预解析线程,提前下载HTML中链接的外部CSS和JS文件。这一步骤确保了后续渲染过程的顺畅进行。

解析为DOM树

  1. 词法分析和句法分析:浏览器的HTML解析器通过词法分析将HTML文本标记转化为符号序列,然后通过句法分析器按照HTML规范构建出DOM树。每个节点代表一个HTML元素,形成了多层次的树状结构。
  2. 生成对象接口:生成的DOM树是页面元素的结构化表示,提供了操作页面元素的接口,如JavaScript可以通过DOM API来动态修改页面内容和结构。

CSS解析与CSSOM树构建

  1. CSS文件加载与解析:浏览器解析HTML文件中的<link>标签引入的外部CSS文件和<style>标签中的内联CSS,生成CSSOM树。CSSOM树反映了CSS样式的层级和继承关系。
  2. CSS属性计算:包括层叠、继承等,确保每个元素对应的样式能够被准确计算。这些计算过程为后续的布局提供必要的样式信息。

JavaScript加载与执行

  1. 阻塞式加载:当解析器遇到<script>标签时,它会停止HTML的解析,转而先加载并执行JavaScript代码。这是因为JS可能会修改DOM结构或CSSOM树,从而影响已解析的部分。
  2. 异步和延迟加载:为了不影响页面的初步渲染,可以采用async或defer属性来异步加载JS文件,这样可以在后台进行JS的加载和执行,而不阻塞HTML解析。

渲染树的构建

  1. 合并DOM树和CSSOM树:有了DOM树和CSSOM树后,浏览器将它们组合成渲染树,这个树只包含显示界面所需的DOM节点及对应的样式信息。
  2. 不可见元素的排除:渲染树会忽略例如<head>、<meta>等不可见元素,只关注<body>内的可视化内容。

布局计算(Layout)

  1. 元素位置和尺寸确定:浏览器从渲染树根节点开始,递归地计算每个节点的精确位置和尺寸,这个过程也被称为“回流”或“重排”,是后续绘制的基础。
  2. 布局过程的优化:现代浏览器会尽量优化布局过程,例如通过流式布局的方式减少重复计算,确保高效地完成布局任务。

绘制(Paint)

  1. 像素级绘制:绘制是一个将布局计算后的各元素绘制成像素点的过程。这包括文本、颜色、边框、阴影以及替换元素的绘制。
  2. 层次化的绘制:为了高效地更新局部内容,浏览器会将页面分成若干层次(Layer),对每一层分别进行绘制,这样只需更新变化的部分。

因此,我们开发中要注意以下几点:

  • 避免过度使用全局脚本:尽量减少使用全局脚本或者将它们放在文档底部,以减少对HTML解析的阻塞。
  • 合理组织CSS和使用CSS预处理器:合理组织CSS文件的结构和覆盖规则,利用CSS预处理器进行模块化管理。
  • 利用浏览器缓存机制:通过设置合理的缓存策略,减少重复加载相同资源,提升二次访问的体验。
  • 优化图片和多媒体资源:适当压缩图片和优化多媒体资源的加载,减少网络传输时间和渲染负担。

综上所述,浏览器解析HTML文件是一个复杂而高度优化的过程,涉及从网络获取HTML文档到最终将其渲染到屏幕上的多个步骤。开发者需要深入理解这些步骤,以优化网页性能和用户体验。通过合理组织HTML结构、优化资源加载顺序、减少不必要的DOM操作和合理安排CSS和JavaScript的加载与执行,可以显著提升页面加载速度和运行效率。

tml指超文本标记语言,通过标签来控制文字和图片的显示方式,以.html结尾的文件是Html文档,学习网站W3school。

Html文档结构


title标签是标题标签,body内部存放能够看到的所有内容,包含文字,图片,视屏等。

常见的基本标签

p标签是段落标签,h1标签是头部标签多用于文章标题或副标题,共有六个,img图片标签引入图片,div是最常见的块级标签,可以将网页中的内容划分出若干个矩形区域,用于存放不一样的内容。标签可以分为单标签和双标签。


无序列表

网页中间有一些内容相似,结构相仿,布局接近的区域,像这一类区域我们就使用无序列表来进行区域划分。

有序列表

网页中间还有一些内容相似,结构相仿,布局接近但是每个区域的内容是有先后关系的区域,像这一类区域我们就使用有序列表来进行区域划分。

编辑软件vscode

最近本人在准备面试中与CSS相关的内容,为自己后面的面试及复习知识做准备。对于知识而言,有着一个记录也是十分重要的,也方便自己对自己所了解的技能做总结。大家都知道,在前端面试中CSS也是一个面试的重要考点,下面是本人整理的部分CSS面试考点。

题目一:请你说说你对css盒模型的理解

这个问题是面试中CSS极其重要的考点,几乎经常被问到。对于CSS 盒模型来说,它前端开发中非常基础而重要的概念之一。它描述了网页上的每个元素都是一个矩形的盒子,这个盒子由元素的内容(content)、内边距(padding)、边框(border)和外边距(margin)组成。

具体的讲,CSS 盒模型包含以下几个部分:

  1. 内容区域(Content) :指元素内部实际包含内容的区域,例如文字、图片等。
  2. 内边距(Padding) :内容区域与边框之间的空白区域,用来控制内容与边框的距离。
  3. 边框(Border) :内边距外部的边框,用来围绕内容和内边距的区域。
  4. 外边距(Margin) :边框外部的空白区域,用来控制元素与其他元素之间的距离。

盒模型的分类:

在 CSS 中,有两种盒模型:标准盒模型(content-box)和 IE 盒模型(border-box)。

标准盒模型(content-box) 在标准盒模型中,元素的宽度和高度仅包括内容区域的尺寸,不包括内边距(padding)、边框(border)和外边距(margin)。这意味着,当你设置一个元素的宽度为 200px 时,这个宽度值仅包括元素的内容区域,而不包括内边距、边框和外边距的宽度。如下面的示例:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body { margin: 0; padding: 0; } .box { width: 300px; height: 300px; padding: 10px; margin: 20px; border: 5px solid blue; /* box-sizing: border-box; 要求浏览器以IE盒子模型来加载盒子 */ box-sizing: content-box; /*要求浏览器以标准盒子模型来加载盒子*/ } </style> </head> <body> <div class="box">盒子模型</div> </body> </html>

从这个示例中,我们可以看出在标准盒模型中,元素的总宽度计算方式为:内容宽度(width) + 左右内边距(padding-left + padding-right) + 左右边框宽度(border-left-width + border-right-width) + 左右外边距(margin-left + margin-right)。这个总宽度值就是元素所占据的实际空间。也就是说盒子总宽度:width + padding + border + margin = 330

怪异盒模型(IE盒模型) 在 IE 盒模型中,元素的宽度和高度包括了内容区域、内边距和边框的尺寸,但不包括外边距。换句话说,当你设置一个元素的宽度为 300px 时,这个宽度值包括了内容区域、内边距和边框的宽度。还是上面的那个例子,但是我们需要在style中加上box-sizing: border-box要求浏览器以IE盒子模型来加载盒子。

上面的图我们可以从中看出,在 IE 盒模型中,元素的总宽度计算方式为:内容宽度(width)(包括内边距和边框) + 左右外边距(margin-left + margin-right)。这个总宽度值同样是元素所占据的实际空间。也就是是说,盒子总宽度:width + margin,盒子总高度:height + margin。

总的来说,标准盒模型和 IE 盒模型的主要区别在于它们计算元素宽度和高度的方式不同。

题目二:css中的选择器有哪些?说说优先级?

CSS选择器是CSS规则的第一部分,它是元素和其他部分组合起来告诉浏览器哪个HTML元素应当是被选为应用规则中的CSS属性值的方式,选择器所选择的元素,叫做“选择器的对象”。

选择器的分类: 在css中,选择器共有如下几种,这些选择器可以单独使用,也可以组合使用。

ID 选择器:使用元素的 ID 属性进行选择,以 # 开头。例如,#header { color: red; } 会选择所有具有 id="header" 的元素。 类选择器:使用元素的类名进行选择,以 . 开头。例如,.btn { background-color: blue; } 会选择所有具有 class="btn" 的元素。 标签选择器:根据元素的标签名称进行选择。例如,div { font-size: 16px; } 会选择所有 <div> 元素。 后代选择器:选择指定元素内的后代元素。例如,div p { color: green; } 会选择所有 <div> 元素内部的 <p> 元素。 子元素选择器:选择指定元素的直接子元素。例如,ul > li { list-style-type: none; } 会选择所有 <ul> 下的直接子元素 <li>。 相邻兄弟选择器:选择指定元素之后紧跟的相邻兄弟元素。例如,h2 + p { font-weight: bold; } 会选择所有 <h2> 元素后面紧跟的 <p> 元素。 群组选择器:将多个选择器组合在一起,以逗号分隔,同时选择它们匹配的元素。例如,h1, h2, h3 { color: blue; } 会选择所有 <h1>、<h2> 和 <h3> 元素,并将它们的颜色设为蓝色。 属性选择器:根据元素的属性进行选择。例如,input[type="text"] { width: 200px; } 会选择所有 type 属性为 "text" 的 <input> 元素。 伪类选择器:根据元素的特定状态选择元素,例如鼠标悬停、访问状态等。例如,a:hover { text-decoration: underline; } 会选择鼠标悬停在 <a> 元素上时应用下划线样式。 伪元素选择器:向元素的特定部分添加样式,例如元素的前面或后面添加内容。例如,p::first-line { font-weight: bold; } 会将 <p> 元素的第一行文本加粗。

优先级: 相信大家对CSS选择器的优先级都不陌生:内联选择器 > ID选择器 > 类选择器 > 标签选择器。

到具体的计算层⾯,优先级是由 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:

如果存在内联样式,那么 A = 1, 否则 A = 0 B的值等于 ID选择器出现的次数 C的值等于 类选择器 和 属性选择器 和 伪类 出现的总次数 D 的值等于 标签选择器 和 伪元素 出现的总次数

题目三:请你说说css中的单位有哪些?

相信大家都知道,在css中单位的使用是十分重要的,因此无论是从适配性还是观赏性方面来讲,了解css的单位对于我们来说也是很有必要的。下面我来为大家介绍一下css中的单位有哪些:

在 CSS 中,常见的单位包括:

  1. 像素(px):相对长度单位,代表屏幕上的一个像素点。像素在网页设计中应用非常广泛,它的值是固定的,不受屏幕分辨率影响。
  2. 百分比(%):相对长度单位,相对于父元素的百分比。例如,width: 50%; 表示元素的宽度为父元素宽度的一半。
  3. EMS(em):相对长度单位,相对于元素的字体大小。例如,如果元素的字体大小为 16px,font-size: 1.5em; 将会使元素的字体大小为 24px(1.5 倍的 16px)。
  4. REM(rem):相对长度单位,相对于根元素(<html>)的字体大小。与 em 不同的是,rem 单位始终是相对于根元素的字体大小,这样可以更方便地控制整个页面的比例关系。
  5. Viewport 百分比单位(vw、vh、vmin、vmax):相对长度单位,相对于视口大小的百分比。
  6. vw(视口宽度):1vw 等于视口宽度的 1%。
  7. vh(视口高度):1vh 等于视口高度的 1%。
  8. vmin(视口宽度和高度中较小的那个):1vmin 等于视口宽度和高度中较小值的 1%。
  9. vmax(视口宽度和高度中较大的那个):1vmax 等于视口宽度和高度中较大值的 1%。
  10. 像素密度单位(dpi、dpcm、dppx) :用于描述输出设备的像素密度。
  • dpi(每英寸像素数):1dpi 表示每英寸有 1 个像素。
  • dpcm(每厘米像素数):1dpcm 表示每厘米有 1 个像素。
  • dppx(每像素点数):1dppx 表示每像素点数为 1。
@media print and (min-resolution: 300dpi) { /* 在打印时,当分辨率大于 300dpi 时应用的样式 */ }

这些单位可以根据具体的需求选择使用,能够灵活控制元素在不同设备上的大小和比例。

题目四:说说设备像素,css像素,设备独立像素,dpr,ppi的区别?

当谈论设备像素、CSS 像素、设备独立像素(DIP)、设备像素比(DPR)和像素每英寸(PPI)时,通常是在讨论屏幕分辨率、响应式设计和图像质量等相关概念。下面我来分别解释它们的含义和区别:

  1. 设备像素(Device Pixel) :也称物理像素,是显示设备(如手机屏幕、电脑显示器)实际的物理像素点。它们是构成屏幕图像的最小单位。通常以屏幕的分辨率来描述,比如 1920x1080 表示宽度为 1920 个像素、高度为 1080 个像素。
  2. CSS 像素(CSS Pixel) :是网页中使用的像素单位,通常在 CSS 中使用。它是一个抽象的单位,与设备无关,用于定义网页上的元素大小、间距等。在大多数情况下,1 个 CSS 像素对应于 1 个设备像素,但在高分辨率屏幕(如 Retina 屏幕)上,1 个 CSS 像素可能对应多个设备像素。
  3. 设备独立像素(Device Independent Pixel,DIP) :也称密度无关像素(Density Independent Pixel,DP)。它是一种与设备无关的逻辑像素单位,用于测量元素的尺寸和位置。在 Android 开发中,1 个 DIP 相当于屏幕上的 1 个物理像素,而在 iOS 开发中,1 个 DIP 可能对应于多个物理像素。
  4. 设备像素比(Device Pixel Ratio,DPR) :是设备像素和 CSS 像素之间的比率。它表示了在同样的物理尺寸下,设备像素的数量与 CSS 像素的数量之间的关系。例如,DPR 为 2 表示每个 CSS 像素由 2 个设备像素组成。
  5. 像素每英寸(Pixels Per Inch,PPI) :是用于描述显示器或打印机分辨率的单位,表示每英寸长度上的像素数量。PPI 越高,屏幕显示的图像就越清晰,因为像素更加密集。

下面我用iPhone SE手机的尺寸作为示例:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Pixel Example</title> <style> .box { width: 100px; /* 使用 CSS 像素定义宽度 */ height: 100px; /* 使用 CSS 像素定义高度 */ background-color: red; margin: 10px; /* 使用 CSS 像素定义外边距 */ } </style> </head> <body> <div class="box" id="box"></div> <script> // 获取元素 var box = document.getElementById('box'); // 获取设备像素比 var dpr = window.devicePixelRatio || 1; // 输出设备像素比 console.log('dpr:', dpr); // 输出设备分辨率 console.log('设备分辨率:', screen.width, 'x', screen.height); // 输出 CSS 像素大小 console.log('CSS px:', box.offsetWidth, 'x', box.offsetHeight); </script> </body> </html>

我们可以在浏览器的控制台看到以下的输出:

综上所述,设备像素是屏幕上实际的物理像素,CSS 像素是网页中使用的抽象单位,而设备独立像素是一个与设备无关的逻辑像素单位。DPR 表示设备像素和 CSS 像素之间的比率,而 PPI 则是描述屏幕或打印机分辨率的单位。在高分辨率屏幕上,DPR 可能会影响 CSS 像素与设备像素之间的关系,从而影响到页面的显示效果。

总的来说:

PC端 1px = 1物理像素:在大多数情况下,PC 端的浏览器会将 CSS 像素(1px)直接映射到屏幕的物理像素,即 1px 对应于 1 个物理像素。 页面缩放比为1:1时,1px = 1物理像素:当页面的缩放比例为 1:1 时,CSS 像素与物理像素的对应关系是一一对应的,即 1px 对应于 1 个物理像素。 设备像素 == 物理像素:在大多数情况下,设备像素和物理像素是同一个概念,都指的是屏幕上的实际像素点。 CSS像素==1px:在绝大多数情况下,1 个 CSS 像素等于 1px(像素单位),但在高分辨率屏幕上,1 个 CSS 像素可能会对应多个物理像素。 设备独立像素 ==分辨率:设备独立像素(Device Independent Pixels,DIP)是一个与设备无关的逻辑像素单位,它与屏幕的分辨率无关,而是表示屏幕上的一个虚拟像素。通常情况下,设备独立像素等于屏幕的分辨率。 dpr(设备像素比) = 设备像素/设备独立像素:设备像素比(Device Pixel Ratio,DPR)是设备像素和设备独立像素之间的比率。它表示了在同样的物理尺寸下,设备像素的数量与设备独立像素的数量之间的关系。 ppi(像素密度) = 设备像素/屏幕尺寸:像素密度(Pixels Per Inch,PPI)是用于描述屏幕分辨率的单位,表示每英寸长度上的像素数量。通常情况下,PPI 越高,屏幕显示的图像就越清晰,因为像素更加密集。

结语

以上就是本次笔者所整理的有关css面试的内容,后面本人还将继续完善css的面试考点。如有不足之处欢迎大家在评论区进行完善一下,大家一起为了进大厂而努力,一起加油吧!!!

假如您也和我一样,在准备春招。欢迎加微信shunwuyu,这里有几十位一心去大厂的友友可以相互鼓励,分享信息,模拟面试,共读源码,齐刷算法,手撕面经。来吧,友友们!


作者:沐渃清澄
链接:https://juejin.cn/post/7338717224436793394
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。