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

· 浏览次数 : 5

小编点评

前端性能优化:回流与重绘的概念、触发条件及优化方法 一、回流(Reflow)与重绘(Repaint) 回流(Reflow)和重绘(Repaint)是前端开发中两个重要的性能概念。回流是指当DOM元素的变化导致其几何属性(如尺寸、位置等)发生变化时,浏览器需要重新计算布局的过程。而重绘则是当元素的外观发生变化,但不影响布局时,浏览器重新绘制元素的过程。 二、回流与重绘的触发条件 1. 回流触发条件: - 添加、删除、修改DOM元素 - 改变元素的尺寸(宽度、高度、内边距、外边距、边框等) - 改变元素的位置(如使用 top、left、bottom、right、float、clear 等属性) - 改变元素的内容(如文本内容的变化) - 改变元素的显示状态(如 display、visibility、overflow 等属性) - 读取某些属性(如 offsetWidth、offsetHeight、clientWidth、clientHeight、scrollWidth、scrollHeight 等) - 浏览器窗口大小变化 2. 重绘触发条件: - 改变元素的颜色(如 color、background-color、border-color 等) - 改变元素的边框样式(如 border-style、border-width 等) - 改变元素的透明度(如 opacity) - 改变元素的阴影(如 box-shadow) - 面板中内容的变动(如滚动条滚动时,下拉列表选项的变动等) 三、回流与重绘的优化方法 1. 尽量减少DOM操作:将多次对DOM的操作合并为一次性操作。 2. 避免频繁访问会触发回流的属性:将需要触发的属性值缓存起来,避免频繁访问。 3. 使用CSS3硬件加速:利用GPU加速,减少回流和重绘的开销。 4. 低频率触发的操作:对于频繁触发的操作(如滚动事件、窗口大小改变事件),可以使用 requestAnimationFrame 或 debounce、throttle 函数进行节流或防抖处理。 5. 合理的样式表结构:将影响范围较大的样式尽量放在外部样式表中,减少内联样式的使用。避免使用过于复杂的选择器,尽量简化选择器的层级。 通过以上方法,我们可以有效地减少回流和重绘的次数,从而提升页面性能,提高用户体验。

正文

在前端开发中,性能优化是一个永恒的话题。回流(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 合理的样式表结构

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

与前端回流与重绘:概念及触发条件相似的内容:

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

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

前端精准测试实践

作者:京东云质量部 背景 随着前端技术发展,已经转变为数据绑定为主流的框架方式,与后端服务一样,前端代码实现也会涉及相互依赖,引用这些场景,那么应该如何准确的评估前端代码改动的影响范围?依赖开发评估?依靠经验评估?或者直接前端自动化全回归?手工测试全回归?显然以上的策略都不是最优策略,本文叙述了通过

PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践

大家好,我是码农先森。 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念。PHP 服务端和前端 HTML、CSS、JS 代码混合式开发,也不分前端、后端程序员,大家都是全干工程师。随着前后端分离、移动端开发的兴起,用后端渲染数据的开发方式效率低下,已经不能满足业务对需求快速上线的要

WPF实现类似ChatGPT的逐字打印效果

###背景 前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息。出于对这个效果的兴趣,决定用WPF模拟这个效果。 >真实的ChatGPT逐字输出效果涉及其语言生成模型原理以及服务端与前端通信机制,本文不做过多阐述,重点是如何用WPF模拟这个效果。

.NET Task 揭秘(3)async 与 AsyncMethodBuilder

前言 本文为系列博客 什么是 Task Task 的回调执行与 await async 与 AsyncMethodBuilder(本文) 总结与常见误区(TODO) 上文我们学习了 await 这个语法糖背后的实现,了解了 await 这个关键词是如何去等待 Task 的完成并获取 Task 执行结

驱动开发:内核监控Register注册表回调

在笔者前一篇文章`《驱动开发:内核枚举Registry注册表回调》`中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过`CmRegisterCallback`创建监控事件并传入自己的回调函数,与该创建对应的是

驱动开发:内核监控进程与线程回调

在前面的文章中`LyShark`一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以`监控进程线程`创建为例,在`Win10`系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。

[转帖]《Linux性能优化实战》笔记(23)—— 内核线程 CPU 利用率过高,perf 与 火焰图

在排查网络问题时,我们还经常碰到的一个问题,就是内核线程的 CPU 使用率很高。比如,在高并发的场景中,内核线程 ksoftirqd 的 CPU 使用率通常就会比较高。回顾一下前面学过的 CPU 和网络模块,你应该知道,这是网络收发的软中断导致的。 要分析 ksoftirqd 这类 CPU 使用率比

[转帖]一代更比一代强!一文带你回顾DDR内存的前世今生

根据冯诺·依曼结构,计算机中要有存储器。所以直到今天,内存和硬盘仍然在电脑中占有非常重要的地位。与大容量的硬盘不同,内存在存取速度上有着非常惊人的表现,但是断电后又不能保存存入的信息。因此在电脑硬件长期的发展过程中,内存一直扮演着中转站的角色。和其他硬件一样,内存遵循着摩根定律,从最远古的SIMM到

文件系统(九):一文看懂yaffs2文件系统原理

liwen01 2024.07.07 前言 yaffs 是专为nand flash 设计的一款文件系统,与jffs 类似,都是属于日志结构文件系统。与jffs 不同的是,yaffs 文件系统利用了nand flash 一些特有属性,所以在数据读写擦除和回收上都有较大的差异。 关于jffs2文件系统的