前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)

这篇具有很好参考价值的文章主要介绍了前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.浏览器渲染原理

二.渲染时间点

三.渲染流水线

1.解析html(Parse HTML)

1.1解析成DOM树(document object model)

1.2解析成CSSOM树(css object model)

2.样式计算(Recalculate Style)

3.布局(Layout)

4.分层(Layer)

5. 绘制(Paint)

6.分块(Tiling)

7. 光栅化(Raster)

8. 画(Draw)

四.附加面试题

1.什么是 reflow?

2.什么是 repaint?

3.为什么 transform 的效率高?


一.浏览器渲染原理

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

浏览器是如何渲染页面的?

当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。

在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。

整个渲染流程分为多个阶段,分别是: HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画

每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。

这样,整个渲染流程就形成了一套组织严密的生产流水线。

二.渲染时间点

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

当浏览器的网络线程接收到HTML文档后,会产生一个渲染任务,并将其传递给消息队列,在事件循环机制的作用下,渲染主线程(render thread)取出消息队列中的渲染任务,开启渲染

三.渲染流水线

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

1.解析html(Parse HTML)

首先将html和css分别解析成DOM树和CSSOM树

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

1.1解析成DOM树(document object model)

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

为什么要先解析成树状结构内,因为HTML文档是很多杂乱的字符,为了更清楚它们之间的逻辑,更好地进行后续的渲染步骤,浏览器先选择将它们解析成更加清晰的逻辑结构

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

1.2解析成CSSOM树(css object model)

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

解析过程中遇到 CSS 解析 CSS,遇到 JS 执行 JS。为了提高解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载 HTML 中的外部 CSS 文件和 外部的 JS 文件。

如果主线程解析到`link`位置,此时外部的 CSS 文件还没有下载解析好,主线程不会等待,继续解析后续的 HTML。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

如果主线程解析到`script`位置,会停止解析 HTML,转而等待 JS 文件下载好,并将全局代码解析执行完成后,才能继续解析 HTML。这是因为 JS 代码的执行过程可能会修改当前的 DOM 树,所以 DOM 树的生成必须暂停。这就是 JS 会阻塞 HTML 解析的根本原因。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

第一步完成后,会得到 DOM 树和 CSSOM 树,浏览器的默认样式、内部样式、外部样式、行内样式均会包含在 CSSOM 树中。

2.样式计算(Recalculate Style)

主线程会遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为 Computed Style。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

在这一过程中,很多预设值会变成绝对值,比如`red`会变成`rgb(255,0,0)`;相对单位会变成绝对单位,比如`em`会变成`px`

这一步完成后,会得到一棵带有样式的 DOM 树。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

3.布局(Layout)

接下来是布局,布局完成后会得到布局树。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

布局阶段会依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。例如节点的宽高、相对包含块的位置。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

大部分时候,DOM 树和布局树并非一一对应。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

比如`display:none`的节点没有几何信息,因此不会生成到布局树;又比如使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。还有匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

4.分层(Layer)

下一步是分层

主线程会使用一套复杂的策略对整个布局树中进行分层。

分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率。

滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过`will-change`属性更大程度的影响分层结果。
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

5. 绘制(Paint)

再下一步是绘制

主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

渲染主线程的工作到这里就结束了,剩下的工作交给其他线程来完成

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

6.分块(Tiling)

完成绘制后,主线程将每个图层的绘制信息提交给合成线程,剩余工作将由合成线程完成。

合成线程首先对每个图层进行分块,将其划分为更多的小区域。

它会从线程池中拿取多个线程来完成分块工作。
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

这是csdn网页的分块图

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

分块工程是交给多个线程同时进行的

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

7. 光栅化(Raster)

分块完成后,进入光栅化阶段。

优先处理靠近视口的块

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

合成线程会将块信息交给 GPU 进程,以极高的速度完成光栅化。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

GPU 进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块。

光栅化的结果,就是一块一块的位图

8. 画(Draw)

最后一个阶段就是画了

合成线程拿到每个层、每个块的位图后,生成一个个「指引(quad)」信息。

指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。

变形发生在合成线程,与渲染主线程无关,这就是`transform`效率高的本质原因。

合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终的屏幕成像。

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理),前端秘法,前端,javascript

四.附加面试题

1.什么是 reflow?

reflow 的本质就是重新计算 layout 树。

当进行了会影响布局树的操作后,需要重新计算布局树,会引发 layout。

为了避免连续的多次操作导致布局树反复计算,浏览器会合并这些操作,当 JS 代码全部完成后再进行统一计算。所以,改动属性造成的 reflow 是异步完成的。

也同样因为如此,当 JS 获取布局属性时,就可能造成无法获取到最新的布局信息。

浏览器在反复权衡下,最终决定获取属性立即 reflow。

2.什么是 repaint?

repaint 的本质就是重新根据分层信息计算了绘制指令。

当改动了可见样式后,就需要重新计算,会引发 repaint。

由于元素的布局信息也属于可见样式,所以 reflow 一定会引起 repaint。

3.为什么 transform 的效率高?

因为 transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个「draw」阶段

由于 draw 阶段在合成线程中,所以 transform 的变化几乎不会影响渲染主线程。反之,渲染主线程无论如何忙碌,也不会影响 transform 的变化。文章来源地址https://www.toymoban.com/news/detail-831720.html

到了这里,关于前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Google play开发者账号隔离用指纹浏览器还是vps?哪个防关联效果更佳?

    很多谷歌安卓开发者会通过矩阵、马甲包的方式,在Google play应用商店上获得更多的流量和收益,这需要多个开发者账号,因此开发者账号隔离问题的重要性不言而喻。 在Google play开发者账号的隔离防关联问题上,使用vps和指纹浏览器是开发者们常用的两种方式。这两种方式

    2024年02月06日
    浏览(41)
  • 前端---需要了解浏览器相关知识--浏览器请求服务器资源---缓存

    掘金1:浏览器缓存 掘金2 :浏览器缓存 跟别人怎么讲,从大的说:缓存的原理是什么? 再说什么是浏览器缓存? 浏览器缓存 请求(静态资源 | 动态资源) 一、缓存是什么? 二、为什么? 浏览器是如何判断是否使用缓存的??第一次请求网页 第二次请求相同网页: 三、怎

    2024年02月12日
    浏览(36)
  • 【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)

    大家好啊,辣条哥又来猛货了! 小白慎入! Puppeteer 是 Google 基于 Node.js 开发的一个工具,而 Pyppeteer 又是什么呢?它实际上是Puppeteer 的 Python 版本的实现,但它不是Google 开发的,是一位来自于日本的工程师依据Puppeteer 的一些功能开发出来的非官方版本。 在 Pyppetter 中,实际

    2024年02月16日
    浏览(43)
  • 前端高级面试题-浏览器

    1 事件机制 事件触发三阶段 document 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 document 传播,遇到注册的冒泡事件会触发 注册事件 通常我们使⽤ addEventListener 注册事件,该函数的第三个参数可以是布尔值,也可以是对

    2024年02月15日
    浏览(35)
  • 【前端】浏览器的渲染流程(完整)

    本文主要包含以下内容: 浏览器渲染整体流程 解析 HTML 样式计算 布局 分层 生成绘制指令 分块 光栅化 绘制 常见面试题 浏览器,作为用户浏览网页最基本的一个入口,我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入网页地址,敲下回车的那一刻,浏

    2024年02月04日
    浏览(36)
  • 前端实现浏览器自定义滚动条

    最近有个项目,产品觉得浏览器默认滚动条太丑了。想美化一下,比如自定义颜色,加上圆角,宽高都要更改一下。我查了资料和文档总结了一下 写法,特此记录以便之后使用。 scrollbar-width scrollbar-width 属性允许开发者在元素显示滚动条时设置滚动条的最大宽度。 语法: 取值

    2024年04月10日
    浏览(32)
  • 前端性能优化之浏览器渲染优化

    在当今互联网高速发展的时代,用户对于网页加载速度和性能的要求越来越高。作为前端开发者,我们需要关注并致力于提升网页的加载和渲染性能,以提供更好的用户体验。而浏览器渲染优化正是我们实现这个目标的关键。在本文中,我们将探讨一些关于浏览器渲染优化的

    2024年02月11日
    浏览(25)
  • 解决前端浏览器兼容性问题

    解决前端浏览器兼容性问题时前端开发中的一项重要任务。以下是一些常用的方法来解决这类问题: 1、使用css前缀: 不同浏览器可能对某些CSS属性有不同的前缀要求。可以使用CSS前缀来覆盖不同浏览器的样式需求。例如,使用 -webkit 前缀来适配WebKit(Chrome、Safari)浏览器

    2024年02月09日
    浏览(29)
  • 前端浏览器滚动条炫酷美化

    🌏 博客首页: 春波petal 📑 文章摘要: 前端   浏览器滚动条美化 💌 春波寄语: 故木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。 废话不多说,直接copy代码使用 本篇博客文章模板唯一版权归属 ©春波petal

    2024年02月02日
    浏览(41)
  • web大前端面试——浏览器、网络和安全

    (1).DNS解析 当我们在浏览器中输入一个域名的时候,例如www.mi.com,这个域名只是与IP地址的一个映射,这时DNS解析就要充当一个翻译的角色,把域名解析成真实的IP地址。所以DNS解析的过程实际上就是将域名还原成真实IP地址的过程。 DNS的解析又分为以下几个步骤: 1.浏览器会

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包