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

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

在这里插入图片描述

认识回流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.kler.cn/news/315578.html

相关文章:

  • 前后端分离的情况下,后端接口有必要加CSP策略吗?
  • 数据集-目标检测系列-自行车检测数据集 bike>> DataBall
  • Linux系统中文件I/O
  • yolov5实战拓展
  • 使用git命令
  • 基于SpringBoot+Vue的时尚美妆电商网站系统
  • Web APIs 1:基础介绍+DOM+定时器
  • 饭局礼仪:以下这7种动作,特容易被视为没教养,不要犯
  • Vue学习记录之三(ref全家桶)
  • 今日leetCode 1. 两数之和
  • (转载)智能指针shared_ptr从C++11到C++20
  • SpringSecurity6.x整合手机短信登录授权
  • 2024 硬盘格式恢复软件大揭秘
  • 《论分布式存储系统架构设计》写作框架,软考高级系统架构设计师
  • 无限边界:现代整合安全如何保护云
  • 怀庄之醉是勾兑酒吗?
  • YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,独家手把手教程,助力涨点)
  • re题(38)BUUCTF-[FlareOn6]Overlong
  • 在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路
  • 【GMNER】Grounded Multimodal Named Entity Recognition on Social Media
  • 负载均衡服务由几部分组成?分别是什么
  • vue3 中后台系统中,复杂表单的开发优化技巧
  • Spring框架总体结构
  • 无人机之航线规划篇
  • Flutter 项目结构的区别
  • 十八,Spring Boot 整合 MyBatis-Plus 的详细配置
  • linux中vim编辑器的应用实例
  • 基于LSTM的温度时序预测
  • 量化交易系统开发源码独立搭建
  • VUE项目在Linux子系统部署