浏览器渲染机制

为什么要了解浏览器渲染页面机制?主要是还是性能的优化。

  • 了解浏览器如何进行加载,我们可以在引用外部样式文件、外部JS时,将它们放到合适的位置,是浏览器以最快的速度,将文件加载完毕。
  • 了解浏览器如何进行解析,我们可以在构建DOM结构,组织CSS选择器的时候,选择最优的写法,提高浏览器的解析速率。
  • 了解浏览器如何进行渲染,明白渲染的过程,我们在设置元素属性,编写JS文件时,可以减少“重绘”、“重新布局”的消耗。

要了解清楚浏览器渲染机制,要先弄明白几个基本概念。

  • DOM:Document Object Model,浏览器将HTML解析成树形的数据结构,简称DOM。
  • CSSOM:CSS Object Model,浏览器将CSS解析成树形的数据结构,简称CSSOM。
  • Render Tree:DOM和CSSOM合并后生成Render Tree。
  • Layout:计算出Render Tree每个节点的具体位置。
  • Painting:通过显卡,将Layout后的节点内容分别呈现到屏幕上。

流程机制如下图所示:

浏览器渲染机制

需要注意的地方

  • 当浏览器获得HTML文件后,会自上而下的加载,并在加载过程中进行解析和渲染。
  • 加载说的是获取资源文件的过程。如果在加载过程中遇到外部CSS文件和图片,浏览器会另外发送一个请求,去获取CSS文件和相应的图片,这个请求时异步的,并不会影响HTML文件的加载。
  • 如果遇到JS文件,HTML文件会挂起渲染的进程,等待JS文件加载完毕后,在继续进行渲染。因为JS可能会修改DOM,导致后续HTML资源白白加载,所以HTML必须等待JS文件加载完毕后,再继续渲染,这也是为什么前端开发人员 常常 将JS文件写在底部body标签前的原因。

浏览器渲染的整个流程,如下图所示

浏览器渲染机制

转成文字描述的话,就是:

  • 当用户输入一个URL时,浏览器就会向服务器发出一个请求,请求URL对应的资源。
  • 接受到服务器的响应内容后,浏览器的HTML解析器,会将HTML文件解析成一棵DOM树,DOM树的构建时一个深度遍历的过程,当前节点的所有子节点都构建完成以后,才会去构建当前节点的下一个兄弟节点。
  • 将CSS解析成CSSOM树(CSS Rule Tree)
  • 根据DOM树和CSSOM树,来构建Render Tree(渲染树),渲染树并不等于DOM树,因为一些像head或display:none的东西,不在渲染树中。
  • 有了Render Tree,浏览器已经能知道网页中有哪些节点,各个节点的CSS定义,以及它们的从属关系,下一步操作就是Layout,就是计算出每个节点在屏幕中的位置。
  • Layout后,浏览器已经知道哪些节点要显示,每个节点的CSS属性是什么,每个节点在屏幕中位置是哪里,就进入了最后一步painting。按照计算出来的规则,通过显卡,把内容画到屏幕上。
Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2019年3月25日
Next 2019年6月3日

相关推荐

  • HTTP三次握手与四次挥手详解

    前端工程师面试的时候,关于HTTP三次握手是最常被询问的一个知识点,往往很多人,都是知道其原理及过程,就是用话语表达不出来,正式一点,就是词不达意。今天浏览到一篇关于HTTP三次握…

    2019年12月6日
    1.6K
  • vue开发小程序项目总结

    最近全权负责一个小程序的前端开发工作,之前小程序使用原生技术开发过一版,当时由于进入项目组晚,且项目开发周期短,没有详细了解项目的各种情况,导致后期开发过程中出现各种各样的让人烦心…

    2020年11月24日
    1.4K
  • 异步神器async-await

    async-await和Promise的关系 async-await是建立在promise机制之上 ,async-await是promise和generator的语法糖。增强了代码…

    2019年6月3日
    1.5K
  • typeof 和 instanceof的区别

    在前端开发过程中,typeof与instanceof是经常要用到的, 了解两者的区别是每一个合格前端工程师所要掌握的。 JavaScript中typeof和instanceof常用…

    2019年6月18日
    1.6K
  • CSS布局之圣杯与双飞翼布局

    所谓圣杯布局和双飞翼布局其实解决的问题是相同的,都是解决左右两栏固定宽度,中间部分自适应,其中某部分内容比其他内容高的时候,保证三者元素等高。他俩的区别就是:圣杯用padding。…

    2019年6月18日
    1.8K
  • WEB前端工程师必备技能

    前端开发到底是一个怎样的工作?都需要掌握什么技能?怎样区分初级、中级、高级?作为一名前端开发工程师,应该朝哪个方向发展?怎样提升自己的专业技能…… 你是否也曾有这样一些疑问,你的这…

    2019年6月6日
    2.8K
  • Angular与vue对比

    Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面。当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强。如今,已有许多开发…

    2019年6月13日
    1.7K
  • 简单酷炫的hover效果,值得收藏

    在浏览B站的时候,发现一个简单酷炫的hover效果的制作视频。浏览完之后,发现其中包含的知识点蛮经典的,特此收藏。 HTMl结构布局很普通,就是简单的一个水平垂直方向居中的表单,代…

    2020年7月20日
    1.8K
  • 前端开发工程师怎样独立调试前端项目?

    在前后端分离开发的大环境下,前端开发已经不仅仅局限于所谓的切图,写页面的工作,同时,也给前端开发定义了新的含义。有前后端分离项目开发的工程师,都知道,这样的项目开发起来有多么的方便…

    2020年8月31日
    1.5K
  • Webpack入门,打包第一个工程

    简介 Webpack是一个开源的JavaScript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件(有时会多个)…

    2022年11月8日
    410

发表回复

Please Login to Comment