重绘与回流

2023-11-09 09:30
文章标签 回流 重绘

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

重绘

重绘:当渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观、风格,而不会影响不布局的操作,比如background-color,我们将这样的操作成为重绘。

重绘过程:犹豫没有导致DOM集合属性的变化,因此元素的位置信息不需要更新,从而省去布局的过程,流程如下:

 跳过了生成布局树和建图层树的几个阶段,直接生成绘制列表,然后继续进行分块,生成位图等后面的一系列操作。

回流

回流:当渲染树中的一部分(或全部)因为元素的规模尺寸、布局、隐藏等改变而需要重新构建的操作,会影响到布局的操作,这样的操作我们成为回流。

常见引起回流的属性和方法:

任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流。

(1)添加或者删除可见的DOM元素

(2)元素尺寸改变--边距、填充、边框、宽度和高度

(3)内容变化,比如用户在input框中输入文字

(4)浏览器窗口尺寸改变--resize事件发生时

(5)计算offsetWidth和offetHeight属性

(6)设置style属性的值

(7)当你修改网页的默认字体时

(8)读写offset族、scroll族和client族属性的时候,浏览器为了获取这些值,需要进行回流操作

(9)调用window.getComputedStyle方法

提示:回流必定会发生重绘,重绘不一定会引发回流,回流所需要的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流。

window.getComputedStyle()方法返回的是一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有css属性的值,私有css属性值可以通过对象提供过的API或通过简单地使用CSS属性名称进行索引来访问

回流过程:

触发回流的时候,如果DOM结构发生改变,则重新渲染DOM树,然后将后面的流量(包括主线程之外的任务)全部走一遍

相当于将解析和合成的过程重新又走了一遍,开销是非常大的

如何减少回流:

  1. 使用transform代替top
  2. 不要把节点的属性值放在一个循环里当成循环里的一个变量
  3. 不要使用table布局,可能一个很小的改动会造成整个table的重新布局
  4. 把DOM离线后修改。如:使用documentFragment对象在内存里操作DOM
  5. 不要一条一条的修改DOM样式。与其这样,还不如预先定义好css的class,然后修改DOM的className或者style.classText
  6. 在需要经常获取那些引起浏览器回流的属性值时,要缓存到变量中
  7. 对元素进行一个复杂的操作,可以先隐藏他,操作完成后再显示
  8. 对于resize、scroll等进行防抖、节流处理 
  9. 避免频繁使用style,而是采用修改class的方式
  10. 添加will-change:transform,让渲染引擎为其单独实现一个图层,当这些变换发生时,仅仅只是李银歌城县城去处理这些变化,而不牵扯到主线程,大大提高渲染效率,当然这个辩护不限于tranform,任何可以实现合成效果的css属性都能应will-change来声明 

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



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

相关文章

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:获

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动画和过度、改变类名、窗口大小变化以及修改字体相关属性等),浏览器需要重新绘制该元素的部分或全部内容,而不改变元素的位置和布局。 页面回流 当页面布局和几何属性发生改变时,浏览器需要重新计算元素的布局和几何属性,然后更新页面的渲染效果。 例如:修改元素的尺寸、位置等属性时,会触发该元素及其祖先元素的回流

UGUI空白可点击组件,减少重绘

如果使用image alpha = 0,会导致overDraw,直接清空mesh,不绘制即可避免 #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.UI; namespace UnityGameFramework {     [AddComponentMenu("Game/UI/Gam

跨境电商必备神器!一秒实现图像处理|批量抠图|局部重绘|高清修复,统统一步到位!

跨境电商的小伙伴们,你们是否经常头疼产品图片的处理。批量抠图太麻烦?抠完图片还要打开多个软件进行图片处理,切来切去,效率低下?今天,我要给大家带来一个电商设计神器——千鹿设计助手,让你的设计工作变得简单又高效! 工具准备: 访问千鹿设计助手https://qianlu.cc/?s=rGUHvi,填写码:rGUHvi 完成注册。 Alt+空格 呼出快搜索框,安装插件。 操作步骤: 一、批