重绘与重排(回流)

2023-10-12 07:30
文章标签 回流 重排 重绘

本文主要是介绍重绘与重排(回流),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近写的都是写基础知识,为了提高巩固自己的知识体系,抽空就总结或复习一个知识点。为了防范于未然,说不定哪天就得重新找工作了。如何提高渲染时间,优化前端性能,必有减少重绘和重排。之前在前端性能优化上叶有介绍到这个。这篇文章系统性总结一下。

概念

重绘(Repainting)和重排(Reflow)是与网页渲染和布局有关的两个关键概念,它们在前端性能优化中非常重要。

  1. 重排(Reflow):

    • 重排是指浏览器重新计算并重新布局网页中的元素的过程,以确定它们的几何尺寸和位置。这通常发生在以下情况下:
      • 页面首次加载时,因为需要计算和布局整个文档。
      • 当用户调整浏览器窗口大小。
      • 当DOM结构发生变化,例如添加、删除或修改元素。
      • 当元素的样式属性发生变化,如修改元素的宽度、高度、边距、填充、字体大小等。
    • 重排是一项昂贵的操作,因为它会影响整个页面的布局,然后会触发重绘。
  2. 重绘(Repainting):

    • 重绘是指在不改变元素的几何布局(尺寸和位置)的情况下,浏览器重新绘制元素的过程。这通常发生在以下情况下:
      • 当元素的视觉属性发生变化,如颜色、背景、边框、阴影、文字内容等。
    • 重绘比重排轻量,因为它不需要重新计算布局。

它们的关系是重排一定会触发重绘, 重绘不一定触发重绘。

触发时机

重绘(Repainting)和重排(Reflow)在网页中的触发时机有很多情况,通常是由DOM操作、CSS属性变化或浏览器事件等触发的。下面是一些触发重绘和重排的常见情况:

重排(Reflow)的触发时机:

  1. 页面首次加载:当浏览器首次加载页面时,需要进行初始的布局计算,这会导致重排。

  2. 改变窗口大小:当用户调整浏览器窗口大小时,页面的布局会发生变化,触发重排。

  3. 修改DOM结构:添加、删除或更改页面上的元素、文本内容或其结构,通常会触发重排。

  4. 修改样式属性:当元素的CSS样式属性发生变化,如宽度、高度、边距、填充、字体大小等,会引起重排。

  5. 获取某些布局属性:访问一些需要计算布局属性的方法,如offsetTopoffsetLeftoffsetWidthoffsetHeightclientTopclientLeftclientWidthclientHeight等,会触发重排。

  6. 字体加载:当网页中使用的字体在加载完成之前会导致重排。

重绘(Repainting)的触发时机:

  1. 改变颜色、背景、边框:当元素的颜色、背景、边框等视觉属性发生变化时,会触发重绘。

  2. 文本内容变化:当元素的文本内容变化,例如修改文字或标签文本,会触发重绘。

  3. 阴影、透明度等样式变化:改变元素的阴影、透明度、文本阴影等视觉属性会引发重绘。

浏览器优化

现在的Web浏览器都具有各种优化机制,旨在提高性能、提升用户体验以及降低资源消耗。以下是一些常见的浏览器优化机制:

  1. 页面缓存: 浏览器会缓存页面的静态资源,例如CSS文件、JavaScript文件和图片,以减少重复下载的次数。这可以提高页面加载速度,特别是在用户再次访问相同页面时。

  2. HTTP缓存: 浏览器支持HTTP缓存,它允许服务器指定哪些资源可以在客户端缓存多长时间。这减少了对服务器的请求,提高了页面加载速度。

  3. 预加载: 现代浏览器可以通过预加载机制在用户导航到某个链接之前预先加载页面的资源,以提前准备数据,加快导航速度。

  4. DOM解析和渲染优化: 浏览器会尝试尽早开始DOM解析和渲染,以提供更快的首次页面渲染。

  5. 异步加载: 使用asyncdefer属性来异步加载JavaScript文件,以避免阻塞页面的渲染和提高性能。

  6. 图片延迟加载: 延迟加载图片,只在用户滚动到可见部分时加载,以减少页面初次加载时间。

  7. 硬件加速: 浏览器可以利用计算机的GPU来加速图形渲染,从而提高性能,特别是在处理复杂动画和3D效果时。

  8. 预渲染和预取: 浏览器可以根据用户的行为预先加载链接或页面,以提供快速导航体验。

  9. 资源压缩: 浏览器支持gzip等压缩方法,以减小传输的数据大小,减少网络带宽消耗和提高加载速度。

  10. 资源合并和减少请求数: 通过合并CSS和JavaScript文件、使用雪碧图、减少HTTP请求等方法,减少请求数,从而加快页面加载速度。

如何减少重绘重排

避免肯定是不可能的,所以为了优化渲染过程,提高用户体验,在平时的开发过程中要尽可能减少重绘重排。
以下是一些减少重绘和重排的实用方法:

  1. 使用硬件加速: 使用 CSS 属性transformopacity 可以触发硬件加速,减少重排和重绘的开销。例如,使用transform进行动画而不是修改元素的位置。

  2. 使用 requestAnimationFrame: 使用requestAnimationFrame来调度动画操作,它可以确保动画在浏览器的下一次绘制帧之前进行,以避免不必要的重绘。

  3. 使用 CSS 动画: 使用 CSS 动画而不是JavaScript动画,因为浏览器可以优化CSS动画,减少对页面的影响。

  4. 批量DOM操作: 避免多次单独的DOM修改。相反,尽量将多个DOM操作合并成一个,然后一次性进行处理。

  5. 避免频繁读取布局属性: 避免在循环中多次读取布局属性,因为每次读取都会导致重排。将布局属性的值缓存到变量中,以减少性能开销。

  6. 使用文档碎片(Document Fragments): 如果需要创建大量DOM元素,使用文档碎片可以减少DOM操作次数,从而减少重排。

  7. 延迟加载图片: 图片的加载是重排的常见原因。通过延迟加载图片,只在它们进入视口时加载,可以减少页面加载时的性能开销。

  8. 避免表格布局: 表格布局的改变通常会导致整个表格的重排,尽量避免使用表格布局。

  9. 使用CSS属性will-change 使用will-change属性可以告诉浏览器某个元素可能会发生变化,从而使浏览器能够做出优化。

  10. 减少重排的影响范围: 如果不是整个页面的布局都发生了变化,可以尝试减小重排的影响范围,只重新布局受影响的部分。

  11. 使用工具进行性能分析: 使用浏览器的开发者工具来分析页面的性能,找出触发重排和重绘的问题,并进行优化。

这篇关于重绘与重排(回流)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194291

相关文章

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

什么是回流与重绘,如何尽力避免

回流(reflow)和重绘(repaint)是浏览器渲染页面的两个不同过程。 回流概念(reflow) 当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来。这个过程就是回流(也叫重排)。【重新排列布局,即打碎重组】 重绘概念(repaint)

BrushNet重绘电商商品背景效果测试

🎨背景 之前写过一篇文章,简单的介绍了brushnet这个局部重绘节点,如何安装和使用可以参考我之前写的这篇文章,本篇重点测试下在背景生成这部分,brushnet是不是跟默认的inpaint有比较大的效果提升。 上一篇节点介绍内容链接: ComfyUI-BrushNet(局部重绘)节点安装及效果、模型下载及详细使用方法✨_brushnet模型放哪里-CSDN博客 🎄测试 首先搭建个基

MFC---重绘按钮

#ifndef _VANCBUTTON_MFC_H_ #define _VANCBUTTON_MFC_H_ #include "VUIControl.h" /**************************************************************/ //作者:Vansix //功能:重载CButton //版本:1.0 //修订:2016.05.08 //其

C# 窗体中Control以及Invalidate,Update,Refresh三种重绘方法的区别

在 C# 中,Control 类是 Windows Forms 应用程序中所有控件的基类。它提供了控件的基本功能和属性,这些功能和属性被所有继承自 Control 类的子类所共享。这意味着 Control 类是构建 Windows Forms 应用程序中用户界面元素的基础。 以下是 Control 类的一些关键特性和方法: 属性: Size:获取或设置控件的宽度和高度。Location:获

增强RAG:选择最佳的嵌入和重排模型

对于如何选择最佳的嵌入模型和重排模型,给出了详细的步骤和代码。 在构建检索增强生成(RAG)管道时,关键组件之一是检索器。我们有多种嵌入模型可供选择,包括 OpenAI、CohereAI 和开源的sentence transformers。此外,还有来自 CohereAI 和sentence transformers的几种重排器可供选择。 但是,在所有这些选项中,我们如何确定最佳组合以获得顶级

字符统计及重排

题目描述 给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前, 输入描述 输入一行,为一个仅包含字母的字符串, 输出描述 按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意未尾的分号; 字母和次数间用英文冒号

MFC三种不同方式实现图形的保存和重绘---方法二: 运用CMetaFileDC

在OnButtonUp()函数中的代码 //选中透明画刷 CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); m_mfDc.SelectObject(brush); //m_mfDc为CMetaFileDC对象,全局的 //通过m_mfDc绘图 switch(m_gType) {

MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标

//方法一:通过集合类CPtrArray保存点的坐标 响应WM_LBUTTONUP消息 在OnButtonUp()函数的代码 CClientDC dc(this);  //获得透明画刷并选中 CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); dc.SelectObject(brus

页面重绘和页面回流

页面重绘 页面重绘是指当元素样式改变时(包括颜色、背景色、可见性、透明度、文本内容、CSS动画和过度、改变类名、窗口大小变化以及修改字体相关属性等),浏览器需要重新绘制该元素的部分或全部内容,而不改变元素的位置和布局。 页面回流 当页面布局和几何属性发生改变时,浏览器需要重新计算元素的布局和几何属性,然后更新页面的渲染效果。 例如:修改元素的尺寸、位置等属性时,会触发该元素及其祖先元素的回流