【前端性能优化】深入解析重绘和回流,构建高性能Web界面

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 🎯 引言:探索Web性能的基石
    • 🏗️ 基础概念:什么是重绘和回流?
      • 📌 回流(Reflow)
      • 📌 重绘(Repaint)
    • 🔦 触发条件:何时发生重绘与回流?
      • 📌 回流(Reflow)触发条件
      • 📌 重绘(Repaint)触发条件
    • 🎮 实战演练:代码中的重绘与回流
      • 📌 回流示例
      • 📌 重绘示例
    • 🔧 性能优化策略
      • 📌 减少样式计算
      • 📌 使用CSS Transform进行动画
      • 📌 离线布局与智能调度
      • 📌 避免不必要的读取
      • 📌 其他策略
    • 💯 面试必考
      • 📌 什么是重绘(repaint)和回流(reflow),它们有什么区别?
      • 📌 哪些操作会引起回流(reflow)?
      • 📌 怎样减少重绘和回流,提高页面性能?
      • 📌 为什么说回流一定会引起重绘,而重绘不一定引起回流?
    • 📚 总结

在这里插入图片描述

🎯 引言:探索Web性能的基石

在快速发展的Web开发领域,用户界面的流畅性和响应速度直接影响着用户体验。其中,重绘(Repaint)与回流(Reflow)作为影响性能的关键因素,常常成为开发者优化的重点。本文旨在深入剖析这两个概念,通过理论讲解与实战演练相结合的方式,带你掌握优化网页性能的必备技能。🚀


🏗️ 基础概念:什么是重绘和回流?

在这里插入图片描述

📌 回流(Reflow)

在Web浏览器的工作流程中,回流是一个关键步骤,它发生在浏览器需要根据DOM元素的尺寸、位置或某些视觉属性变化来重新计算元素的布局情况时。具体来说,当一个元素的几何属性改变,比如宽度、高度或者隐藏/显示状态变动,浏览器执行以下步骤:

  1. 计算新布局:浏览器首先基于最新的样式信息重新计算受影响元素的大小和位置,这个过程包括其所有子元素,乃至可能影响到的其他部分页面布局。这是一个递归过程,因为父元素的变化通常会影响子元素的布局。

  2. 构造渲染树:基于新的布局信息,浏览器更新或重新构造渲染树(包含DOM元素和CSS样式的组合结构,用于计算最终的像素颜色值)。

  3. 分层与合成准备:对于复杂的布局变化,可能还需要对页面进行分层处理,确定哪些部分可以独立重绘,哪些需要一起重排。

  4. 绘制与合成:最后,浏览器根据更新后的渲染树和分层信息,重新绘制屏幕上的内容。回流由于涉及整个布局计算,所以相比重绘来说,是一个更消耗资源的过程。

📌 重绘(Repaint)

重绘则是指当页面中元素的外观(如颜色、背景、边框样式等)发生变化,但不涉及元素尺寸或位置的调整,导致的元素视觉表现更新。浏览器在这个过程中的主要操作包括:

  1. 样式计算:虽然不涉及布局,但浏览器仍需计算元素的新样式信息。

  2. 绘制更新:直接在现有布局的基础上,使用新的样式信息重绘元素,而不必重新计算布局。这一步骤只影响元素的视觉外观,不改变页面结构。

由于重绘仅涉及视觉层面的更新,不需要进行复杂的布局计算,因此相比回流,它的性能开销较低。然而,频繁的重绘仍然可能对性能产生累积性影响,尤其是在高动态的用户界面中。

综上所述,回流与重绘是浏览器渲染页面过程中不可或缺的两部分,但优化时应尽量减少它们的发生频率和成本,特别是在性能敏感的应用场景下。


🔦 触发条件:何时发生重绘与回流?

📌 回流(Reflow)触发条件

  • 添加或删除DOM元素:当文档中添加新的可见元素或删除已存在的元素时,可能会导致周围元素或整体布局的变化,从而触发回流。
  • 修改元素尺寸:调整元素的宽度、高度、内外边距、边框厚度等,这些变化会影响元素与其他元素的相对位置,需要重新布局。
  • 调整元素位置:通过修改topleftrightbottom等属性改变元素位置,同样要求浏览器重新计算布局。
  • 修改影响布局的CSS属性:例如,改变display属性(如从block变为inline)、floatposition(导致元素脱离正常文档流)、flex相关的属性等,这些都可能引起布局的重大变化。

📌 重绘(Repaint)触发条件

  • 改变元素颜色:更新元素的前景色(color)、背景色(background-color)不会影响元素的尺寸或位置,仅需重新绘制元素外观。
  • 背景样式变化:如修改元素的背景图片或背景图像的大小、重复方式等,如果这些变化不影响布局,就只会触发重绘。
  • 边框样式调整:改变元素边框的样式、宽度或颜色,只要这些改动不引发布局变化,就属于重绘范畴。
  • 文本样式变化:诸如字体大小、字体样式、文本装饰(如下划线、删除线)的变化,只要不影响元素尺寸和位置布局,就会触发重绘。

减少不必要的重绘和回流对于提升网页性能至关重要,开发者可以通过CSS选择器的高效使用、避免强制同步布局、批处理DOM操作、使用transform代替left/top进行动画等策略来优化。


🎮 实战演练:代码中的重绘与回流

📌 回流示例

document.getElementById('myDiv').style.width = '300px'; // 修改宽度,触发回流

这段代码通过JavaScript修改了元素myDiv的宽度,这种对尺寸的调整要求浏览器重新计算元素的布局以及其在页面上的位置,这将导致周围的元素也可能需要重新排列以适应这一变化。因此,这是一个典型的触发回流的操作。

📌 重绘示例

document.getElementById('myDiv').style.backgroundColor = 'red'; // 改变背景色,触发重绘

这里,代码修改了同一个元素myDiv的背景颜色。因为这个变化只影响元素的视觉表现而不改变其在布局中的位置或尺寸,浏览器不需要重新计算布局,只需在当前位置重新绘制元素,使其颜色变为红色。所以,这个操作触发的是重绘。


🔧 性能优化策略

在实际开发中,频繁的回流和重绘会显著影响页面性能,特别是回流,因为它比重绘涉及更多的计算。为了优化性能,可以采取以下措施:

📌 减少样式计算

  • 合并CSS规则:将相似的选择器合并,减少样式表的大小,使浏览器解析更快。
  • 内联关键CSS:对于首屏渲染,内联必要的CSS可以避免额外的HTTP请求,加速页面加载。
  • 使用CSS预处理器(如Sass、Less)编写更简洁、模块化的代码,并自动处理浏览器兼容性问题。

📌 使用CSS Transform进行动画

  • 硬件加速transform属性尤其是translate3d可以触发硬件加速,使用GPU而非CPU来渲染动画,极大提高性能。
  • 避免布局属性动画:像widthheightmargin等属性的变化会触发布局重排,而transformopacity则不会。

📌 离线布局与智能调度

  • requestAnimationFrame:它确保在下一次浏览器重绘之前执行回调函数,适合于执行视觉更新,帮助同步动画与屏幕刷新率。
  • setTimeout(fn, 0):虽然不如requestAnimationFrame精准,但在某些场景下也可以用来推迟非紧急的DOM操作,减少阻塞。
  • 批量处理DOM操作:将多个DOM修改操作放在一个批次中完成,减少DOM树的重绘和回流次数。

📌 避免不必要的读取

  • 缓存布局信息:如果需要频繁访问某个元素的布局信息(如尺寸),最好先将其值缓存起来,避免重复计算。
  • 使用ResizeObserverMutationObserver:代替轮询布局属性,当元素尺寸改变或DOM结构变化时,这些Observer会异步通知,减少不必要的计算。

📌 其他策略

  • 懒加载图像和资源:只在需要时加载图片和脚本,减轻首次加载负担。
  • 代码拆分与按需加载:通过webpack等工具将代码分割成小块,用户只需加载当前页面所需的代码。
  • 减少JavaScript执行时间:优化算法,避免长时间运行的脚本阻塞主线程,考虑使用Web Workers进行后台处理。

遵循这些最佳实践,可以显著提升Web应用的性能,为用户提供更加流畅和快速的体验。


💯 面试必考

📌 什么是重绘(repaint)和回流(reflow),它们有什么区别?

答案:

  • 重绘指的是当页面元素的某些可视化属性(如颜色、背景色、边框等)发生变化,但不涉及元素的尺寸、位置或整体布局时,浏览器需要对该元素重新绘制其可视效果的过程。因为不需要计算布局,重绘相对较为快速。
  • 回流(又称重排)发生在页面的布局需要被重新计算和渲染的情况,比如元素的尺寸、位置或者显示隐藏状态发生改变,这将影响到其他元素的位置。回流是一个更耗时的过程,因为它涉及到DOM结构的重新布局计算。

📌 哪些操作会引起回流(reflow)?

答案: 引起回流的操作包括但不限于:

  • 添加或删除可见的DOM元素;
  • 元素尺寸或位置的动态改变(例如,通过JavaScript修改元素的宽高或使用动画);
  • 浏览器窗口尺寸变化,导致页面布局调整;
  • 计算某些特定的CSS属性,如offsetWidthscrollLeft等,这些计算需要获取最新的布局信息;
  • 改变浏览器的字体设置,可能导致文本尺寸变化,进而影响布局。

📌 怎样减少重绘和回流,提高页面性能?

答案: 减少重绘和回流的方法包括:

  • 使用CSS transform和opacity:对于动画,尽量使用transformopacity属性,因为这些变换不会引起回流。
  • 避免频繁的DOM操作:尽量批处理DOM修改,或者使用DocumentFragment等技术来构建DOM树后再添加到页面中。
  • 使用requestAnimationFrame:对于需要改变样式或布局的动画,使用requestAnimationFrame可以确保在下一次重绘之前完成所有修改,这样只会引发一次重绘。
  • 将布局变化限制在最小范围:通过CSS选择器和层叠上下文合理安排元素,尽量减少一个元素的变化影响到其他元素的布局。
  • 使用will-change属性:提前告知浏览器哪些属性可能会变化,帮助浏览器优化渲染流程。

📌 为什么说回流一定会引起重绘,而重绘不一定引起回流?

答案: 回流是因为元素的尺寸位置布局信息发生了变化,这必然导致页面的一部分或全部需要重新布局和绘制,因此回流之后必然伴随着重绘。而重绘仅涉及元素视觉外观的变化,如果仅仅改变颜色而不影响布局,那么就不需要进行布局的重新计算,也就是不需要回流。因此,重绘可以独立于回流发生。


📚 总结

在这里插入图片描述

深入理解重绘回流的过程,以及实施有效的性能优化策略,对于构建高性能的Web应用至关重要。通过减少不必要的回流和重绘,我们能够显著提升页面的加载速度和交互响应,为用户提供更加流畅的浏览体验。

重绘是指当元素的外观发生变化但不影响布局时(例如颜色改变),浏览器重新绘制该元素的行为。

回流则更为消耗资源,它发生在元素的位置、大小或其他影响布局的属性发生改变时,导致浏览器重新计算布局并重新绘制受影响的部分乃至整个页面。

记住以下几点,可以帮助持续提升Web应用性能:

  • 优化CSS选择器,减少样式计算的复杂度。
  • 合理安排DOM操作,尽量减少对DOM树的改动,尤其是避免在循环中进行DOM操作。
  • 利用CSS动画和转换,因为它们相比JavaScript动画更能有效利用硬件加速。
  • 监控和限制JavaScript执行时间,避免长时间运行的脚本阻塞UI线程。
  • 资源和代码优化,包括但不限于懒加载、代码拆分、资源压缩等,以减少页面加载时间和内存占用。

持续关注并实践这些优化策略,不仅能够提升用户体验,还能增强应用在各种设备和网络条件下的适应性和可靠性,是前端工程师技能树中不可或缺的一环。🌟


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Flask部署Web应用:从入门到精通

文章目录 第一部分:准备工作第二部分:部署Flask应用到AWS部署到AWS Lambda 第三部分:部署Flask应用到腾讯云服务器部署到腾讯云服务器 第四部分:优化和扩展结论 在现代软件开发中,Web应用的部署是一个至关重要的环节。…

使用Flask-SocketIO构建实时Web应用

文章目录 准备工作编写代码编写HTML模板运行应用 随着互联网的发展,实时性成为了许多Web应用的重要需求之一。传统的HTTP协议虽然可以实现实时通信,但是其长轮询等机制效率低下,无法满足高并发、低延迟的需求。为了解决这一问题,诞…

计算机发展史故事【14】

大象踢踏舞 如果要把电脑50 年的历史划分为两个不同的阶段,那么,1981 年无疑是个分界线。就在那一年,IBM 公司推出个人电脑PC 机,使人类社会大步跨进个人电脑新时代。今天,全世界正在使用的PC 机已达到2 亿台&#xf…

视频拼接融合产品的产品与架构设计(三)内存和显存单元数据迁移

上一篇文章 视频拼接融合产品的产品与架构设计(二) 这一篇沉下先来,彻底放弃了界面,界面最终的体现是最后要做的,现在要做的是产品的架构,使用链式架构方式迁移数据。同时增加插件口,方便编程序。 插件架构 为了视频…

短剧奔向小程序,流量生意如何开启?

随着移动互联网的飞速发展,小程序作为一种轻量级、易传播的应用形态,逐渐在各个领域展现出其独特的商业价值。而最近爆火的短剧小视频作为一种受众广泛的娱乐形式,与小程序结合后,不仅为观众提供了更为便捷的观看体验,…

Linux线程(三)死锁与线程同步

目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念,…

Python-VBA函数之旅-type函数

目录 一、type函数的常见应用场景 二、type函数使用注意事项 三、如何用好type函数? 1、type函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、type函…

设计一个游戏的基本博弈框架

设计一个游戏的基本博弈框架,玩家通过操作改变某个数值,这个数值的变动会引发一系列实时变化,并且当这些数值累计到特定阈值时,会导致游戏中出现其他变化,可以分为以下几个步骤: 1. 确定游戏类型和主题 首…

UE4_照亮环境_不同雾效的动态切换

一、问题及思路: 我们在一个地图上,经常切换不同的区域,不同的区域可能需要不同的色调,例如暖色调的野外或者幽暗的山洞,这两种环境上,雾效的选用肯定不一样,夕阳西下的户外用的就是偏暖的色调&…

2023年数维杯国际大学生数学建模挑战赛A题复合直升机的建模与优化控制问题解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 A题 复合直升机的建模与优化控制问题 原题再现: 直升机具有垂直起降等飞行能力,广泛应用于侦察、运输等领域。传统直升机的配置导致旋翼叶片在高速飞行过程中受到冲击波的影响,难以稳定飞行。为了在保…

558、Vue 3 学习笔记 -【常用Composition API(七)】 2024.05.13

目录 一、Composition API的优势1. Options API存在的问题2. Composition API的优势 二、 新的组件1. Fragment2. Teleport3. Suspense 三、其他1. 全局API的转移2. 其他改变 四、参考链接 一、Composition API的优势 1. Options API存在的问题 使用传统OptionsAPI中&#xf…

Rust的协程机制:原理与简单示例

在现代编程中,协程(Coroutine)已经成为实现高效并发的重要工具。Rust,作为一种内存安全的系统编程语言,也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理,并通过一个简单的示例来…

C++|内存管理(1)

目录 C/C内存分布 堆区 栈区 静态存储区 代码区 总结 C语言中动态内存管理方式:malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数(重要点进行讲解)…

R语言手把手教你进行支持向量机分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

4.2 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

方法一:在程序内部设置两个字符串内容,终端返回是否匹配 运行效果: 思路: 1、先比较两个字符串的长度,如果长度不一样,则两组字符串肯定不匹配;如果长度一样,再进行内容的匹配 2、如…

大模型崛起与就业危机

大模型,特别是像我这样的人工智能,最有可能首先替代那些重复性高、标准化程度高、不需要太多人类直觉和情感判断的工作。这些工作通常包括数据输入、初级数据分析和处理、简单的客户服务任务等。例如,可以自动化的一些岗位包括: 1…

zabbix监控mariadb

zabbix 服务端安装请参阅:红帽 9 zabbix 安装流程_红帽安装zabbix-CSDN博客 源码包安装mariadb请参阅:源码包安装mariadb_mariadb 11 源码编译安装-CSDN博客 在MariaDB中,你需要创建一个专门的用户,用于Zabbix进行监控。这个用户…

研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理和基于Github的尝试

一、研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理 1.1 基本漏洞原理(V1) 幽灵漏洞的基本原理是由于glibc库中的gethostbyname()函数在处理域名解析时,调用了__nss_hostname_digits_dots()函数存在缓冲区溢出漏洞。 具体来说,__nss_hostname_digits_dots()使用一个固定…

绝地求生:艾伦格回归活动来了,持续近1个月,新版本皮肤、G币等奖励白嫖

嗨,我是闲游盒~ 29.2版本更新在即,新活动来啦!目前这个活动国内官方还没发,我就去台湾官方搬来了中文版方便大家观看,也分析一下这些奖励应该怎样才能获得。 新版本将在周二进行约9小时的停机维护,请注意安…