页面渲染机制这部分内容会分成两篇来进行讲解,这两篇里我们准备聊一下页面的渲染的过程,包括页面的加载、DOM 树的构建、CSSOM 树的构建、渲染树的构建和最后的渲染过程等。浏览器的渲染机制和网页的优化息息相关,只有知道了页面是怎么渲染出来的,才能在写代码的时候使用最合理的方式,比如知道了 CSS 文件的解析过程后就知道为什么要把 CSS 文件放在 HTML 的前边,知道为什么要少用@import 了。这一部分的内容,我们会先介绍渲染的整体过程,然后再把这个过程中比较重要的部分做详细介绍。

页面的加载和渲染全过程

当我们在浏览器里输入一个 URL 后,最终会呈现一个完整的网页。这中间会经历如下的过程:

HTML 的加载

输入 URL 后,最先拿到的是 HTML 文件。HTML是一个网页的基础,所以要在最开始的时候下载它。HTML下载完成以后就会开始对它进行解析。

其他静态资源下载

HTML 在解析的过程中,如果发现 HTML 文本里面夹杂的一些外部的资源链接,比如 CSS、JS 和图片等时,会立即启用别的线程下载这些静态资源。这里有个特殊的是 JS 文件,当遇到 JS 文件的时候,HTML 的解析会停下来,等 JS 文件下载结束并且执行完,HTML 的解析工作再接着来。这样做是因为 JS 里可能会出现修改已经完成的解析结果,有白白浪费资源的风险,所以 HTML 解析器干脆等 JS 折腾完了再干。

DOM 树构建

在 HTML 解析的同时,解析器会把解析完的HTML转化成DOM 对象,再进一步构建 DOM 树。

CSSOM 树构建

当 CSS 下载完,CSS 解析器就开始对 CSS 进行解析,把 CSS 解析成 CSS 对象,然后把这些 CSS 对象组装起来,构建出一棵 CSSOM 树。

渲染树构建

DOM 树和 CSSOM 树都构建完成以后,浏览器会根据这两棵树构建出一棵渲染树。

布局计算

渲染树构建完成以后,所有元素的位置关系和需要应用的样式就确定了。这时候浏览器会计算出所有元素的大小和绝对位置。

渲染布局计算完成以后,浏览器就可以在页面上渲染元素了。比如从 (x1, y1) 到(x2, y2)的正方形区域渲染成蓝色。经过渲染引擎的处理后,整个页面就显示在了屏幕上。

上面讲了一下浏览器从加载到渲染的大概过程,这部分内容是想让同学们对加载有个大概的印象,接下来我们把这个过程中比较重要的部分再详细讲解下。

DOM 树的构建

页面中的每一个 HTML 标签,都会被浏览器解析成一个对象,我们称它为文档对象(Document Object)。HTML 的本质是一个嵌套结构,在解析的时候会把每个文档对象用一个树形结构组织起来,所有的文档对象都会挂在一个叫做 Document 的东西上,这种组织方式就是 HTML 最基础的结构–文档对象模型(DOM),这棵树里面的每个文档对象就叫做 DOM 节点。

在 HTML 加载的过程中,DOM 树就在开始构建了。构建的过程是先把 HTML 里每个标签都解析成 DOM 节点(每个标签的属性、值和上下文关系等都在这个文档对象里),然后使用深度遍历的方法把这些对象构造成一棵树。

我们以下面的 HTML 文件为例:

Document

文章详情页

文章标题

吃葡萄不吐葡萄皮

不吃葡萄倒吐葡萄皮

在构建 DOM 树的时候,就是从最外层 HTML 节点开始,按深度优先的方式构建。之所以用深度优先,是因为 HTML在加载的时候是自上而下的,最先加载的是根节点,然后是根节点的第一个子节点

,再然后是head的第一个子节点…head构建完成后再去构建 body 部分的内容,以此类推。使用深度优先的方式构建这棵树就和文档的加载顺序吻合了。最后,上面这个 html 结构就会生成一棵 DOM 树。

CSSOM 树的构建

在浏览器构建 DOM 树的同时,如果样式也加载完成了,那么 CSSOM 树也在同步地构建。CSS 树和 DOM 类似,它的树形结构记录着所有样式的信息。

我们以给上面的 HTML 加上如下的样式:

body{

font-size: 16px;

}

// 去掉所有p元素的内外边距

p{

margin: 0;

padding: 0;

}

// 页面头部行高50px,文本垂直居中,隐藏

.header{

height: 50px;

line-height: 50px;

display: none;

text-align: center;

}

.header .page-name{

font-size: 20px;

}

// 文本区域左右两边留10px空白

.content{

padding: 0 10px;

}

.contetn .title{

font-seize: 20px;

}

// 内容区行高30px

.content .graph{

line-height: 30px;

}

// 文章中的图片用作块级元素,水平居中

.content img{

display: block;

margin: 0 auto;

}

我们就以这一组样式为例,这样一组样式中有公用的样式 p 和 body,有标题栏 .header 部分的样式,还有内容区 .content 部分的样式。

总结

这一篇讲了渲染的大致过程、DOM 树的构建和 CSSOM 树的构建。到这个阶段,渲染需要的基础工作就准备完成了。下一篇我们继续讲解,感兴趣的同学可以关注我的下一篇文章。

浏览器渲染机制面试_【前端面试必考题】页面渲染机制(一)相关推荐

  1. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染

    在这一篇文章中,我们将一起学习浏览器渲染原理这部分的知识.你可能会有疑问,我又不是做浏览器研发的,为什么要来学习这个?其实我们学习浏览器渲染原理更多的是为了解决性能的问题,如果你不了解这部分的知识,你 ...

  2. 如何开启jvm日志_直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解...

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

  3. java 重定向到某个页面并弹出消息_前端面试100问之浏览器从输入URL到页面展示发生了什么...

    点击蓝字,关注我们 『浏览器从输入URL到页面渲染发生了什么』作为一个经典题目,在前端面试中高频出现,很多大厂的面试都会从这个面试题出发,考察候选人对知识的掌握程度,这其中涉及到了网络.操作系统.We ...

  4. 前端面试系列-输入url后全过程页面渲染机制DOM生成过程

    文章目录 一.当输入url后,全过程 二.页面渲染机制 三.DOM 1.什么是 DOM 2.DOM 树如何生成 HTML 解析器 3.JavaScript 是如何影响 DOM 生成的 内嵌JavaSc ...

  5. 前端面试技巧和注意事项_前端面试百分之九十九过的技巧

    2020最全的前端面试指南,一个多月 1.8w 字的面试经验积累,凭借它最终成功入职大厂-- 今年的金三银四刚好赶上疫情,很多大公司都停止招聘甚至裁员,想跳槽的小伙伴被打的措手不及. 需求减少要求肯定 ...

  6. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?

    在每个前端求职者的面试过程中,一定都有过被面试官问到项目中的难点,而答不上来的情况.为了让大家在前端面试前准备得更加充足,小编准备了一些易被忽视且难度较高的前端面试题,希望可以帮助大家更加顺利完成求职 ...

  7. 置顶带滚动效果_前端面试:如何实现轮播图效果?

    本文将实现如上所示的轮播图.源代码 (https://github.com/z1ming/AKJS/tree/master/%E8%BD%AE%E6%92%AD%E5%9B%BE%E6%95%88%E ...

  8. 服务器前端机中转机制,『中高级前端面试』之终极知识点

    作者:陈大鱼头 Chrome浏览器进程 在资源不足的设备上,将服务合并到浏览器进程中 浏览器主进程 负责浏览器界面显示 各个页面的管理,创建以及销毁 将渲染进程的结果绘制到用户界面上 网络资源管理 G ...

  9. 【面试】前端面试八股文

    一.JS 1.使用 (1)标签引用 <script>alert("Hello,World!");</script> (2)文件引用 <script s ...

  10. java游戏服务器面试_服务器 面试

    Linux工作常见的面试题 linux运维工程师在面试的时候经常会被问到各种问题,接下来小编根据自己的经验将面试题整理下来供大家参考.linux面试题整理linux面试题整理 取出文件aaa.txt的 ...

最新文章

  1. 搭建Docker私有仓库--自签名方式
  2. metasploit-smb扫描获取系统信息
  3. 哪种编程语言又快又省电?有人对比了27种语言
  4. 提高Excel中VBA效率的四种方法
  5. c语言编译机器码,[转载]单片机C语言到机器码的全过程
  6. xshell通过隧道连接_DNS安全之隧道攻击
  7. “AS3.0高级动画编程”学习:第二章转向行为(下)
  8. 1-8:学习shell之高级键盘技巧
  9. Strust2初之体验
  10. js中追加写入文件(字符串追加)_note
  11. 首批 8 款 5G 手机获 3C 认证;iPhone6 系列停产;Android Q Beta 5 发布 | 极客头条
  12. 二叉树遍历(深度优先+广度优先)
  13. mysql中什么是dml语句_mysql---DML语句
  14. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
  15. Tapestry 5简介
  16. SecureCRT远程连接虚拟机
  17. 我的世界pe服务器坐标怎么显示,我的世界手机版坐标怎么看 PE版没有MOD怎么查看坐标...
  18. 小白都能看懂的go语言包管理工具DEP详解
  19. UE4 actor碰到炸弹血条减少
  20. 《历》·陕西帝王陵寝一览

热门文章

  1. 11座城市,58个.NET最新岗位速览,内推直通面试官!
  2. .Net Core Configuration Etcd数据源
  3. 还不明白可空类型原理? 我可要挖到底了
  4. 微软宣布加入 OpenJDK,看网上各派的热闹
  5. 分布式Redis的分布式锁 Redlock
  6. 微软携手红帽,共筑开源新未来
  7. .net core通过多路复用实现单服务百万级别RPS吞吐
  8. .NET Core微服务之基于IdentityServer建立授权与验证服务
  9. .NET Core 在中国的现状调研
  10. 入门干货之Electron的.NET实现-Electron.NET