当前位置: 首页 > article >正文

浏览器是如何渲染页面的? - 2024最新版前端秋招面试短期突击面试题

浏览器是如何渲染页面的? - 2024最新版前端秋招面试短期突击面试题【100道】 🌐

浏览器的渲染流程是将 HTML、CSS 和 JavaScript 转换为用户可见内容的过程。以下是浏览器渲染的一系列步骤,以及每个步骤的关键过程和输入输出。

渲染流程概述 🔄

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

主要步骤:

在这里插入图片描述

  1. HTML 解析
  2. 样式计算
  3. 布局
  4. 分层
  5. 绘制
  6. 分块
  7. 光栅化
  8. 绘制到屏幕

1. HTML 解析 📖

  • 过程
    • 浏览器解析 HTML 文档,构建 DOM 树。
    • 遇到 <link> 标签时,启动预解析线程下载外部 CSS 文件,解析 CSS 不会阻塞 HTML。
    • 遇到 <script> 标签时,停止 HTML 解析,等待 JS 加载和执行,因为 JS 可能会修改 DOM。

输出:

  • 生成 DOM 树。

2. 样式计算 🎨

  • 过程
    • 主线程遍历 DOM 树,计算每个节点的最终样式,生成 CSSOM 树(CSS 规则对象模型)。
    • 计算过程中,默认样式、内部样式、外部样式和行内样式都会被纳入考虑。

输出:

  • 生成带有样式的 DOM 树(结合 CSSOM)。

3. 布局 📏

  • 过程
    • 根据带有样式的 DOM 树,计算每个节点的几何信息(如宽高、位置等),生成布局树。
    • 有些节点(如 display: none 的节点)不会出现在布局树中。

输出:

  • 生成布局树。

4. 分层 📊

  • 过程
    • 主线程使用策略对布局树进行分层,决定哪些元素需要单独处理。
    • 分层的好处在于,某层的变化只需重新处理该层,提高效率。

影响因素:

  • 样式如滚动条、堆叠上下文、transformopacity 等都会影响分层结果。

输出:

  • 生成多个图层。

5. 绘制 🖌️

  • 过程
    • 为每个层生成绘制指令集,描述该层的内容如何绘制。

输出:

  • 生成绘制指令。

6. 分块 🗂️

  • 过程
    • 合成线程对每个图层进行分块,将其划分为更小的区域,以提高处理效率。
    • 多线程加速分块处理。

输出:

  • 生成更小的块信息。

7. 光栅化 🖼️

  • 过程
    • 合成线程将块信息交给 GPU 进程进行光栅化。
    • GPU 处理光栅化时,优先处理接近视口的区域,确保用户看到的内容更快呈现。

输出:

  • 生成位图。

8. 绘制到屏幕 🖥️

  • 过程
    • 合成线程拿到每个层的位图,通过生成的「指引(quad)」信息,确定每个位图在屏幕上的位置,同时处理变形。

输出:

  • 最终在屏幕上呈现用户界面。

总结 📝

浏览器的渲染过程是一个复杂而高效的流水线,每一步都有明确的输入和输出。通过理解这些步骤,开发者可以更好地优化网页性能,提高用户体验。在面试中能够清晰地阐述这一流程的细节,将使你在技术面试中更具竞争力!希望这些知识能帮助你顺利通过面试!


http://www.kler.cn/a/386915.html

相关文章:

  • vue elementui el-dropdown-item设置@click无效的解决方案
  • Snort的配置与使用
  • 大数据技术之Hadoop :我是恁爹
  • srs http-flv处理过程
  • Java反序列化之CommonsCollections2链的学习
  • Android S长按文件或视频或编辑中文字或输入框中文字不会弹出分享菜单
  • Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
  • 【Webpack配置全解析】打造你的专属构建流程️(1-4)
  • DBeaver工具连接Hive
  • 冒泡选择法(c基础)
  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理
  • 探索 Python 的新边疆:sh 库的革命性功能
  • AWTK fscript 中的 JSON 扩展函数
  • Spark 的介绍与搭建:从理论到实践
  • Java命名规范
  • (2024.11.5)亚博树莓派5部署yolov8目标检测
  • Jmeter的安装,设置中文,解决乱码问题
  • A021基于Spring Boot的自习室管理和预约系统设计与实现
  • 前端实现数据下载为json文件
  • 【Lucene】什么是全文检索?解读结构化数据与非结构化数据
  • 从pg_depend和pg_class开始了解MogDB/openGauss/postgresql的系统元数据设计
  • Pytest-Bdd-Playwright 系列教程(7):使用测试代码生成辅助工具
  • 【人工智能-初级】练习题:利用Scikit-learn实现K-Means聚类算法的案例
  • 原生html+js输入框下拉多选带关闭模块完整案例
  • 算力与能量的全分布式在线共享来降低5G网络的用电成本。基于随机对偶次梯度法的多时隙约束耦合问题解耦方法示例;随机对偶次梯度法的在线管理策略
  • Java基础Day-Fifteen