重排和重绘

浏览器的渲染过程

1.解析HTML,生成DOM树

2.解析CSS,生成CSS规则树(CSSOM)

3.合并DOM和CSSOM,生成渲染树(Render-Tree)

4.计算渲染树的布局(Layout)

5.将布局渲染到屏幕上(paint)

什么是重排和重绘

重排:当DOM的变化引发了元素几何属性的变化,比如改变元素的宽高,元素的位置,导致浏览器不得不重新计算元素的几何属性,并重新构建渲染树,这个过程称为“重排”。

重绘:当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等属性都确定下来后,浏览器根据他们的特性重新绘制一遍时,就叫重绘

简单来说,涉及元素的几何更新时,叫重排。而只涉及样式更新而不涉及几何更新时,叫重绘。对于两者来说,重排必定引起重绘,但是重绘并不一定引起重排。所以,当涉及重排时,浏览器会将上述的步骤再次执行一遍。

什么操作会引起重排和重绘

显然,触发重排的一般都是几何因素,这是比较好理解的:

  • 页面第一次渲染 在页面发生首次渲染的时候,所有组件都要进行首次布局,这是开销最大的一次重排
  • 浏览器窗口尺寸改变
  • 元素位置和尺寸发生改变的时候
  • 新增和删除可见元素
  • 内容发生改变(文字数量或图片大小等等)
  • 元素字体大小变化
  • 还有其他一些操作也可能引发重排

查询某些属性或调用某些方法

  • offset(Top|Left|Width|Height)
  • scroll(Top|Left|Width|Height)
  • client(Top|Left|Width|Height)
  • getComputedStyle()

我们可能不太理解为什么这些操作也能引起重排,这里我先简单解释一下。因为现在的浏览器已经非常完善了,会自动帮我们做一些优化。当我们用js操作DOM的时候,浏览器并不是立马执行的,而是将操作存储在一个队列中。当达到一定数量或者经过一定时间以后浏览器再统一的去执行队列中的操作。那么回到我们刚才的问题,为什么查询这些属性也会导致重排?因为当你查询这些属性时,浏览器就会强制刷新队列,因为如果不立马执行队列中的操作,有可能得到的结果就是错误的。所以相当于你强制打断了浏览器的优化流程,引发了重排。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#test {width: 100px;height: 100px;background-color: red;position: relative;}</style>
</head>
<body><div id="test"></div><button onclick="reflow()">click</button><script>function reflow() {var div = document.querySelector("#test");console.log(div.offsetLeft);}</script>
</body>
</html>

上述代码,当我们点击按钮后,浏览器立马重新计算CSSOM,但是并没有触发重排

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#test {width: 100px;height: 100px;background-color: red;position: relative;}</style>
</head>
<body><div id="test"></div><button onclick="reflow()">click</button><script>function reflow() {var div = document.querySelector("#test");div.style.left = '200px';console.log(div.offsetLeft);div.style.left = '100px';console.log(div.offsetLeft);div.style.left = '200px';console.log(div.offsetLeft);div.style.left = '100px';console.log(div.offsetLeft);}</script>
</body>
</html>

上述代码触发了4次重排

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#test {width: 100px;height: 100px;background-color: red;position: relative;}</style>
</head>
<body><div id="test"></div><button onclick="reflow()">click</button><script>function reflow() {var div = document.querySelector("#test");div.style.left = '200px';div.style.left = '100px';div.style.left = '200px';div.style.left = '100px';console.log(div.offsetLeft);console.log(div.offsetLeft);console.log(div.offsetLeft);console.log(div.offsetLeft);}</script>
</body>
</html>

上述代码只触发了一次重排

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

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

相关文章

关于sklearn的:还可能是网络的问题???

前提&#xff1a;安装sklearn需要 numpy、scipy等库&#xff08;这个自行搜索&#xff09; 昨天安装numpy、scipy很快&#xff0c;一会就好了&#xff0c;然后安装sklearn一直报错&#xff0c;还以为是版本问题。 今天大早上起来&#xff0c;再次安装&#xff0c;顺利成功&…

Doris安装要求

软硬件需求 1&#xff09;Linux 操作系统要求 2&#xff09;软件需求 3&#xff09;开发测试环境 4&#xff09;生产环境 5&#xff09;注意事项 &#xff08;1&#xff09;FE 的磁盘空间主要用于存储元数据&#xff0c;包括日志和 image。通常从几百 MB 到几个GB 不等。 &a…

minio安装使用-linux

下载地址&#xff1a;MinIO | Code and downloads to create high performance object storage 选择 minio server 可以直接下载二进制文件。 将下载的文件传输到服务器的指定文件夹下&#xff0c;如 /opt/minio。 然后在&#xff0c;命令行启动minio&#xff1a; /opt/mini…

C#入门(8):抽象类介绍

在C#中&#xff0c;抽象类&#xff08;Abstract Class&#xff09;是一种特殊的类&#xff0c;它不能被实例化。相反&#xff0c;它通常作为基类&#xff0c;供其他类继承。抽象类可以包含抽象成员&#xff08;抽象方法、抽象属性、抽象事件或抽象索引器&#xff09;&#xff0…

QT在线安装指南

方案 https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站&#xff0c;致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务&#xff0c;帮助用户更方…

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算 一、GPIO 透传带宽消耗计算二、SPI 通迅带宽消耗计算三、I2C 通迅带宽消耗计算四、UART 通迅带宽消耗计算系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接…

路由的控制与转发原理

场景1&#xff1a;路由器收到数据包后&#xff0c;会根据数据包的目标IP地址&#xff0c;计算出目标网段&#xff0c;再确定终端设备的具体位置。这个过程中&#xff0c;还需要计算出接口&#xff0c;或数据包下一跳的地址。最终会生成一条路由&#xff0c;即路径&#xff0c;存…

C++笔记-八股

目录 inline关键字内联1. 引入inline关键字的原因2. inline仅是对编译器的建议3. inline函数的定义放在头文件中4. inline与#define的区别 inline关键字内联 1. 引入inline关键字的原因 在c/c中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&am…

Speech | openSMILE语音特征提取工具

官方地址&#xff1a;openSMILE 3.0 - audEERING 使用指导&#xff1a;openSMILE — openSMILE Documentation (audeering.github.io) openSMILE 简介 openSMILE是一款以命令行形式运行的工具&#xff0c;通过配置config文件来提取音频特征。主要应用于语音识别、情感计算、音…

黔院长 | 中医上所说的虚实到底是什么?

虚实是中医上经常出现的词语&#xff0c;例如脾虚、肾虚等也都是我们经常听到的症状。各种病症的发生都有虚实的不同&#xff0c;那什么是虚实呢&#xff1f;在《黄帝内经》当中就有相关的叙述&#xff1a; 所谓虚实&#xff0c;是正气与邪气相比较而言的。什么是正什么是邪&am…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及电动汽车需求响应的高速公路服务区光储充鲁棒优化配置》

这个标题涉及到一个关于高速公路服务区的优化配置问题&#xff0c;其中考虑了电动汽车需求响应和光储充的因素。让我们逐步解读这个标题&#xff1a; 高速公路服务区&#xff1a; 涉及到高速公路上的服务区&#xff0c;这是供驾驶员休息、加油、用餐等的地方。 电动汽车需求响…

【工具与中间件】Linux-Docker-Redis

文章目录 0. 前言1. Linux 下 安装 Docker1.1 Docker 基本概念1.2 Linux 安装 Docker1.2.1 安装1.2.2 Hello World 1.3 Docker 常用命令1.3.1 系统启动/暂停/卸载 docker1.3.2 docker 容器的增/删/停/查看状态1.3.3 小结 1.4 Docker 可视化工具推荐 2. Docker 下 安装 Redis2.1…

上海亚商投顾:北证50指数大涨 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡反弹&#xff0c;黄白二线有所分化&#xff0c;题材热点轮动表现。北证50指数大涨超3%&#…

11 redis中分布式锁的实现

单机锁代码 import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.con…

前端国内镜像环境安装网址

git https://registry.npmmirror.com/binary.html?pathgit-for-windows/ 2.42.0 node 中文官方地址: http://nodejs.cn/download/ 阿里云镜像地址为: https://npm.taobao.org/mirrors/node/v14.6.0/

el-table 表格表头、单元格、滚动条样式修改

.2023.11.21今天我学习了如何对el-table表格样式进行修改&#xff0c;如图&#xff1a; 运用的两个样式主要是 1.header-cell-class-name&#xff08;设置表头&#xff09; 2.class-name&#xff08;设置行单元格&#xff09; 代码如下&#xff1a; <el-table :data&quo…

主播产品话术

以电子产品为例 一、产品特点 1.高效性能:这款产品采用了最先进的技术&#xff0c;确保高效运行&#xff0c;让你的工作更加流畅。 2.便捷操作:设计简洁&#xff0c;操作方便&#xff0c;即使是不熟悉电子产品的人也能轻松上手。 3.时尚外观:多种颜色可选&#xff0c;满足你…

springboot+bootstrap+java农业电商服务商城系统_30249

本农业电商服务系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了管理员、会员和商家这三者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能…

Cpolar - 本地 WebUI 账号登录失败解决方案

遇到这个问题是因为估计之前登录过其他账号导致的&#xff0c;那如何解决呢&#xff1f; 原因分析 因为之前历史账号登录过一次&#xff0c;本地配置信息里会残留&#xff0c;所以只要去除即可 解决方案 Windows 系统为例&#xff0c;MacOS 系统同理可得 找到 cpolar 配置文件…

【python学习】基础篇-常用模块-multiprocessing模块:多种进程间通信

multiprocessing模块提供了多种进程间通信方式&#xff0c;以下是一些常用的方法&#xff1a; 1、Queue: 创建一个队列对象&#xff0c;用于在进程之间传递数据。可以设置队列的最大长度和阻塞时间等选项。 from multiprocessing import Process, Queuedef worker(q):q.put(h…