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

掌握回流与重绘面试回答:优化网页加载与响应速度

在这里插入图片描述

认识回流reflow和重绘repaint

理解回流reflow:(也可以称之为重排)

第一次确定节点的大小和位置,称之为布局(layout)。
之后对节点的大小、位置修改重新计算称之为回流

什么情况下引起回流呢?

比如DOM结构发生改变(添加新的节点或者移除节点)

比如改变了布局(修改了width、height、padding、font-size等值)

比如窗口resize(修改了窗口的尺寸等)

比如调用getcomputedstyle方法获取尺寸、位置信息

理解重绘repaint

第一次渲染内容称之为绘制(paint)之后重新渲染称之为重绘

什么情况下会引起重绘呢?

比如修改背景色、文字颜色、 边框颜色、样式等;

回流和重绘的性能优化

回流一定会引起重绘,所以回流是一件很消耗性能的事情

所以在开发中要尽量避免发生回流:
  1. 修改样式时尽量一次性修改
    比如通过cssText修改,比如通过添加class修改
  2. 尽量避免频繁的操作DOM
    我们可以在一个DocumentFragment或者父元素中将要操作的DOM操作完成,再一次性的操作
  3. 尽量避免通过getcomputedstyle获取尺寸、位置等信息
    频繁调用getcomputedstyle会导致回流,因为浏览器需要提供准确的计算值
  4. 对某些元素使用position的absolute或者fixed
    并不是不会引起回流,而是开销相对较小,不会对其他元素造成影响
    额外的方法
    新的合成层(compositingLayer):在特定情况下,可以创建新的合成层,并且新的图层可以利用GPU来加速绘制也可以提供性能
特殊解析-composite合成
绘制的过程,可以将布局后的元素绘制到多个合成图层中

这是浏览器的一种优化手段;

默认情况下,标准流中的内容都是被绘制在同一个图层(Layer)中的;

而一些特殊的属性,会创建一个新的合成层(compositinglayer),并且新的图层可以利用GPU来加速绘制

因为每个合成层都是单独染的;

那么哪些属性可以形成新的合成层呢?常见的一些属性

  1. 3Dtransforms
  2. video、 canvas、 iframe
  3. opacity动画转换时;
  4. position:fixed
  5. will-change:一个实验性的属性,提前告诉浏览器元素可能发生哪些变化;
  6. animation或transition设置了opacity、transform
    分层确实可以提高性能,但是它以内存管理为代价,因此不应作为web性能优化策略的一部分过度使用。

面试回答

定义回流(Reflow)在浏览器染过程中的意义,并解释何时回触发回流?

回流是器染过程中的一个阶 涉及计算所有元素的位置和大小

当DOM的结构发生任何改变时(例如元素的添加、 移除、移动或大小变化) 浏览器需要重新计算元素的几何属性 然后确定它们在页面上的确切位置文个过程是必需的 因为页面布局是动态的元素的变化可能影响它元的布局。
但是我们要尽量避免或者减少回流的发生,因为这个过程也是非常消耗性能的。

什么情况下引起回流呢?

比如DOM结构发生改变(添加新的节点或者移除节点);
比如改变了布局(修改了width、height、padding、font-size等值
比如窗口resize(修改了窗口的尺寸等)
比如调用getcomputedstyle方法获取尺寸、位置信息
等等

回流是一个计算密集的过程,可能会影响到网页的性能,特别是在复杂的页面布局中。

因此,优化网页以减少不必要的回流是提高性能的重要策略和手段。

这包括尽量减少在一个操作过程中对DOM的多次修改 用CSS的类进行样式变更等

这也是现代框架Vue、Reac的源码内部经常会涉及到的优化手段.(这里可能引出进一步问你Vue、Rect源码的问题)

解释什么是重绘(Repaint儿以及它在浏览器染网页时的作用

绘是浏览器染过程中的个步骤,它涉及到更新页面中元素的视觉表现 但不涉及这些元条的布局位置
重绘发生在元素的外观变化时,如改变颜色、阴影或者透明度等
这些变化不会影响到元素的几何结构(即位置和形状).

什么情况下会引起重绘呢?

比如修改背景色、文字颜色、边框颜色、样式等
⭐⭐⭐ 回流一定会引起重绘,所以回流是一件很消耗性能的事
虽然重绘不涉及布局的变化,因此比回流成本低,但是也会对性能造成负面影响。我们开发中可以通过下面的方案来进行优化
合并视觉变更:尽可能在一次操作中合并多个视觉变更,以减少绘的次数

新的合成层 (CompositingLayer):在特定情况,可以创建新的合成层,并新的图层可以利用GPU来加速绘制也可以提供性能


http://www.mrgr.cn/news/28428.html

相关文章:

  • 北京大学c++程序设计听课笔记101
  • 【星海随笔】ZooKeeper-Mesos
  • 【AI大模型】大型语言模型LLM基础概览:技术原理、发展历程与未来展望
  • 使用大语言模型创建 Graph 数据
  • 学习rust语言宏之macro_rules!
  • Redis知识点整理 - 脑图
  • vscode对python进行多卡调试
  • 微信小程序----日期时间选择器(自定义时间精确到分秒)
  • (183)时序收敛--->(33)时序收敛三三
  • 《并发之危:错误实现的并发数据结构如何“摧毁”程序》
  • 模型训练的过程中对学习不好的样本怎么处理更合适
  • 什么是 HTTP/3?下一代 Web 协议
  • 后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)
  • Django_Vue3_ElementUI_Release_003_前端Vue3项目初始化
  • 【系统架构设计师】软件架构的概念(经典习题)
  • shopify主题开发之template模板解析
  • 【JAVA干货店】带你玩转数组与递归
  • IAPP发布《2024年人工智能治理实践报告》
  • 算法题解:斐波那契数列(C语言)
  • 15. 三数之和(实际是双指针类型的题目)
  • 支持升降压型、升压、降压、60V的1.2MHz频率LED恒流驱动器LGS63040、LGS63042
  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • 配置cobbler服务提供centos7安装源
  • [OpenCV] 数字图像处理 C++ 学习——15像素重映射(cv::remap) 附完整代码
  • 初中生物--5.单细胞生物
  • 大数据新视界 --大数据大厂之MongoDB与大数据:灵活文档数据库的应用场景