前端面试合集(三——浏览器)

浏览器的页面渲染

    • 1.浏览器是如何渲染页面的?
    • 2. 什么是reflow(重排)?
    • 3. 什么是repaint(重绘)?
    • 4.为什么transform效率高?

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

当浏览器的网络线程收到HTML文档之后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。
在这里插入图片描述
整个渲染流程分为多个阶段,分别是:
解析HTML–>样式计算–>布局–>分层–>绘制–>分块–>光栅化–>画。
每个阶段都有明确的输入输出,上一个流程的输出就会成为下一个阶段的输入,这样整个渲染流程就形成了一个严密的生产流水线。
在这里插入图片描述

其中前五个步骤是在渲染主线程中进行,而后面的步骤是在合成线程中进行。

渲染第一步:解析HTML
在解析过程中如果遇到了CSS解析CSS,遇到JS解析JS,为了提高解析效率,浏览器在开始解析前,启动一个预解析线程,率先下载HTML中外部的CSS 和JS
如果主线程解析到了link标签,此时外部的CSS文件还没下载解析好,渲染主线程会直接跳过继续解析后面的HTML文档,这是因为下载和解析CSS的工作预解析线程中进行的,这就是CSS不会阻塞HTML解析的根本原因。
如果主线程解析到了JS 代码,渲染主线程会暂停解析HTML,等待JS文件下载好并将全局代码解析执行完之后,才会继续解析HTML。这是因为JS中可能会改变之前的DOM 树,所以DOM树的生成必须暂停,这也是JS 会阻塞HTML解析的根本原因。
在这里插入图片描述

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

#为什么HTML会解析成DOM树,CSS 会解析成CSSOM树,而JS 不会呢?
因为页面是一个动态的,在后续用户浏览点击的过程中可能会修改HTML结构和CSS样式,而JS执行完之后只需要进行监听点击事件、鼠标键盘操作等即可。

渲染第二步:样式计算
主线程会遍历得到DOM树,依次为树中的每个节点计算出它最终的样式,称之为Computed Style。
在这一过程中,很多预设值会变成绝对值,比如red会变成rgb(255,0,0);
相对单位会变成绝对单位,比如em会变成px。
在这里插入图片描述

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

渲染的第三步:布局
这一阶段会依次遍历DOM树的每一个节点,计算节点的几何信息(尺寸和位置),例如节点的宽高,BFC,margin合并,相对包含快的位置等。

大部分情况下,布局树和DOM树并非一一对应,比如display:none 的节点没有几何信息,因此不会生成布局树,又比如伪元素选择器,虽然DOM树中不存在伪元素节点,但他们拥有几何信息所以会生成到布局树中还有匿名行盒,匿名块盒等等都会导致DOM 树和布局树无法一一对应。
在这里插入图片描述

布局完成之后会得到布局树。

渲染第四步:分层
主线程中会使用一套复杂的策略对整个布局树中进行分层,分层的好处在于当某一层结构发生变化时,只要重新绘制这一图层即可,从而提高效率。滚动条,堆叠上下文、transform、opacity等样式都会或多或少的影响分层效果,也可以通过will-change属性更大程度的影响分层效果。
在这里插入图片描述
页面的分层可以通过浏览器“检查”中的layers即可查看页面分层。(如果没有找到layers,可看我下图所示)
在这里插入图片描述
在这里插入图片描述

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

比如:
我在页面的30,20 的位置画一个宽50,高50的盒子
在这里插入图片描述

至此,渲染主线程的工作已经完成,下面的工作由合成线程来完成。
渲染第六步:分块
合成线程首先对每个图层进行分块,将其划分为更多的小区域,它会从线程池中拿取更多的线程来完成分块工作。
在这里插入图片描述

渲染第七步:光栅化
分块完成后,进入光栅化阶段,合成线程会将快信息交给GPU进程,以极高的速度完成光栅化。GPU进程会开启多个线程来完成光栅化,并优先处理离视觉窗口近的块,光栅化的结果就是一块一块的位图。
在这里插入图片描述

渲染第八步:画(quad)
合成线程拿到每个层,每个块的位图后,生成一个个[指引(quad)]信息。指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转,缩放等变形。
变形发生在合成线程,与渲染主线程无关,这就是transform效率高的本质原因
合成线程会把指引提交给GPU进程,由GPU进程产生系统调用提交给GPU硬件显卡,最后完成最终屏幕成像显示在页面上。
在这里插入图片描述

2. 什么是reflow(重排)?

重排的本质就是计算布局树。
当页面布局发生改变时(添加DOM元素,改变字体大小等)需要重新计算布局树,为了避免连续多次操作导致DOM树的反复计算,浏览器会合并这些操作,当JS代码全部完成后再进行统一计算,所以改动属性是异步完成的。
当JS获取布局属性时(比如clientHeight),可能会造成无法获取到最新的布局消息,浏览器在反复权衡下,最终决定获取属性立即 reflow。所以获取属性是同步的。

3. 什么是repaint(重绘)?

重绘是根据分层信息计算绘制指令。
当改动样式之后(修改背景颜色,修改字体颜色等),就需要重新计算,引发重绘。
重排一定会引起重绘,但是重绘不一定会引起重排。

4.为什么transform效率高?

因为transform既不会影响布局,也不会影响绘制指令,它只影响最后一步“画”的阶段。
由于【画】阶段在合成线程中,所以transform变化几乎不会影响渲染主线程,反之,不论渲染主线程有多忙,都不会影响transform变化。

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

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

相关文章

AI已经改变游戏规则,新环境下如何用好这一新利器,提升开发团队的生产力

ChatGPT 4在今年3月刚刚发布,但在短短几个月内,它已经开始改变多个行业开发材料和资产的方式。 作为Perforce Software的首席技术官,我密切关注着新兴技术如何重新塑造和定义既定的工作步骤与流程。在我近30年的软件开发经验中,很…

【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题

前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏&#x1…

探究Nginx应用场景

1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器,它可以用于托管静态资源。下面是一个简单的案例,展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名,并且你希望使用Nginx来托管位于/var/www/html目录下的静…

CopyOnWriteArrayList源码分析

其中唯一的线程安全 List 实现就是 CopyOnWriteArrayList。 特点 由于读取操作不会对原有数据进行修改,因此,对于每次读取都进行加锁其实是一种资源浪费。相比之下,我们应该允许多个线程同时访问 List 的内部数据,毕竟对于读取操…

MeterSphere压测,出现HttpHostConnectException

现象:MeterSphere更换压力机后,压测出现出现HttpHostConnectException 解决方案: net.ipv4.tcp_tw_reuse默认是0或者2,更改为1 net.ipv4.tcp_tw_reuse,表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连…

时序分解 | MATLAB实现基于SSA奇异谱分析的信号分解分量可视化

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 奇异谱分解奇异谱分析SSA 可直接替换txt数据运行 Matlab 1.包含3D分解效果图 频谱图等…

Linux UDP编程流程

文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下: socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOC…

Spring基础(2w字---学习总结版)

目录 一、Spirng概括 1、什么是Spring 2、什么是容器 3、什么是IoC 4、模拟实现IoC 4.1、传统的对象创建开发 5、理解IoC容器 6、DI概括 二、创建Spring项目 1、创建spring项目 2、Bean对象 2.1、创建Bean对象 2.2、存储Bean对象(将Bean对象注册到容器…

IMU+摄像头实现无标记运动捕捉

惯性传感和计算机视觉的进步为在临床和自然环境中获得精准数据带来了新可能。然而在临床应用时需要仔细地将传感器与身体对齐,这减慢了数据收集过程。 随着无标记运动捕捉的发展,研究者们提出了一个新的深度学习模型,利用来自视觉、惯性传感…

金和OA GetSqlData.aspx 远程命令执行漏洞

一、漏洞简介 金和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,涉及的企业管理业务包括协同办公管理、人力资源管理、项目管理、客户关系管理、企业目标管理、费用管理等多个业务范围,从功能型的协同办公平台上升到管理型协同管理平台,并不断的更新完善…

每日刷题-5

目录 一、选择题 二、算法题 1、不要二 2、把字符串转换成整数 一、选择题 1、 解析:printf(格式化串,参数1,参数2,.….),格式化串: printf第一个参数之后的参数要按照什么格式打印,比如%d--->按照整形方式打印&am…

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定,市场上有很多机会,技术好的人前景就好,就看你有多大本事了。小编得到了一份很不错的资源,建议大家可以认真地来看看以下的资料,来提升一下自己的核心竞争力,在面试中轻松应对面…

HTTPS协议

文章目录 HTTPS协议1. HTTPS协议介绍2. 概念准备2.1 什么是"加密"2.2 为什么要加密2.3 常见的加密方式(1) 对称加密(2) 非对称加密 2.4 数据摘要 && 数据指纹(1) 应用场景 3. HTTPS理解链3.1 方案 1 - 只使用对称加密3.2 方案 2 - 只使用非对称加密3.3 方案 …

SeaArt.ai: 海艺AI绘画艺术图片模型创作平台

【产品介绍】 • 名称 SeaArt.ai • 具体描述 SeaArt.ai是一个基于人工智能技术的AI绘画工具,它可以根据你的描述或者关键词来生成符合你想象的图片。你可以选择不同的模式来创建不同类型的图片,比如人物、风景、建筑、神话、自…

投稿指南【NO.12_8】【极易投中】核心期刊投稿(组合机床与自动化加工技术)

近期有不少同学咨询投稿期刊的问题,大部分院校的研究生都有发学术论文的要求,少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业,但是核心期刊要求论文质量高且审稿周期长,所以本博客梳理一些计算机特别是人工智能相关的期…

Swift 新并发模型中 isolated 和 nonisolated 关键字的含义看这篇就懂了!

概览 在 Swift 新 async/await 并发模型中,我们可以利用 Actor 来避免并发同步时的数据竞争,并从语义上简化代码。 Actor 伴随着两个独特关键字:isolated 和 nonisolated,弄懂它们的含义、合理合规的使用它们是完美实现同步的必…

SpringMVC文件的上传下载JRebel的使用

目录 前言 一、JRebel的使用 1.IDea内安装插件 2.激活 3.离线使用 使用JRebel的优势 二、文件上传与下载 1 .导入pom依赖 2.配置文件上传解析器 3.数据表 4.配置文件 5.前端jsp页面 6.controller层 7.测试结果 前言 当涉及到Web应用程序的开发时&…

只依赖OPENCV的工作服安全帽检测YOLOV8S

工地安全帽工作服检测Y8S,采用YOLOV8S训练模型,然后使用OPENCV的DNN调用,彻底拜托PYTORCH依赖,可以在C,PYTHON,ANDROID上跑。附件是C生成的效果测试(只需解压将图片或者视频放入VIDEOS文件夹,文件夹没图片或…

【UE 材质】制作飘动的旗帜

效果 步骤 1. 首先在建模软件中创建一个平面,注意分段数一定要多 2. 在UE中创建一个材质,这里命名为“Mat_Flag” 打开“Mat_Flag”,先将旗帜纹理连接到基础颜色 先选中导入的模型然后点击根据选中的模型预览材质 创建如下节点可以看到此时模…

如何让报表会说话?学会这一招就可以了

Smartbi电子表格软件进化到全新阶段,这轮更新最能吸引人的地方是什么呢?跟随小麦一起来感受下。 1、新增语音播放特性,让报表会说话 Smartbi电子表格软件最新上线超级实用的新特性——语音播报,即让报表自己开口说话~ 设想你打开…