重绘与重排(回流)

前言

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

概念

重绘(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.mzph.cn/news/102828.shtml

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

相关文章

安全设备和防火墙

文章目录 微步TDP态势感知防火墙防火墙的负载均衡 微步TDP态势感知 安全设备的主要功能在黑名单,只要记住黑名单的功能在哪即可 常用的是威胁选项卡的监控功能,监控模块会把实时的告警列出来,只要列出来就能分析流量是误报还是真实的&#x…

【GO】基础速成

简单介绍一下go好处 编译语言,可以提前报错同时又有python的一些优点,自带多线程 开始学习 学习网站:学习网站 值 包含:字符串、整型、浮点型、布尔型等等 字符串可以 进行拼接。 需要注意的是布尔型在go里面不自动转化为in…

tomcat服务tomcat多实例部署

tomcat服务&&tomcat多实例部署 文章目录 tomcat服务&&tomcat多实例部署1.简介2.优缺点优点:缺点: 3.工作原理4.工作流程5.tomcat服务部署5.1.java环境安装5.2.拉取tomcat软件包5.3.解压部署5.4.启动tomcat服务5.5.访问tomcat的web页面5.…

Kafka数据同步原理详解

Kafka数据同步原理详解 Kafka是一种分布式的消息队列系统,它具有高吞吐量、可扩展性和分布式特性等优势。在Kafka中,数据按照主题进行分区,每个主题都有一组分区。每个分区都有自己的生产者和消费者,生产者负责向分区中写入消息&…

基于VUE的图书借阅管理系统的设计与实现

目录 一、摘要 二、技术描述 三、部分截图 四、获取方式 一、摘要 随着我国经济的高速发展,人们对图书的需求也愈发旺盛,而传统图书管理模式存在以下弊端:信息存储和分类操作不够高效,导致查找书籍困难;借还书流程…

【数据结构-栈 二】【单调栈】每日温度、接雨水

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【单调栈的应用】,使用【栈】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&am…

恢复grub在硬盘对多系统的引导

grub2引导被覆盖怎么办 问题的提出问题的解决1 进入try ubuntu系统2 执行如下命令 验证 问题的提出 windows和ubuntu双系统引导出错,硬盘的grub引导被windows的引导覆盖,导致只能进入windows系统,不能引导ubuntu系统。 问题的解决 1 进入t…

location rewrite

Nginx location 匹配的规则和优先级 Nginx常用的变量 rewrite: 重定向功能 Location 匹配 URI URI:统一资源的表示符,是一种字符串标识,用于标识抽象或者物理资源 先来巩固一些与location结合使用的正则表达式 正则表达式:匹…

基于安卓android微信小程序音乐播放器

运行环境 小程序前端框架:uniapp 小程序运行软件:微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 项目介绍 音乐播放器小程序的设计主要是对系统所要实现的功能进行详细考虑,确定所要…

【机器学习 | 回归问题】超越直线:释放多项式回归的潜力 —— 详解线性回归与非线性 (含详细案例、源码)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

封装 Token

什么是token? 作为计算机术语,是“令牌”的意思 。 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请…

docker使用nginx

使用docker run命令运行Nginx应用 使用命令可以直接启动 [rootlocalhost ~]# docker run -d nginx:latest Unable to find image nginx:latest locally latest: Pulling from library/nginx a2abf6c4d29d: Pull complete 下载完成 a9edb18cadd1: Pull complete 589b7251471a:…

Java Day1

day01 一、Markdown 基础语法1.标题2. 字体3. 引用 >4. 分隔线 --- ***5. 图片 ![]()6.超链接7.列表8.表格9.代码 代码名称 二、计算机三、常用快捷键1. Win 系列2. Ctrl 系列3. ALt 系列 四、 基本的DOS命令1. 打开方式:2. 常用DOS命令 五、计算机语言发展史第一…

【软件测试学习】—软件测试知识点总结(二)

【软件测试学习】—软件测试的分类(二) 一、软件测试的分类 二、软件的生命周期 三、软件测试的工作流程 四、软件测试用例设计方法 (一)、等价类划分 定义:等价类划分是一种典型的、重要的黑盒测试的方法&#xff…

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项:① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri 额外收获: 一、路径注意事项: ① 用相对路径的时候别忘了前面的斜杠 并不是什么大问题,只是…

2.Javaweb模块基本

1.1web基本 session 和 cookie 有什么区别? 存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。 安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。 容量和个数限制:…

机器学习之旅-从Python 开始

你想知道如何开始机器学习吗?在这篇文章中,我将简要概括一下使用 Python 来开始机器学习的一些步骤。Python 是一门流行的开源程序设计语言,也是在人工智能及其它相关科学领域中最常用的语言之一。机器学习简称 ML,是人工智能的一…

LCD12864驱动开发

目录 一、概述 二、方框图 三、模块接口说明 1、串口接口管脚信号 2、并行接口 四、模块主要硬件构成说明 1、RS,R/W配4种模式: 2、E信号 五、指令说明 六、读写时序图 6.1 数据传输过程 6.2、时序图 6.3、串口读写时序 七、交流参数 八、软件…