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

news2024/11/29 18:32:57

浏览器的页面渲染

    • 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.coloradmin.cn/o/1008044.html

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

相关文章

Leetcode刷题_链表相关_c++版

&#xff08;1&#xff09;92反转链表–中等 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 /*** Definition for singly-linked list.* struct Lis…

Claude: ChatGPT替代大语言模型

【产品介绍】 Claude是Anthropic推出的类ChatGPT大语言模型&#xff0c;也是一个AI人工智能助理&#xff0c;可以帮助各种行业的用户处理工作&#xff0c;如客户服务、法律、教练、搜索和销售。Claude可以通过聊天界面和API进行访问&#xff0c;能够完成各种对话和文本处理任务…

计算机二级知识点整理

翻到了之前准备计算机二级的笔记&#xff0c;现在给大家分享出来。 一、基本知识&#xff1a; 计算机把完成一条指令所花费的时间称为一个指令周期结构化程序设计强调的是程序的易读性boolean类型不能转为其他基本类型数据表达式是由运算符和运算对象构成的&#xff0c;#不是…

SimpleCG程序交互操作

前言 之前所有示例程序都是属于展示型的&#xff0c;只是作为展示板输出使用&#xff0c;不涉及键盘和鼠标的输入交互&#xff0c;下面我们开始接触具有交互功能的程序。 没有交互功能的程序可以满足一定需求,不过大部分的程序是不能脱离交互功能的。程序依据使用者的操作进行相…

Error response from daemon

文章目录 遇到的问题解决方法参考 遇到的问题 当输入下面的指令时 docker pull xxxxxx解决方法 打开/etc/docker/daemon.json文件 vim /etc/docker/daemon.json写入以下内容&#xff1a; {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]…

OpenCV 图像像素运算操作

加法操作详解 加减乘除 #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat image imread("image.jpg");if (image.empty()) {std::cout << "无法加载图像" << std::endl;return -1;}// 加法变换Mat addResult;add(ima…

mac在vscode编码过程中输入()光标在里面的时候想移出来还得动用左右键很麻烦有什么快捷方法

下载vscode插件: 想跳出大括号的时候就可以使用tab直接跳出来就行了

Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题 1、起手试探 &#xff08;主要看看输入什么内容有正确的回显&#xff09; 1 0 1 1 # 发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显&#xff0c;所以这题就要尝试堆叠注入了。 ps&#xff1a;&#xff08;如果想尝试其他注入方法…

带你打穿三层内网-红日靶场七

文章目录 前记环境配置web1信息搜集cve-2021-3129redis未授权|ssh密钥后渗透 Win7&#xff08;PC1&#xff09;永恒之蓝 web2docker逃逸 win7&#xff08;PC2&#xff09;|DC 前记 所用工具 msfcsvenomfrp蚁剑冰蝎laravel.pyfscan 注意事项 msf的永恒之蓝每次都需要两次才能…

VM-Linux基础操作命令

命令执行的本质&#xff1a; 当输入命令&#xff08;单词&#xff09;后敲击回车的那一刻。它就会立刻到以下图片&#xff0c;变量中的文件中去找对应的可执行文件 此路径又叫环境变量 1.shell命令提示符 默认&#xff1a;[rootlocalhost ~]# root&#xff1a;现已登录的账户名…

重构优化第三方查询接口返回大数据量的分页问题

# 问题描述 用户线上查询其上网流量详单数据加载慢&#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时&#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj&#…

基于Yolov8的光伏电池缺陷检测,引入ICCV2023 动态蛇形卷积和独家全网首发多维协作注意模块MCA,实现涨点创新十足

1.光伏电池缺陷数据集介绍 背景&#xff1a;太阳能作为一种极具吸引力的替代电力能源&#xff0c;太阳能光伏电池&#xff08;即光伏电池&#xff09;是太阳能发电系统的基础&#xff0c;一般情况下&#xff0c;电池中的各类缺陷会直接影响到光伏电池的光电转化效率和使用寿命…

Mybatis-Genertor逆向工程

1、导入mybaties插件 <build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version><dependencies><dependency>…

Android Fragment

基本概念 Fragment是Android3.0后引入的一个新的API&#xff0c;他出现的初衷是为了适应大屏幕的平板电脑&#xff0c; 普通手机开发也会加入这个Fragment&#xff0c; 可以把他看成一个小型的Activity&#xff0c;又称Activity片段&#xff01; 如果一个很大的界面&#xff…

视频直播点播平台EasyDSS创建用户详细操作来啦!

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 由于旭帆科技的EasyDSS平台支持新建用户&#xff0c;但新建时用户…

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波&#xff0c;去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…

懒汉式之并发安全问题

在高并发场景下的懒汉式创建对象&#xff0c;造成ID重复创建&#xff0c;代码见下图&#xff1a; 并发场景下&#xff0c;iDCreator对象并未随类的创建而创建&#xff0c;而是在需要的时候进行创建&#xff0c;导致垃圾回收器可以对其进行回收&#xff0c;从而有可能同一时间戳…

帮助企业轻松搭建帮助中心-Baklib

Baklib是一个在线知识管理平台&#xff0c;帮助企业搭建在线产品手册、帮助中心、知识库等&#xff0c;Baklib是一个工具型软件&#xff0c;帮助企业高效快速搭建相关文档内容&#xff0c;轻松进行对外分享。 Baklib起源——目前企业的知识管理现状 存储难 将文档存储在本地与…

卷积网络:实现手写数字是识别50轮准确率97.3%

卷积网络&#xff1a;实现手写数字是识别50轮准确率 1 导入必备库2 torchvision内置了常用数据集和最常见的模型3 数据批量加载4 绘制样例5 创建模型7 设置是否使用GPU8 设置损失函数和优化器9 定义训练函数10 定义测试函数11 开始训练12 绘制损失曲线并保存13 绘制准确率曲线并…

Xilinx ZYNQ 7000学习笔记五(Xilinx SDK 烧写镜像文件)

概述 前面几篇讲了ZYNQ7000的启动过程&#xff0c;包括BootRom和FSBL的代码逻辑&#xff0c;其中关于FSBL代码对启动模式为JTAG被动启动没有进行分析&#xff0c;本篇将通过将JTAG的功能和通过Xilinx SDK烧写镜像文件到flash来顺道把FSBL中的JTAG代码部分给讲解下。 1.JTAG …