浏览器原理篇—渲染原理

2023-12-21

目录导航

  1. 为什么要学习浏览器的渲染原理
  2. 浏览器的渲染流程
  3. 浏览器的渲染阻塞
  4. 浏览器的渲染优化

为什么要学习浏览器的渲染原理?

  • 知识深度挖掘:
    • 帮助更好地理解前端性能优化。从而对实现效果进行针对性优化。如:**回流和重绘 **渲染机制。
    • 帮助更好地理解浏览器的运行机制。扩展 浏览器原理 方面的知识。
    • debug时可以更快定位问题。当页面出现渲染问题时,如果对浏览器的工作原理有了解,可以根据症状更快定位问题所在。
  • 面试需要(相关面试题):
    • 从输入URL到页面展示,这中间发生了什么?(网络和渲染)
    • 浏览器的渲染过程?
    • 浏览器的渲染优化?
    • 什么情况下会阻塞渲染?
    • 。。。

浏览器的渲染流程

前言

什么是渲染render

渲染就是将html字符串传成可以显示的一个个像素点的过程。
用函数表示:

function render(htmlStr) {
  //转换过程
  return Html;
}

渲染的时间点

当我们输入一个url时, 网络线程会通过网络通信 给我们返回HTML文档,但网络线程不会在对其进行处理。而浏览器在收到这个HTML文档后,会产生一个 渲染任务 ,传递给 主线程的信息队列 。在 事件循环 的作用下, 渲染主线程 开始了 渲染流程
image.png

渲染流水线

整个渲染流程分为多个阶段,分别是:

  1. HTML 解析 (DOM)
  2. 样式计算 (style)
  3. 布局 (layout)
  4. 分层 (layer)
  5. 绘制 (paint)
  6. 分块 (tiles)
  7. 光栅化 (raster)
  8. 绘画 (draw quad)

每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。
这样,整个渲染流程就形成了一套组织严密的生产流水线。
image.png
image.png

渲染流程

解析HTML(DOM)

渲染的第一步是 解析 HTML 。字符串转对象
image.png
内敛样式,服务器样式,css外链样式,。。。
image.png
可以在浏览器控制台输入,观察一下:

  1. document.styleSheets
  2. document.styleSheets[0].addRule( ‘div’, ‘border:2px solid #f40 !important’)

解析过程中遇到 CSS 解析 CSS,遇到 JS 执行 JS。为了提高解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载 HTML 中的外部 CSS 文件和 外部的 JS 文件。
如果主线程解析到 link 位置,此时外部的** CSS 文件还没有下载解析好,主线程不会等待,继续解析后续的 HTML**。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。
image.png
如果主线程解析到 script 位置,会 停止解析 HTML,转而等待 JS 文件下载好 ,并将全局代码解析执行完成后,才能继续解析 HTML。这是因为 JS 代码的执行过程可能会修改当前的 DOM 树,所以 DOM 树的生成必须暂停。 这就是 JS 会阻塞 HTML 解析的根本原因
image.png
第一步完成后,会得到 DOM 树和 CSSOM 树,浏览器的默认样式、内部样式、外部样式、行内样式均会包含在 CSSOM 树中。

样式计算(style)

渲染的下一步是 样式计算
主线程会遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为** Computed Style**。
在这一过程中,很多预设值会变成绝对值,比如 red 会变成 rgb(255,0,0) ;相对单位会变成绝对单位,比如 em 会变成 px
这一步完成后,会得到一棵带有样式的 DOM 树。
image.png

布局(layout)

接下来是 布局 ,布局完成后会得到布局树。
布局阶段会依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。例如节点的宽高、相对包含块的位置。
大部分时候,DOM 树和布局树并非一一对应。
比如 display:none 的节点没有几何信息,因此不会生成到布局树;又比如使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。还有匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应。
image.png
image.png

分层(layer)

下一步是 分层
主线程会使用一套复杂的策略对整个布局树中进行分层。
分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率。
滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过 will-change 属性更大程度的影响分层结果。
image.png
可以在开发者工具中查看图层,还可以旋转、放大,帮助我们更清晰地查看图层:
https://www.jd.com/
image.png

绘制(paint)

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

分块(tiles)

完成绘制后,主线程将每个图层的绘制信息提交给合成线程,剩余工作将由 合成线程 完成。
合成线程首先对每个图层进行 分块 ,将其划分为更多的小区域。
它会从线程池中拿取多个线程来完成分块工作。
image.png
image.png

光栅化(raster)

分块完成后,进入 **光栅化 **阶段。
合成线程会将块信息交给 GPU 进程,以极高的速度完成光栅化。
GPU 进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块。
光栅化的结果,就是一块一块的位图
image.png

绘画(draw quad)

最后一个阶段就是 绘画
合成线程拿到每个层、每个块的位图后,生成一个个「指引(quad)」信息。
指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。
变形发生在合成线程,与渲染主线程无关,这就是 transform 效率高的本质原因。
合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终的屏幕成像。
image.png

总结

  1. 渲染进程将 HTML 内容转换为能够读懂的** DOM 树**结构。
  2. 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets ,计算出 DOM 节点的样式。
  3. 创建 布局树 ,并计算元素的布局信息。
  4. 对布局树进行 分层 ,并生成分层树。
  5. 为每个图层生成 绘制列表 ,并将其提交到合成线程。
  6. 合成线程将图层分成 图块 ,并在光栅化线程池中将图块转换成位图。
  7. 合成线程发送绘制图块命令 **DrawQuad **给浏览器进程。
  8. 浏览器进程根据 DrawQuad 消息 生成页面 ,并 显示 到显示器上。相关概念

重排重绘

上面整个渲染过程:
DOM、Style、layout、layer、paint、tiles、raster、draw quad、display

(1)重排:

修改几何属性,影响layout后面全部;

(2)重绘:

修改绘制属性,影响paint之后;

(3)合成:

1.修改不要布局不要绘制的属性,只影响后续合成操作 tiles后面;性能好;
2.最常见的就是 CSS3 硬件加速(GPU加速),四点
transform: translateZ(0)、opacity、filters、will-change
Will-change提前告诉浏览器元素会发生什么变化;

参考:

https://ke.qq.com/course/5892689/13883868337269329#term_id=106109971

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器原理篇—渲染原理 的相关文章

  • 给360安全浏览器设置一个图片背景/主题

    此方法适用于360安全浏览器 其他浏览器请移步 给浏览器设置一个图片背景 主题 看看效果 1 点击 管理 gt 添加 gt 搜索stylebot gt 安装 2 安装好了会有小图标 S 或者小图标 css 点击 S css图标 gt Opt
  • robot framework 使用三:浏览器兼容性自动化

    robot framework 测试浏览器兼容性 上图中黄色圈的地方默认什么都不写 是firefox浏览器 写上ie就是ie浏览器了 firefox最新版本就行 ie需要设置 1 IE选项设置的安全页中 4个区域的启用保护模式的勾选都勾上
  • ASP快速入门教程

    ASP快速入门教程 ASP快速入门教程能让你一个小时就学会ASP 如果想看懂更多的ASP代码 希望大家在网上找找ASP教程 相信看完后大家对ASP更有个感性的认识 请熟记下面的ASP语句是你快速入门的不二法则 lt 1 gt lt 2 gt
  • 详解浏览器渲染原理及流程

    今天来分享一下浏览器的渲染原理及流程 前言 先来看看 Chrome 浏览器的多进程架构 通常 我们打包出来的 HTML CSS JavaScript 等文件 经过浏览器运行之后就会显示出页面 这个过程就是浏览器的渲染进程来操作实现的 渲染进
  • Cache-Control浏览器缓存

    描述 同一个标签页 打开 A 站点 访问 config 接口 正常 打开 B 站点 访问 config 接口 正常 通过浏览器后退返回 A 站点 访问 config 接口 数据异常 config 返回了 B 站点的数据 测试站点数据 htt
  • 【图像处理】索引色 抖色 反锯齿

    图片内容请参考 http www softii com cms article 5560 html 索引色 一些比较老旧的电脑相关硬件和文件格式只能处理 8 位的像素 3 个色频在 8 位的显示设备上所能表现的色彩范围实在是太少了 因此 8
  • JQuery Tab 滑动们导航菜单效果

    这种效果目前互联网上用的很多希望可以给大家提供帮助 图片是采用css sprites实现的 在tab例子的基础上尽行了扩展 符合web标准 兼容多浏览器 效果01预览 http www yuyadong com test JQuery Ta
  • 坑爹的铁路在线订票系统

    2012年的春运订票时间比往年提前了一点点 12天 这样 明天我就可以订回家的票了 上午起床 在 cnBeta 看到这篇报道 记者体验网购火车票 2小时订票10多次全失败 我靠 这么不靠谱 迅速登上 12306 cn 验证 果然遇到了报道的
  • HTTP中Put和Post的区别

    解释HTTP中Put和Post 它们有什么区别 哪个使用时更加安全 Put和Post都是浏览器向网页服务器提交数据的方法 Put把要提交的数据编码在url中 比如 http hi baidu com mianshiti key1 value
  • 火狐浏览器插件

    All in one sidebar 侧栏控制 Firebug 在浏览网页的同时 具备丰富开发的功能 LastPass 在线密码管理器 gtranslator 翻译 Xmarks 书签 ColorZilla 颜色复制 Adblock Plu
  • 终于搞定了部分网站无法打开的问题

    最近机器出现一个烦人的问题 有些网站无法打开 最初以为是实验室网络的问题 后来发现别人的机器能打开 于是开始折腾自己的机器了 hosts文件没有异常 关掉杀毒软件 防火墙 症状依旧 在浏览器地址栏中敲入url回车之后 浏览器很快报错无法访问
  • 奇安信可信浏览器下载地址

    下载奇安信可信浏览器国密开发者专版 https www qianxin com ctp gmbrowser html
  • (转)提高网站速度的最佳实践

    原文来自 http www space007 com post 129 html 相信互联网已经越来越成为人们生活中不可或缺的一部分 ajax flex等等富客户端的应用使得人们越加 幸福 地体验着许多原先只能在C S实现的功能 比如Goo
  • 开发浏览器扩展程序(js脚本)

    一 打开谷歌浏览器扩展程序 二 打开 开发者模式 三 加载已解压的扩展程序 四 选择编写好的脚本文件夹 看不到文件 没关系 默认会加载 manifest json 文件 实际文件夹内容 五 加载成功 六 开始编辑脚本文件 name 扩展名字
  • Selenium启动Chrome时配置选项

    Selenium操作浏览器是不加载任何配置的 网上找了半天 关于Firefox加载配置的多点 Chrome资料很少 下面是关于加载Chrome配置的方法 一 加载所有Chrome配置 用Chrome地址栏输入chrome version 查
  • 浏览器有哪些进程?浏览器进程,渲染进程,网络进程,渲染进程有哪些线程?

    浏览器进程 渲染进程有哪些线程 在浏览器中打开两个页面 会开启几个进程 1个浏览器进程 1个网络进程 一个GPU进程 通常一个Tab页对应一个渲染进程 但有其它情况 1 如果页面中有iframe的话 iframe也会运行在单独的进程中 2
  • Javascript高级应用:文件操作篇

    Javascript是网页制作中离不开的脚本语言 依靠它 一个网页的内容才生动活泼 富有朝气 但也许你还没有发现并应用它的一些更高级的功能吧 比如 对文件和文件夹进行读 写和删除 就象在VB VC等高级语言中经常做的工作一样 怎么样 你是否
  • 步步学ACTIVEX网页控件开发

    本文将首先介绍如何使用Visual Studio开发一个简单的ActiveX控件 然后介绍ActiveX控件开发相关的基础知识 比如方法 属性和事件等 最后介绍如何利用这些知识 实现ActiveX控件和网页页面之间的 通信 MyActive
  • 跨域与跨域访问

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源 比如从www baidu com 页面去请求 www google com 的资源 跨域的严格一点的定义是 只要 协议 域名 端口有任何一个的不同 就被当作是跨域 为什么浏览器要限
  • 老生常谈问题之——进程和线程的关系和区别

    最初 我们在学习进程和线程的时候都是和操作系统的知识相关的 但是我们前端菜鸟除了面试的时候很少用到他们 所以我们还是从前端常见的场景来详细的学习进程和线程吧 在前端提到关于进程和线程的概念主要有以下几个场景 1 js 是单线程的编程语言 也

随机推荐

  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • WinSync.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinSync
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版

    DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件 它集成了剪辑 调色 视觉特效 动态图形和音频后期制作等功能 为用户提供了完整的创作解决方案 该软件不仅适用于电影 电视和网页内容的制作 还广泛应用于广告 纪
  • 小程序模版|报名管理服务源码

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Python 元组完全指南 1

    元组用于在单个变量中存储多个项目 mytuple apple banana cherry 元组是 Python 中的 4 种内置数据类型之一 用于存储数据集合 另外还有列表 集合和字典 它们都具有不同的特性和用途 元组是有序且不可更改的集合
  • WinSyncProviders.dll文件丢失导致程序无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinSync
  • 测试报告和结果分析 —— allure整合pytest生成测试报告

    一 生成HTML测试报告的三种方式 1 unittest和HTMLTestRunner整合 2 allure和pytest整合 3 Jenkins中安装allure插件 Jenkins安装插件出错 不能正常使用 二 allure整合pyte
  • F5创新产品赢得2023年众多全球知名奖项

    西雅图 2023年12月20日 全球多云应用安全和应用交付服务领导者F5 NASDAQ FFIV 日前宣布 公司在2023年斩获多项杰出荣誉 这些殊荣充分彰显了F5在潜心创新和追求卓越方面始终坚守的承诺 同时凸显了公司正在专注于利用更先进的
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • std::string 转为 LPCTSTR类型

    在串口通讯中使用CreateFile 时 第一个参数类型为 LPCTSTR 通常使用的string类型需要进行转换 HANDLE CreateFile LPCTSTR lpFileName 指向文件名的指针 DWORD dwDesiredA
  • winrscmd.dll文件缺少导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winrscm
  • 互操作性(Interoperability)如何影响着机器学习的发展?

    互操作性 Interoperability 也称为互用性 即两个系统之间有效沟通的能力 是机器学习未来发展中的关键因素 对于银行业 医疗和其他生活服务行业 我们期望那些用于信息交换的平台可以在我们需要时无缝沟通 我们每个人都有成千上万个数据
  • winsockhc.dll文件缺少导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winsock
  • SpringBoot代码混淆与反混淆加密工具详解

    目录 反编译 混淆 正文 一共就两步 无需源码 直接对ipa文件进行混淆加密 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 简单就是把代码跑一哈 然后我们的代码 java文件 就被编译成了 class 文件
  • 38条Web测试经验分享

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 详解数据科学自动化与机器学习自动化

    过去十年里 人工智能 AI 构建自动化发展迅速并取得了多项成就 在关于AI未来的讨论中 您可能会经常听到人们交替使用数据科学自动化与机器学习自动化这两个术语 事实上 这些术语有着不同的定义 如今的自动化机器学习 即 AutoML 特指模型构
  • winrssrv.dll文件缺少导致程序无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winrssr
  • RPA机器人助力义务教育招生随机派位系统

    作为一名教育行业从业者 我深切地感受到招生工作中的繁琐和低效 每年招生季 我们需要处理大量的报名信息 进行筛选和录取工作 然而 由于人力资源有限 往往会出现疏漏和错误 给招生工作带来了不小的困扰 幸运的是 我们发现了八爪鱼RPA这一强大的工
  • 浏览器原理篇—渲染原理

    目录导航 为什么要学习浏览器的渲染原理 浏览器的渲染流程 浏览器的渲染阻塞 浏览器的渲染优化 为什么要学习浏览器的渲染原理 知识深度挖掘 帮助更好地理解前端性能优化 从而对实现效果进行针对性优化 如 回流和重绘 渲染机制 帮助更好地理解浏览