首页 > 其他分享 >前端回流与重绘:概念及触发条件

前端回流与重绘:概念及触发条件

时间:2024-07-15 20:07:22浏览次数:6  
标签:触发 DOM 元素 回流 重绘 属性

在前端开发中,性能优化是一个永恒的话题。回流(Reflow)与重绘(Repaint)是两个重要的概念,它们直接影响着页面的渲染性能和用户体验。本文将详细介绍回流与重绘的概念、触发条件及其优化方法。

一、回流(Reflow)(重排)

1.1 概念

回流,又称重排(Reflow),是指当DOM的变化引起元素的几何属性(如尺寸、位置等)变化时,浏览器需要重新计算元素的布局,从而影响页面的渲染树。这是一种较为耗费性能的操作。

1.2 触发条件

以下操作可能会触发回流:

  • 添加、删除、修改DOM元素
  • 改变元素的尺寸(宽度、高度、内边距、外边距、边框等)
  • 改变元素的位置(如使用 topleftbottomrightfloatclear 等属性)
  • 改变元素的内容(如文本内容的变化)
  • 改变元素的显示状态(如 displayvisibilityoverflow 等属性)
  • 读取某些属性(如 offsetWidthoffsetHeightclientWidthclientHeightscrollWidthscrollHeight 等)
  • 浏览器窗口大小变化

二、重绘(Repaint)

2.1 概念

重绘是指当元素的外观(如颜色、背景、边框等)发生变化,但不会影响布局时,浏览器会重新绘制元素以呈现新的外观。相较于回流,重绘的代价较小,但仍会影响性能。

2.2 触发条件

以下操作可能会触发重绘:

  • 改变元素的颜色(如 colorbackground-colorborder-color 等)
  • 改变元素的边框样式(如 border-styleborder-width 等)
  • 改变元素的透明度(如 opacity
  • 改变元素的阴影(如 box-shadow

三、回流与重绘的优化方法

为了提升页面性能,我们应尽量减少回流和重绘的次数。以下是一些优化建议:

3.1 尽量减少DOM操作

  • 批量修改DOM:将多次对DOM的操作合并为一次性操作。
  • 使用文档片段(DocumentFragment):在内存中进行DOM操作,然后一次性将其插入文档中。

3.2 避免频繁访问会触发回流的属性

  • 缓存属性值:将会触发回流的属性值缓存起来,避免频繁访问。
  • const width = element.offsetWidth;
    // 使用缓存的 width 进行后续操作

     

3.3 使用CSS3硬件加速

  • 使用 transformopacityfilter 等属性进行动画或过渡效果,可以利用GPU加速,减少回流和重绘的开销。

3.4 低频率触发的操作

  • 对于频繁触发的操作(如滚动事件、窗口大小改变事件),可以使用 requestAnimationFramedebouncethrottle 函数进行节流或防抖处理。

3.5 合理的样式表结构

  • 将影响范围较大的样式尽量放在外部样式表中,减少内联样式的使用。
  • 避免使用过于复杂的选择器,尽量简化选择器的层级。

标签:触发,DOM,元素,回流,重绘,属性
From: https://www.cnblogs.com/zx618/p/18303884

相关文章

  • element-plus 如何点击其它位置触发文件上传
    原文链接: https://www.xiandanplay.com/article/view?id=16925669181947904&articleCategoryId=16078840161206272https://www.xiandanplay.com/是我的一个自建的网站,,欢迎大家来踩,多多给些建议,开源不易 ElementPlus虽然为我们提供了文件上传的组件,但是每次使用它都要用<el-up......
  • 数据库的触发器的使用
      需要实现在passenger中添加乘客信息后,在classes(班次)中对应舱位的已售出票数+1例:在passenger中添加了一个degree=“头等舱”的乘客,就在classes中对应头等舱已售出票数goodnumber+1  (经济舱类似,对应secondnumber+1 实现方法:在passenger表中增加触发器,在新增passenger......
  • vue-print-nb 打印 clickMounted 回调为何不触发
    <template><div><divid="printMe"><el-table:data="tableData"style="width:100%;"><el-table-columnprop="date"label="Date"width=&quo......
  • gitlab钩子,push推送触发服务器自动更新pull
    搬自自己的51cto博客,不想用51cto了我用的linux的宝塔面板代码是php 流程1.创建秘钥linux创建rsa密钥对(创建的是www用户的秘钥)sudo-Huwwwssh-keygen-trsa运行之后会让你填具体路径,可以写/home/www/.ssh/id_rsa.pub还会让你填密码短语,不用填,直接回车还会再让......
  • SD之图生图和局部重绘
    图生图顾名思义,就是用一张原图生成一张ai画的图,可以加参数等等。比如:我有这样一张原图,我可以通过SD生成一张二次元效果的图片。然后我想在第一张图片给人物换成短发的小姐姐,如下:通过局部重绘,给人物加个耳环:然后再给人物换个校服:总体说来,SD真的是很强大的,希望大家......
  • Stable Diffusion 图生图之局部重绘
    StableDiffusion图生图(局部重绘):局部重绘:·在图生图界面中关于局部重绘有三个标签页.·这三个标签页主要是蒙版的使用方式不同.局部重绘标签.图片可以通过上传,或者是从文生图发送到局部重绘.右边是局部重绘的画笔工具.·局部重绘中,画布和画笔大小有快......
  • sql server数据库触发器记录 数据库中的创建 删除 的操作日志
    sqlserver数据库触发器记录数据库中的创建删除的操作日志1.创建记录日志表SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO/******sqlserver数据库触发器记录数据库中的创建删除的操作日志*/CREATETABLE[dbo].[Trigger_ddl_record]( [Id][int]IDENT......
  • Flink 窗口触发器(Trigger)(一)
    Flink的窗口触发器(Trigger)是流处理中一个非常关键的概念,它定义了窗口何时被触发并决定触发后的行为(如进行窗口数据的计算或清理)。一、基本概念定义:触发器决定了窗口何时被触发以及触发后的行为。在Flink中,窗口的触发是通过设置定时器来实现的。作用:控制窗口数据的聚合时机......
  • 【Unity】EventTrigger各事件触发时机解释
    OnSelect():当鼠标按下了一个当前未在选中状态的UI时触发。如果一个UI已经被选中(成为焦点UI),那么再点击这个UI时,则不会再一次触发OnSelect。OnDeselect():在OnSelect()已经执行过之后,又选中了另外一个物体时,原有的物体就会触发OnDeselect(),取消选择。OnUpdateSelect():在......
  • 金蝶云星空字段之间连续触发值更新
     场景说明字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不到。具体需求:配置值更新事件:料本,料本系数,PCBA加工费,整机装配费,税率%【字段A】公式:供应链含税报价=(料本*料本系数+PCBA加工费+整机装配费)*(1+......