你真的了解重排和重绘吗?

article/2025/4/30 22:27:38

做过前端开发的小伙伴就算不是非常理解重排与重绘,但是肯定都听过这两个词。那为什么这两个东西这么重要?因为他与我们的页面性能息息相关,今天,我们就来好好研究一下这两个东西。

浏览器的渲染流程

在讲解重排和重绘之前,我们有必要说一下浏览器的渲染流程。下面是浏览器渲染过程中最关键的几个部分。如果想了解完整的浏览器渲染流程,推荐大家去阅读李兵老师的浏览器工作原理实践,需要付费阅读。或者参考我的这篇博文:一文让你彻底搞懂浏览器的渲染流程
在这里插入图片描述

  • JavaScript:一般来说,我们会使用 JavaScript 来实现一些视觉变化的效果。比如用 jQuery 的 animate 函数做一个动画、对一个数据集进行排序或者往页面里添加一些 DOM 元素等。当然,除了 JavaScript,还有其他一些常用方法也可以实现视觉变化效果,比如:CSS Animations、Transitions 和 Web Animation API。
  • 样式计算:此过程是根据匹配选择器(例如 .headline 或 .nav > .nav__item)计算出哪些元素应用哪些 CSS 规则的过程。从中知道规则之后,将应用规则并计算每个元素的最终样式。
  • 布局:在知道对一个元素应用哪些规则之后,浏览器即可开始计算它要占据的空间大小及其在屏幕的位置。网页的布局模式意味着一个元素可能影响其他元素,例如 元素的宽度一般会影响其子元素的宽度以及树中各处的节点,因此对于浏览器来说,布局过程是经常发生的。
  • 绘制:绘制是填充像素的过程。它涉及绘出文本、颜色、图像、边框和阴影,基本上包括元素的每个可视部分。绘制一般是在多个表面(通常称为层)上完成的。
  • 合成:由于页面的各部分可能被绘制到多层,由此它们需要按正确顺序绘制到屏幕上,以便正确渲染页面。对于与另一元素重叠的元素来说,这点特别重要,因为一个错误可能使一个元素错误地出现在另一个元素的上层。

其中,重排和重绘影响的就是其中的布局和绘制过程。

什么是重排和重绘制

  • 重排:当DOM的变化引发了元素几何属性的变化,比如改变元素的宽高,元素的位置,导致浏览器不得不重新计算元素的几何属性,并重新构建渲染树,这个过程称为“重排”。
  • 重绘:完成重排后,要将重新构建的渲染树渲染到屏幕上,这个过程就是“重绘”。

简单来说,涉及元素的几何更新时,叫重排。而只涉及样式更新而不涉及几何更新时,叫重绘。对于两者来说,重排必定引起重绘,但是重绘并不一定引起重排。所以,当涉及重排时,浏览器会将上述的步骤再次执行一遍。当只涉及重绘时,浏览器会跳过Layout步骤,即:
在这里插入图片描述
而如果既不需要重排,也不需要重绘,那么就是下面这样:
在这里插入图片描述
浏览器会直接跳到合成阶段。显然,对于页面性能来说,不重排也不重绘 > 重绘 > 重排。

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

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

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

还有其他一些操作也可能引发重排

  • 查询某些属性或调用某些方法
    • 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");div.style.left = '200px';}</script>
</body>
</html>

当我们点击按钮时,将div的left设置为200px,很显然,这个操作会引发浏览器的重排。下面我们用chrome自带的performence工具分析一下左移的过程。
在这里插入图片描述
可以看到这时已经触发了点击事件,此时我们的div.style.left='200px’的代码显然已经生效了,但是浏览器并没有立马更新布局,我们再往后看
在这里插入图片描述
把时间轴往后拉,可以看到这几个过程,先简单介绍一些这些名词代表的含义:

  • Recalculate Style:这个过程就是生成CSSOM的过程
  • Layout:这就是布局阶段,即重排的过程
  • Update Layer Tree:这个阶段是更新层树的过程
  • Paint:该阶段是为每一层准备绘制列表的过程
  • Composite Layers:该阶段是利用绘制列表来生成相应图层的位图了,还涉及到合成线程和光栅化,performence面板中的Raster就是光栅化线程池 。

这里只做一个简单的介绍,对其中内容不太明白的同学可以参考李兵老师的文章或者参考我介绍浏览器渲染流程的博客。

那通过这个图我们可以看到,我们改变了div的left之后就触发了Layout,即重排的过程。下面我们仅改变div的背景颜色,给大家一个对比。
在这里插入图片描述
可以看到,如果仅仅改变背景颜色,是没有Layout这个过程的。同时,chrome还提供了一个工具rendering,我们后面也会用到这个工具,如果最顶部找不到的话可以去more tools中找到。
在这里插入图片描述
当你把第一个选项勾上以后,页面中涉及重新渲染的操作都会被绿色的框框表示出来,可以很方便的看到什么元素被重新渲染了。但是这样辨别不了重排和重绘的区别。

下面我们回到最初的问题,我们获取offsetLeft属性时是如何引发重排的?

<!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>

我们用chrome工具看看渲染的过程
在这里插入图片描述
当我们点击按钮之后,浏览器立马重新计算了CSSOM,和我们之前的分析一致,浏览器需要强制更新队列。但是在后续的过程中,我们也并没有看到Layout过程,这是因为我们实际上并没有改变几何元素,所以本次操作并没有产生重排。(红框上方的 reflow 为我们的函数名)

那么我们再看下面的代码:

<!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);}</script>
</body>
</html>

我们加了一行代码,改变了他的left,我们再来看看会产生什么效果
在这里插入图片描述
点击事件发生后,浏览器立马进行了重排,并没有像以前一样经过一段时间才产生重排。看到这里大家应该明白了,获取 offset 等属性是否会产生重排取决于之前是否有改变几何因素的操作。但是,不论怎样,它还是会重新计算 CSSOM 。那么有的同学可能会问了,所以我使用offsetLeft仅仅是把重排提前了,并没有造成什么实际的影响。对于这种情况而言是这样的,那么我们来看看下面两段代码的区别:

<!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>

这个操作会产生几次重排呢?我们来看一下:
在这里插入图片描述
因为每次获取属性的时候都需要更新队列,所以一共是产生了四次重排,如果我们修改一下代码的顺序:

<!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>

我们再来看看过程
在这里插入图片描述
可以看到,只发生了一次重排,reflow的时间比原先少了将近一半。原因很简单:因为第一个console.log会清空之前的四次操作,但是后面队列中已经没有新的操作加入,自然后面三个就不会引发重排。所以可以看出,在代码中合理的使用offset等属性还是非常有必要的。

同时,在其他博客中,我留意到这几种属性也能引发重排:

  • 激活CSS伪类(例如::hover)
  • 设置style属性

但是经过我的尝试,如果单纯的改变背景颜色等非几何属性,是不会引发重排的。而如果是去改变几何属性,那么我觉得就可以归结到最开始的几种情况中去。所以对于这块内容我持怀疑态度。如果有同学了解的希望在评论区指出。

即不重排也不重绘

说完了重排和重绘,不要忘记我们最开始提到的,最高效的方式就是跳过重排和重绘阶段。你可能会想,什么情况下可以做到这一点?其实这就是我们平时说的GPU加速,具体是如何实现呢?在开发过程中,如果我们使用了某些属性,浏览器会帮助我们将使用了该属性的div提升到一个单独的合成层,而在后面的渲染中,提升到该层的div将跳过重排和重绘的操作,直接到合成阶段。在stack overflow上有问题提到了这块内容。我们翻译一下就是:
下面几个属性能让浏览器帮助我们将div提升到一个单独的合成层:

  • 图层具有3D或透视变换CSS属性
  • 使用加速视频解码的 video 元素
  • 拥有 3D(WebGL) 上下文或者加速 2D 上下文的 canvas 元素
  • 混合插件(Flash)
  • 对自己的 opacity 做 CSS 动画或使用一个动画 webkit 变换的元素
  • 图层使用加速的CSS过滤器
  • 层具有作为合成层的后代
  • 图层具有较低z索引的同级元素,该同级元素具有合成层(换句话说,该层在合成层的顶部渲染)
  • css will-change属性

最后一点是我加上去的,同时根据文中的内容我们可以知道,css3硬件加速是浏览器的行为,所以在不同浏览器下可能会有不同的表现形式。下面我们用一个例子来理解一下。这是李兵老师在他的专栏中提出的一个例子,我拿过来借用一下,注意box中的will-change属性:

<html><head><title>观察will-change</title><style>.box {will-change: transform, opacity;display: block;float: left;width: 40px;height: 40px;margin: 15px;padding: 10px;border: 1px solid rgb(136, 136, 136);background: rgb(187, 177, 37);border-radius: 30px;transition: border-radius 1s ease-out;}body {font-family: Arial;}</style></head><body><div id="controls"><button id="start">start</button><button id="stop">stop</button></div><div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div><div class="box">旋转盒子</div></div><script>let boxes = document.querySelectorAll('.box');let boxes1 = document.querySelectorAll('.box1');let start = document.getElementById('start');let stop = document.getElementById('stop');let stop_flag = falsestart.addEventListener('click', function () {stop_flag = falserequestAnimationFrame(render);})stop.addEventListener('click', function () {stop_flag = true})let rotate_ = 0let opacity_ = 0function render() {if (stop_flag)return 0rotate_ = rotate_ + 6if (opacity_ > 1)opacity_ = 0opacity_ = opacity_ + 0.01let command = 'rotate(' + rotate_ + 'deg)';for (let index = 0; index < boxes.length; index++) {boxes[index].style.transform = commandboxes[index].style.opacity = opacity_}requestAnimationFrame(render);}</script></body></html>

chrome工具为我们提供了查看是否提升了层的方法
在这里插入图片描述
选中layers在选中第二个图标,就可以用鼠标查看3d视图,我们可以看到每个div都被提升到了单独的层。如果我们把will-change去掉再来查看会是下面这样:
在这里插入图片描述
可以看到他们变成全部都在同一层了。那么加不加这个属性到底有没有实际的意义呢?我们下面实际检测一下。首先再介绍一下上文提到过的rendering工具
在这里插入图片描述

  • paint flashing会将渲染的div用绿框标出来
  • layer borders会将在合成层中渲染的div,即提升到单独层的div用黄框标出来
  • FSP meter会标记出当前页面的帧率

首先我们不加will-change来实现动画,可以看到如下效果
在这里插入图片描述
我们的每个div都在不断的重新渲染,同时fps是在30左右,大家自己去尝试就会发现已经能够感到明显的卡顿。我们再加上will-change尝试一下:
在这里插入图片描述
我们可以看到黄框取代了绿框,证明这些小球已经没有重新渲染了,而是被提升到了单独的层,同时fps稳定在60,能够直接感受到比原先顺畅了许多。

通过这个简单的例子,我们就能直观的感受到跳过重排和重绘带来的好处。我们也日常开发中也可以使用

<style>.demo {transform: translateZ(0);}
</style>

来欺骗浏览器,让其帮助我们将div提升到一个单独的层。不过要注意,该方法虽好,但是也会加大内存的消耗,如果将太多没有必要的层单独提升了反而会造成页面的卡顿,具体可以参考一下这篇文章。

而关于这块更详细的介绍可以参考淘系前端团队分享的文章 无线性能优化:Composite。

写在最后

好了,这就是今天的全部内容,看到的小可爱可以帮忙点个赞和关注,让我有继续写下去的动力~同时文中有什么错误的地方也欢迎大家在评论区指出,共同探讨。


http://chatgpt.dhexx.cn/article/JJmUvVq9.shtml

相关文章

简单易懂之什么是重排和重绘?

文章目录 目录 一、浏览器页面是怎么生成的&#xff1f; 二、什么是重排和重绘&#xff1f; 1.什么时候发生重绘&#xff1f; 2.如何优化重排效率&#xff1f; 一、浏览器页面是怎么生成的&#xff1f; 首先让我们来先了解一下浏览器页面生成的过程 文字解析&#xff1a; 1&am…

重排(回流)和重绘

什么是重排和重绘 浏览器下载完页面所有的资源后&#xff0c;就要开始构建DOM树&#xff0c;与此同时还会构建渲染树(Render Tree)。&#xff08;其实在构建渲染树之前&#xff0c;和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树&#xff09; 浏览器下载完成所有…

什么是重排和重绘

简答 1.重排&#xff08;重新排列&#xff09;> 指元素的位置发生改变的时候浏览器会进行重排 2.重绘&#xff08;重新绘制&#xff09;>指元素的基本样式发生改变是发生重绘&#xff0c;比如颜色等。。。 细答 前提概要&#xff08;浏览器使用两个引擎进行工作一是渲…

Docker之发布自己的镜像

首先应当是先登入 其次是将镜像重新打包 在此处使用命令 docker commit fb6af4e48c14 zlx/centos7_vim:1.0 将一个容器生成一个新的镜像 然后把这个镜像改成dockerhub的仓库名&#xff0c;push一下就行了&#xff0c;dockerhub毕竟是国外的网站&#xff0c;换成阿里云就好了

Matlab调用excel数据绘制折线图

如题&#xff0c;matlab之前没接触过&#xff0c;但是电脑上一直有安装&#xff0c;有些老师需要做几张图放论文里&#xff0c;所以尝试了一下&#xff08;excel其实效果也行&#xff0c;但matlab感觉更专业&#xff09; x2:2:778;%x轴上的数据&#xff0c;第一个值代表数据开…

COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落

★★☆ 输入文件&#xff1a;ThefallingofZLX.in 输出文件&#xff1a;ThefallingofZLX.out 简单对比时间限制&#xff1a;1 s 内存限制&#xff1a;256 MB 【题目描述】 正当革命如火如荼&#xff0c;情侣教会日薄西山之时&#xff0c;SOX和FFF的分歧却越来越大&#…

Codechef GRAPHCNT 支配树学习及tarjan算法求解

[Codechef GRAPHCNT]新年的有向图 【题目描述】 zlx同学在学习数论时,被虐了一脸,丧心病狂的他决定去报复社会。 zlx在公园里埋下N颗地雷,用来炸飞在春节期间秀恩爱的情侣。这N颗地雷由M条有向边连接成为一个有向图,zlx则在1号地雷处引爆1号地雷可以到达的地雷。现在,为了…

大数据体系建设经验分享

分享嘉宾&#xff1a;吴荣彬 分贝通 大数据部负责人 编辑整理&#xff1a;zlx 出品平台&#xff1a;DataFunTalk 导读&#xff1a;本文将介绍分贝通在大数据领域的一些建设经验。分贝通在ToB领域是一个年轻的公司&#xff0c;成立六年多&#xff0c;大数据体系刚刚建立一年多&a…

将二维数组转为稀疏数组进行压缩,提高效率

** 稀疏数组 ** ##基本介绍&#xff1a; 当一个数组中大部分元素为&#xff10;&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1) 记录数组一共有几行几列&#xff0c;有多少个不同的值 2) 把具有不同值的元素的行列…

A数字三角 怨种

问题描述 有一天&#xff0c;无聊的 zlx 从 1 开始数数&#xff0c;同时在纸上写下每个数的个位数字。因为她非常热爱直角三角形&#xff0c;所以在纸上写下的数字按照直角三角形排列。现在告 诉你写她了 N 行数字&#xff0c;要求你打出这些数字。 输入格式 一行一个数 N&a…

聊聊Spring的IOC,AOP、DI、MVC

1 聊聊Ioc,Di,Mvc,Aop 不想看下面内容的&#xff0c;直接上代码连接&#xff0c;以下代码都有注释 传送门 1.1 看启动项 我们先来看看启动项 package com.tian;import com.tian.springframework.annotation.SpringBootApplication; import com.tian.springframework.config…

ZYNQ DDS产生载波FFT变换

环境&#xff1a;vivado2017.4&#xff0c;快速傅里叶变换V9.0 IP核 一&#xff0c;介绍&#xff1a;Xilinx FFT IP核是一种计算DFT的有效方式。 特点&#xff1a;前向变换&#xff08;FFT&#xff09;和反向变换&#xff08;IFFT&#xff09;在复数空间&#xff0c;并且可…

并发队列中迭代器弱一致性原理探究

一、前言 并发队列里面的Iterators是弱一致性的&#xff0c;next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后&#xff0c;其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常&#xff0c;能够保持创建迭代器后的元…

浅谈同构类问题的骗分算法

ZLX算法-----同构类问题的有力骗分算法前言&#xff1a;ZLX算法是一种解决判定性同构问题的蒙特卡罗式骗分算法&#xff1a;总能在确定的运行时间内出解&#xff0c;但是得到的解不能保证正确。尽管由于具有拓扑序&#xff0c;树同构和仙人掌同构存在多项式算法&#xff0c;但是…

win10下修改C盘用户文件夹名

之前安装一个程序出错&#xff0c;上网百度后是用户文件夹名为中文&#xff0c;也在网上找了好多方法&#xff0c;有同步的&#xff0c;有修改注册表的&#xff0c;最后我找到一个比较简单而且数据保留完整的方法。这种方法也会自动修改用户的环境变量&#xff0c;不过修改完后…

【Windows】Win10-更改c盘下的用户文件夹名

转载ooooohugh的文章&#xff0c;原文地址&#xff1a;https://blog.csdn.net/qq_33530388/article/details/71739845 当初 不小心用自己名字 作为计算机用户名&#xff0c;后来 许多软件因为 不支持 路径中有中文&#xff0c;导致吃了不少的亏&#xff0c;心疼。。。。 下面说…

Windows10更改c盘中用户名对应的文件名字

目录 前言一、修改步骤1.开启管理员账号并登陆2.重启电脑3.登录管理员账号4.重命名用户名对应的文件夹5.修改Path6.重启电脑并切换回你的账号7.修改环境变量8.重启电脑 二、修改导致的问题1.桌面大部分软件快捷方式失效2.部分软件无故消失 三、提醒Last 前言 强烈建议看完此文…

win10 修改c盘用户文件夹名称

c盘用户文件夹如果是中文名 可能会导致需要没必要的麻烦&#xff0c;记录一下修改方法 第一步&#xff1a;如果你电脑不是本地用户administrator&#xff0c;注销当前用户使用administrator登录 按winx 点击关机或注销 在点击注销 注销后如果没有Administrator登录方式&#…

有关windows10修改C盘用户中文名文件夹相关问题的具体解决方案

win10修改用户文件夹名 今天在下载安卓sdk开发工具的时候&#xff0c;安装出现了一个问题如图&#xff0c;左下角提示我们的sdk路径含有非ascll的字符&#xff0c;无法继续安装&#xff0c;其实不只是中文字符&#xff0c;英文字符中间若有空格也不能继续安装。 对于互联网学…

更改计算机用户文件夹,win10系统怎么自定义C盘用户文件夹名称

许多用户在安装win10系统之后&#xff0c;想要让电脑显得更加个性化&#xff0c;就想要给C盘中的用户文件夹名称进行自定义修改&#xff0c;那么win10系统怎么自定义C盘用户文件夹名称呢&#xff1f;接下来给大家分享一下具体的操作步骤。 1、在键盘上按下Windows键X 组合键&am…