浏览器渲染原理

渲染原理

    • 第一步解析Html
    • 第二步样式计算
    • 第三步布局
    • 第四步分层
    • 第五步绘制
    • 第六步分块
    • 第七步光栅化
    • 第八步画
    • 常见面试题
      • 什么是回流reflow?
      • 什么是重绘repaint?

当浏览器的网络线程收到HTML文档之后,会产生一个渲染任务并且会将其传递给渲染主线程的消息队列,在事件循环机制的作用下,渲染的主线程会将消息队列中的渲染任务取出来进行渲染流程。其中前五步骤为渲染的主线程。
如果想更了解浏览器和Node的事件循环机制,请转接这篇文章;

第一步解析Html

浏览器为了提高解析效率,会在开始解析之前进行一个预解析的线程,该线程主要任务就是预解析下载外部的CSS样式和外部JS样式,在解析完成后,会生成DOM树和CSSOM树,CSSOM树包括行内样式,默认样式,内部样式,外部样式。

为什么CSS不会阻塞HTML解析,而JS会阻塞HTML解析进程???

如果主线程解析到link的位置,而此时外部的CSS样式并没有解析下载完成,主线程不会等待会直接解析后面的HTML,这是因为CSS外部样式的解析下载是在预解析线程中进行的;
在这里插入图片描述

而如果解析进行到script的位置,此时主线程会停下等待JS文件解析下载好,之后再进行后续的HTML解析,这是因为JS的代码执行过程中可能会更改DOM树的结构,所以DOM树的生成必须暂停;

在这里插入图片描述
如果遇到的script标签带有deferasync属性;

  • defer 下载不阻塞页面渲染,等到HTML文档解析完成之后,DOMContentLoaded事件的触发前, 才执行该脚本
  • async 下载不阻塞页面渲染,但是会停止HTML文档的解析,先执行脚本之后再进行HTML解析

第二步样式计算

主线程会遍历得到的DOM树,依次为树中的每个节点计算出他们的最终样式,这个被称为Computed Style,在这个过程中,预设值会变成绝对值,相对单位会变成绝对单位;例如:red会变成rgb(255,0,0)em会变成px,随后就会得到一颗带有样式的DOM树。

第三步布局

布局完成后会得到布局树(layout树)。在布局阶段会依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。

大部分时候,DOM 树和布局树并非一一对应。
DOM树:与 HTML 标签一一对应,包括 head 和隐藏元素
布局树:不包括 head 和隐藏元素,布局树只会展示 DOM 树下的几何信息

比如display:none的节点没有几何信息,因此不会生成到布局树;又比如使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。

第四步分层

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

主线程需要遍历布局树来创建一棵层次树(Layer树), 滚动条,堆叠上下文, transformopacity 等样式或多或者的影响分层结果,我们可以通过 will-change 属性更大程度的影响分层结果。如果在页面中我们有一个元素,要经常重排重绘,我们可以通过 will-change: transform;告诉浏览器,将来元素会发生变化,让浏览器自行决策是否进行单独分层。

第五步绘制

主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。

在完成绘制后,主线程的任务宣告结束。,之后主线程会将每个图层的绘制信息交给合成线程来完成后续工作。

什么是合成线程呢?

合成是一种将页面分成若干层,然后分别对它们进行光栅化,最后在一个单独的线程 - 合成线程里面合并成一个页面的技术。当用户滚动页面时,由于页面各个层都已经被光栅化了,浏览器需要做的只是合成一个新的帧来展示滚动后的效果罢了。页面的动画效果实现也是类似,将页面上的层进行移动并构建出一个新的帧即可。

第六步分块

启动合成线程,每个图层进行分块,将其划分为更多的小区域

它会从线程池中拿取多个线程来完成分块工作。

第七步光栅化

一旦Layer 树被创建,渲染顺序被确定,主线程会把这些信息通知给合成器线程,合成器线程开始对层次数的每一层进行光栅化。有的层的可以达到整个页面的大小,所以合成线程需要将它们切分为一块又一块的小图块,之后将这些小图块分别进行发送给一系列光栅线程进行光栅化,结束后光栅线程会将每个图块的光栅结果存在GPU Process的内存中。为了优化显示体验,那些在视口中的或者视口附近的层先被光栅化。

文档结构、元素的样式、元素的几何关系、绘画顺序,这些信息我们都有了,这个时候如果要绘制一个页面,我们需要做的是把这些信息转化为显示器中的像素,这个转化的过程,叫做光栅化。

第八步画

合成线程拿到每个层、每个块的位图后,生成一个个指引信息。指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。

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

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

常见面试题

什么是回流reflow?

当DOM变化影响了元素,比如元素的尺寸、布局、显示隐藏等改变了,需要重写构建。每个页面至少需要一次回流,就是在页面第一次加载的时候,这个时候一定会发生回流。为了避免连续的多次操作导致布局树反复计算,浏览器会合并这些操作,当 JS 代码全部完成后再进行统一计算。所以,改动属性造成的reflow 是异步完成的。当 JS 获取布局属性时,就可能造成无法获取到最新的布局信息,所以浏览器会在获取属性时立即 reflow

什么是重绘repaint?

当一个元素的外观发生变化(可见样式更改),但是没有改变布局,重新渲染元素的外观。比如background-colorcolor。由于元素的布局信息也属于可见样式,所以reflow 一定会引起 repaint

如何避免回流重绘:

  • 避免使用table布局
  • 尽可能在DOM树的最末端改变class
  • 不要频繁的操作元素的样式
  • 避免设置多层内联样式
  • 开启GPU加速
  • 使用absolute或者fixed,脱离标准文档流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式系统应用-LVGL的应用-平衡球游戏 part2

平衡球游戏 part2 4 mpu60504.1 mpu6050 介绍4.2 电路图4.3 驱动代码编写 5 游戏界面移植5.1 移植源文件5.2 添加头文件 6 参数移植6.1 4 mpu6050 4.1 mpu6050 介绍 MPU6050是一款由InvenSense公司生产的加速度计和陀螺仪传感器,广泛应用于消费电子、机器人等领域…

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考(不要直接拷贝用)多行匹配配置过滤配置最终配置(一、多行匹配、直接读取日志文件、EFK方案&#…

JS实现高效导航——A*寻路算法+导航图简化法

一、如何实现两点间路径导航 导航实现的通用步骤,一般是: 1、网格划分 将地图划分为网格,即例如地图是一张图片,其像素为1000*1000,那我们将此图片划分为各个10*10的网格,从而提高寻路算法的计算量。 2、标…

【分页查询】.NET开源 ORM 框架 SqlSugar 系列

💥 .NET开源 ORM 框架 SqlSugar 系列 🎉🎉🎉 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

AI - 谈谈RAG中的查询分析(2)

AI - 谈谈RAG中的查询分析(2) 大家好,RAG中的查询分析是比较有趣的一个点,内容丰富,并不是一句话能聊的清楚的。今天接着上一篇,继续探讨RAG中的查询分析,并在功能层面和代码层面持续改进。 功…

Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件: 安装Node.js:Node.js官网 下载Node.js安装包。建议选择L…

redis核心命令全局命令 + redis 常见的数据结构 + redis单线程模型

文章目录 一. 核心命令1. set2. get 二. 全局命令1. keys2. exists3. del4. expire5. ttl6. type 三. redis 常见的数据结构及内部编码四. redis单线程模型 一. 核心命令 1. set set key value key 和 value 都是string类型的 对于key value, 不需要加上引号, 就是表示字符串…

哈希及其模拟实现

1.哈希的概念 顺序结构以及平衡树中,元素的关键码与其存储位置之间没有对应的关系。因此,在查找一个元素时,必须要经过关键码的多次比较。顺序查找的时间复杂度为O(N),平衡树中为树的高度,即O(log_2 N),搜…

k8s,声明式API对象理解

命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…

开源ISP介绍(1)——开源ISP的Vivado框架搭建

开源github链接:bxinquan/zynq_cam_isp_demo: 基于verilog实现了ISP图像处理IP 国内Gitee链接:zynq_cam_isp: 开源ISP项目 基于以上开源链接移植项目到正点原子领航者Zynq7020开发板,并对该项目的Vivddo工程进行架构详解,后续会…

[Redis#13] cpp-redis接口 | set | hash |zset

目录 Set 1. Sadd 和 Smembers 2. Sismember 3. Scard 4. Spop 5. Sinter 6. Sinter store Hash 1. Hset 和 Hget 2. Hexists 3. Hdel 4. Hkeys 和 Hvals 5. Hmget 和 Hmset Zset 1. Zadd 和 Zrange 2. Zcard 3. Zrem 4. Zscore cpp-redis 的学习 主要关注于…

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集,目的评估视觉-语言模型(VLM)在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白,提供了超过10,000个经过人工验证的指…

设计模式 更新ing

设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客&#xff0…

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时,变小,往左边找梯度接近0的值。 当梯度小于0时,减去一个负数会变大,往右边找梯度接近0的值,此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码,比如写一个小程序使电脑关机&#xf…

基础入门-Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响

知识点: 1、基础入门-Web应用-防护产品-WAF保护 2、基础入门-Web应用-加速服务-CDN节点 3、基础入门-Web应用-文件托管-OSS存储 4、基础入门-Web应用-通讯服务-反向代理 5、基础入门-Web应用-运维安全-负载均衡 一、演示案例-Web-拓展架构-WAF保护-拦截攻击 原理&a…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…

002-日志增强版

日志增强版 一、需求二、引入依赖三、配置日志处理切面四、配置RequestWrapper五、效果展示 一、需求 需要打印请求参数和返回参数 二、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop<…

Spire.PDF for .NET【页面设置】演示:旋放大 PDF 边距而不改变页面大小

PDF 页边距是正文内容和页面边缘之间的空白。与 Word 不同&#xff0c;PDF 文档中的页边距不易修改&#xff0c;因为 Adobe 不提供任何功能供用户自由操作页边距。但是&#xff0c;您可以更改页面缩放比例&#xff08;放大/压缩内容&#xff09;或裁剪页面以获得合适的页边距。…

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台HP EVA存储中有23块硬盘&#xff0c;挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯&#xff0c;此刻存储还能正常使用。管理员在更换硬盘的过程中&#xff0c;又出现一块硬盘对应的指示灯亮黄…