首页 > 其他分享 >浏览器是如何渲染页面的?

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

时间:2024-11-25 20:25:01浏览次数:8  
标签:浏览器 DOM 渲染 HTML 线程 解析 页面

初次发布于我的个人文档。(每次都是个人文档优先发布哦)

在上次我们以浏览器的事件循环为例简要介绍了如何调度异步资源,这一次要来填个坑,介绍一下浏览器是如何渲染页面的。没看过上一期的话就先看一下上一期的开头,了解一下浏览器的多进程图景。

1.解析HTML

在上一期我们讲到,浏览器的页面由渲染进程完成,在这一期你将看到渲染进程是一个包含了渲染主线程等多个线程的进程。

当浏览器通过网络进程向服务器发送请求得到响应的HTML文本后,他要做的第一个工作就是解析收到的HTML文本。

对于大部分标签,建立对应的DOM树。对于CSS,建立对应的CSSOM树。

但是当解析工作遇到link的时候,按道理就需要去下载对应的css,但是我们知道网络IO是一个耗时比较长的过程,所以这个步骤也会阻塞渲染主线程。

因此,浏览器并不是以这个方式解析的。

而是先启动一个预解析线程,预先快速"浏览"一下HTML标签,下载HTML文本引用的外部CSS文件和JS文件。

当渲染主线程遇到一般的标签那就解析成DOM,但是当渲染主线程遇到link引用CSS的时候,渲染主线程将不会等待,直接解析下面的其他内容。(异步)

那么外部的CSS由谁解析呢?

由和刚刚说的预解析线程解析。

那外部JS呢?

JS比较特殊,现在来讲。

由于在JS中存在改变DOM树和CSSOM树的可能,所以JS的解析完全由渲染主线程操刀,并且当渲染主线程遇到script标签的时候,它会暂停现有的对HTML的解析(阻塞),等待预解析线程把对应的JS代码下载好,并且需要等到全局代码都被解析执行完成之后才继续解析HTML文本。

总之,解析过程就是得到DOM和CSSOM的过程,此时的CSSOM已经是一个包含浏览器默认样式、内部样式、外部样式、行内样式的比较完整的树结构了。

2.样式计算

之所以说是“比较完成的树”是因为此时CSSOM里还保留着em等相对值和计算属性,这一步就是将这些相对值和计算属性计算出来。

计算之后的就是最终样式computed style了。

非常简单,不需要多说什么其他话了。

3.布局

第三步是根据前面的信息对页面进行布局,生成布局树。

在这一步渲染主线程要遍历全部的DOM,计算他们的位置信息和几何信息。

但是注意,布局树和DOM树并不完全一致。

对于CSS为display:none的元素,由于他们不显示,所以不会在布局树中。DOM中不存在伪元素节点,但我们知道伪元素节点都有几何信息所以他们存在于布局树中。

由于存在规定

内容必须在行盒中

行盒和块盒不能相邻

所以,在布局这一步还会生成一些匿名的行盒或者块盒来使得页面满足这一规则。

4.分层

接下来,渲染主线程会对布局树的元素进行分层。这是一个优化的方法,当将来某一层改变后就只需要对这一层的元素进行对应改变就可以了,这将提高浏览器的性能。

5.绘制

接下来,绘制这一步就是为每一层生成对应的绘制指令,你可以理解为canvas之类的东西。

啊,什么把画笔移动到哪里哪里,然后向哪里哪里花一条直线什么的。

到生成绘制指令这一步,渲染主线程的任务才算结束。

6.分块

接下来压力给到了合成线程。啊,其实也不全是。

分块的工作要交给很多个被称为分块器的线程协作完成。

所谓分块就是字面意思,将每一层的元素分为若干小块,以便后续步骤的分工。

7.光栅化

一看到光栅化这个词已经有人在瑟瑟发抖了吧,其实很简单的。

就是把前面分的每一块变成位图。

或者说,合成线程会将每一个块的信息交给显卡(GPU)进程来绘制我们真正能看到的图像。

当然GPU进程会开多个线程来同时绘制图像,并且它将优先计算靠近视口的块,因为用户正在看那里嘛。

8.绘制

这一步是最后一步了。

合成线程在拿到GPU渲染的一张张位图后,将生成指引(quad)信息,标注出每个位图应该画在屏幕的哪个位置,要不要进行选择和缩放等。

CSS中的transform正是也只是作用于这一阶段,这也是其运行效率高的本质原因。

当生成指引信息后,合成线程会将指引信息传递给GPU进程,然后GPU进程会产生系统调用操作显卡硬件绘制用户真正能看到的页面图像。

9.后记

这就是浏览器渲染一个页面的全部步骤了。

了解这个或许没有什么用,额可能吧。

不过可以让你小心一点。

有一些操作会影响布局树,这时浏览器会从第三步重新开始后面的全部过程了,这被称为回流/重排(reflow),如果可以的话应该尽量避免这样的操作。

当然,当你连续多次进行修改布局树的操作,浏览器会进行优化,自动合并这些操作,等对应的JavaScript代码全部完成后才统一进行一次reflow。

但是这也意味着,这时JavaScript获取的布局属性可能是不准确的,为了避免这种情况,当JavaScript代码尝试获取布局属性的时候浏览器会立刻进行reflow操作而不是等待代码全部运行完成。所以这种情况也应该规避。

而当你改变了DOM的几何信息的时候,浏览器就需要从绘制这一步重新开始,这一过程被称为重绘(repaint)

这个效率会比reflow高一些,因为reflow是从第三步布局开始,也会经历完repaint经历的全部过程。(也有说法称reflow会引起repaint,从结果上看两种说法没有任何区别,你怎么理解都可以)

但是还得是transform高效啊,只影响了最后一步绘制,只有合成线程受到影响了而已,这效率高的不是一点半点啊。

标签:浏览器,DOM,渲染,HTML,线程,解析,页面
From: https://www.cnblogs.com/ColaBlack/p/18568549

相关文章

  • 本地Docker部署Neko虚拟浏览器并实现远程与好友共享网页协同办公
    ......
  • ArkTS四种渲染控制能力
    大家好,我是V哥。ArkTS是OpenHarmony框架的一部分,提供了声明式UI渲染的能力。下面来对ArkTS中四种渲染控制能力:if/else、ForEach、LazyForEach和ContentSlot详细介绍一下:1.if/else渲染控制if/else是ArkTS提供的基本逻辑控制语法,用于基于条件动态控制组件的渲染......
  • vxe-table 秒级渲染万级数据、极致流畅横向虚拟滚动与纵向虚拟滚动+自适应动态行高
    官网:https://vxetable.cn/以前老版本不支持虚拟滚动动态行高,vxe-table新版本发布后,已经可以支持虚拟滚动和动态行高了。如果需要同等行高,只需加上show-overflow就可以了,同等行高的渲染性能是最优的,动态行高支持的最大数量低非常多。建议非必要的场景应该使用同等行高,特殊需求......
  • OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率
    前言  对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到osgUtil::Simplifier简化器,来对其进行简化。 Demo       osgUtil  osgUtil库是osg的四大核心库之一,OSG核心库提供了用于场景图形操作的核心场景图形功能、类和方法;......
  • 前端如何优雅通知用户刷新页面? 转载
    原文链接:https://juejin.cn/post/7439905609312403483前言老板:新的需求不是上线了嘛,怎么用户看到的还是老的页面呀窝囊废:让用户刷新一下页面,或者清一下缓存老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面呀,感觉用户体验不好啊,不能直接刷新页面嘛?窝囊废:可以......
  • 说说visibility属性的collapse属性值有什么作用?在不同浏览器下有什么区别?
    visibility:collapse;的作用是隐藏元素,但在某些情况下会保留元素占据的空间。它的行为与visibility:hidden;相似,主要区别在于表格元素(table,row,column等)。对大多数元素:visibility:collapse;的效果与visibility:hidden;完全相同。元素被隐藏,但仍占据其布局空间。这......
  • 如何使用js来截图?怎样截可见区域和整个页面?
    在前端使用JavaScript进行截图,主要依赖于html2canvas这个库。它可以将DOM元素渲染成Canvas,然后你可以将Canvas转换为图片。1.使用html2canvas截取可见区域:importhtml2canvasfrom'html2canvas';constcaptureVisibleArea=()=>{html2canvas(document.body......
  • 页面布局中的结构与表现分离,那么什么是结构?什么是表现呢?
    在前端开发中,结构与表现分离是构建网页的一个重要原则。它指的是将网页的内容结构(Structure)与视觉呈现(Presentation)分开处理。这样做的好处在于提高代码的可维护性、可重用性和可访问性。结构(Structure):指的是网页的内容和组织方式,它关注的是“网页是什么”。结构......
  • 什么是无头浏览器及其使用特点
    如果您从事数据科学、网站开发和测试、SEO和UX/UI设计工作,无头浏览器可能会派上用场。任何网站安全措施的基石都是区分人类和机器人的能力。一旦识别出机器人,其IP地址就会被标记和阻止。识别机器人的一种方法是比较机器人和人类的行为模式。即使使用先进的随机器,机器人也......
  • python本地保存浏览器文件夹
    BIGSMATER/local-bookmark其实就是找到本地文件,json解析然后dfs,文件名上有点坑,暴力替换即可importjsonimportosfromseleniumimportwebdriver#refs:#https://blog.csdn.net/Demonslzh/article/details/125062240#https://www.cnblogs.com/superhin/p/12600358.html......