如何去理解浏览器渲染原理

前言

最近一直在看八股文,发现不管是框架还是HTML部分,都免不了要涉及到浏览器的渲染问题,那么这里就涉及到重绘-Redraw、重排-Reflow(回流,个人觉得更符合的翻译是重排)两个经典的面试题。

浏览器渲染原理

根据下图, 可知道浏览器渲染分以下步骤:

  1. 浏览器到HTML文件,解析HTML文件生成DOM树;;
  2. 处理CSS标记,构建层叠样式模型CSSOM(CSS Object Model);
  3. 将DOM树与CSSOM合并为渲染树(rendering tree);
  4. 渲染树进行布局。浏览器会对渲染树每个元素包含的内容进行计算,并通过一种流式的方式处理,只需要一次pass绘制操作布局所有元素;
  5. 将渲染树的各个节点绘制到屏幕上-(painting)
    在这里插入图片描述

什么是重排?

当元素布局属性发生改变,需要重新计算元素在页面中的布局位置时,浏览器重新进行布局的过程。例如:修改元素的宽度、高度、位置等。

什么是重绘?

当元素的样式发生改变,不影响布局的情况下,浏览器重新绘制元素的过程。例如修改元素的背景颜色、文字颜色等。

为什么推荐使用重绘的方式,减少使用重排?

从浏览器渲染原理图中,我们不难发现重排发生在Layout布局阶段,这样就会额外消耗性能去重新计算元素位置和页面布局,而重绘则只需要绘制已经计算好布局的元素样式。

如何减少重排?

  1. **使用CSS动画替代:**CSS动画是利用的GPU加速,在性能方面通常比JavaScript动画更高效。使用CSS的transformopacity属性来创建动画效果,而不是改变元素的布局属性。
  2. **使用translate3d开启硬件加速:**将元素的位移属性设置为translate3d(0, 0, 0),可以强制使用GPU加速,有助于避免回流,并提高动画的流畅性。
  3. **避免频繁操作影响布局的样式属性:**当需要对元素进行多次样式修改时,可以考虑将这些修改合并为一次操作。通过添加/移除CSS类样式一次性改变多个样式属性,而不是逐个修改。
  4. 灵活运用requestAnimationFrame:通过使用requestAnimationFrame方法调度动画帧,可以确保动画在浏览器的重绘周期执行,从而避免不必要的回流。这种方式可以确保动画在最佳时间节点进行渲染。
  5. **使用文档片段(Document Fragment):**当需要向DOM中插入大量新元素时,可以先将元素添加到文档片段中,最后将整个文档片段一次性注入DOM中,这样可以减少回流次数。例如:vue的虚拟dom(vNode);
  6. **让元素脱离文档流:**使用positionabsolutefixed和float,这样可以减少回流。
    流:**使用positionabsolutefixed和float,这样可以减少回流。
  7. **CSS属性控制:**使用visibility: hidden替代display: nonevisibility: hidden不会触发回流,仍然占据空间,只是不可见;而display: none则会将元素从渲染树中移除,引起回流。
  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Miren浏览器是一款基于开源的Android浏览器,拥有轻巧、快速、安全等特点。作为一名开发者,我们可以通过查看其源码来了解其实现原理和功能。 Miren浏览器的源码是公开可见的,在GitHub等开源平台上可以找到相关的代码仓库。我们可以通过下载或克隆源码来进行分析。 在源码中,可以看到Miren浏览器涵盖了很多功能模块,例如:浏览器引擎、UI界面、网络请求、数据存储等。我们可以逐个模块地研究其实现细节。 浏览器引擎部分是核心组成部分,负责解析和渲染网页。可以深入研究其中所使用的渲染引擎、脚本解析引擎,了解其底层实现和性能优化技巧。 UI界面部分包括浏览器的主界面、标签页、菜单等。我们可以分析其中的布局文件、样式文件以及相关逻辑代码,了解UI界面的构建和交互逻辑。 网络请求模块是用来发送和接收网络请求的,其中可能涉及到一些网络协议的处理和安全机制的实现。我们可以研究其请求发送的流程、数据解析的方式,以及网络通信的各种细节。 此外,还有一些其他的模块,如JavaScript引擎、资源管理、数据存储等,也都值得我们去关注和研究。 通过研究Miren浏览器的源码,我们可以深入了解浏览器的内部运作机制,提高我们对Android开发的理解和技术水平,同时也可以借鉴其中的设计思想和编程技巧,为我们自己的应用开发提供参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一心就想回农村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值