https://blog.csdn.net/weixin_47588164/article/details/141361374

    1. 如何避免重排(reflow)和重绘(repaint)
    • 1.1. 避免重排 (Refow)

      • 1.1.1. 减少DOM操作:
      • 1.1.2. 避免使用特定属性:
      • 1.1.3. 使用CSS动画而非JavaScript:
      • 1.1.4. 利用position: fixedposition: absolute:
      • 1.1.5. 使用display: none:
      • 1.1.6. 使用requestAnimationFrame:
    • 1.2. 避免重绘 (Repaint)

      • 1.2.1. 使用will-change属性:
      • 1.2.2. 使用合成层:
      • 1.2.3. 使用离屏Canvas:
      • 1.2.4. 使用display: contents:
      • 1.2.5. 使用CSS变量:
      • 1.2.6. 避免昂贵的样式属性:
    • 1.3. 总结

1. 如何避免重排(reflow)和重绘(repaint)

避免重排(reflow)和重绘(repaint)对于提高网页性能至关重要。

重排是指浏览器重新计算元素的位置和大小的过程,而重绘则是指浏览器重新绘制元素的过程。

频繁的重排和重绘会严重影响用户体验,因为它们会导致页面闪烁并消耗更多的CPU资源。

以下是一些减少重排和重绘的方法:

1.1. 避免重排 (Refow)

1.1.1. 减少DOM操作:
  • 尽量减少对DOM树的更改,特别是那些可能引起大量子元素变化的操作。
  • 使用文档片段(DocumentFragment)来批量添加多个元素,这可以减少对DOM的直接操作次数。
1.1.2. 避免使用特定属性:
  • 避免使用如offsetTopoffsetLeftscrollLeftscrollTopclientWidthclientHeight等会引起重排的属性。
  • 如果需要这些属性的值,先进行计算,然后执行其他操作。
1.1.3. 使用CSS动画而非JavaScript:
  • 使用CSS3动画和过渡效果,而不是JavaScript来改变元素的位置和尺寸,因为CSS动画通常比JavaScript更高效。
1.1.4. 利用position: fixedposition: absolute:
  • 对于不需要参与文档流**中的元素,可以使用绝对定位或固定定位。这样它们的变化不会引起其他元素的重排。
1.1.5. 使用display: none:
  • 要隐藏元素时,使用display: none代替visibility: hidden,因为后者虽然使元素不可见但仍然保留空间,可能会导致其他元素的重排。
1.1.6. 使用requestAnimationFrame:
  • 当需要进行多次DOM操作时,可以将这些操作放在requestAnimationFrame回调函数中,这样浏览器可以在下一帧绘制之前合并所有变更。

1.2. 避免重绘 (Repaint)

1.2.1. 使用will-change属性:
  • 对于经常发生变化的元素,可以使用will-change属性告诉浏览器提前准备好硬件加速,这有助于减少重绘的时间。

css

代码解读

复制代码

.element { will-change: transform; }

1.2.2. 使用合成层:
  • 利用translateZ(0)transform: translate3d(0, 0, 0)backface-visibility: hidden创建合成层,这些属性会将元素从其父级的渲染树中分离出来,从而减少影响其他元素的重绘。
1.2.3. 使用离屏Canvas:
  • 对于复杂的图形操作,可以使用离屏Canvas进行绘制,然后再将结果绘制到屏幕上,这样可以减少重绘的次数。
1.2.4. 使用display: contents:
  • 对于只作为容器但不希望其自身产生边界的元素,可以使用display: contents,这样元素本身不会产生任何视觉输出,从而减少了重绘。
1.2.5. 使用CSS变量:
  • 对于需要动态改变的样式,使用CSS变量可以减少重绘,因为它们是在渲染阶段处理的。
1.2.6. 避免昂贵的样式属性:
  • 尽量避免使用clip-pathfiltermix-blend-mode等昂贵的CSS属性,因为它们会导致重绘。

1.3. 总结

为了最大限度地减少重排和重绘,可以遵循以下策略:

  • 分批更新:将多个DOM操作放在一个函数里,并通过requestAnimationFrame来执行。
  • 使用合成层:对于频繁更新的元素,考虑将其置于合成层中。
  • 优化样式表:尽量避免使用触发重排和重绘的CSS属性。
  • 最小化DOM树的复杂性:简化DOM结构可以减少元素的变化对整个页面的影响。

通过上述方法,你可以显著提高网页的性能和响应速度

前端如何避免重排(reflow)和重绘(repaint)的更多相关文章

  1. 回流(reflow)与重绘(repaint)

    回流(reflow)与重绘(repaint) 很早之前就听说过回流与重绘这两个名词,但是并不理解它们的含义,也没有深究过,今天看了一套网易的题目,涉及到了这两个概念,于是想要把它们俩弄清楚... 一. ...

  2. 什么是回流(重排 reflow)?什么是重绘(repaint)?如何减少回流、重绘?

    什么是回流(重排 reflow)? 回流(重排 reflow):对DOM树进行渲染,只要修改DOM或修改元素的形状大小,就会触发reflow,reflow的时候,浏览器会使已渲染好受到影响的部分失效, ...

  3. 浏览器 - 重绘(repaint)重排(reflow)

    浏览器 - 重绘(repaint)重排(reflow) 网页生成过程: HTML被HTML解析器解析成DOM 树 css则被css解析器解析成CSSOM 树 结合DOM树和CSSOM树,生成一棵渲染树 ...

  4. 页面重绘(repaint)和回流(reflow)

    前言 页面显示到浏览器上的过程: 1.1.生成一个DOM树. 浏览器将获取到的HTML代码解析成1个DOM树,包含了所有标签,包括display:none和动态添加的节点. 1.2.生成样式结构体. ...

  5. 前端性能优化--回流(reflow)和重绘(repaint)

    HTML加载时发生了什么 在页面加载时,浏览器把获取到的HTML代码解析成1个DOM树,DOM树里包含了所有HTML标签,包括display:none隐藏,还有用JS动态添加的元素等. 浏览器把所有样 ...

  6. 页面优化,谈谈重绘(repaint)和回流(reflow)

    一.前言 偶尔在面试过程中遇到过重汇与回流reflow的问题,毕竟页面优化也是考核一个开发者能力的关键之一,上篇文章聊了下documentfragment也是为了减轻回流问题,那么本篇文章好好介绍下重 ...

  7. 【笔记】web 的回流与重绘及优化

    最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint).觉得以后面试或许会被问到所以做一下笔记: 课程从回流及重绘这两个点延伸出了一个知识点就是 ...

  8. 图层 & 重排 & 重绘

    图层 浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点 渲染 DOM 时 浏览器所做的: 获取 DOM 后分割为多个图层 对每个图层的节点计算样式结果 (Rec ...

  9. DOM 操作成本究竟有多高,HTML、CSS构建过程 ,从什么方向出发避免重绘重排)

    前言: 2019年!我准备好了 正文:从我接触前端到现在,一直听到的一句话:操作DOM的成本很高,不要轻易去操作DOM.尤其是React.vue等MV*框架的出现,数据驱动视图的模式越发深入人心,jQ ...

  10. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...

随机推荐

  1. .NET周刊【5月第4期 2025-05-25】

    国内文章 .NET 的全新低延时高吞吐自适应 GC - Satori GC https://www.cnblogs.com/hez2010/p/18889954/the-new-satori-gc-f ...

  2. HarmonyOS运动开发:打造你的专属运动节拍器

    ##鸿蒙核心技术##运动开发##Media Kit(媒体服务)# 前言 在运动过程中,保持稳定的节奏对于提升运动效果至关重要.无论是跑步.骑自行车还是进行高强度间歇训练(HIIT),一个精准的节拍器都 ...

  3. Atlas启动报错:Caused by: org.apache.solr.common.SolrException: Cannot connect to cluster at xxx.com:2181: cluster not found/not ready

    Atlas启动时报以下错误,看情况是atlas没有在zk上找到solr注册信息:然后发现solr启动命令bin/solr start -force会默认使用内置的zk,不会往公共zk上面注册: 解决方 ...

  4. tvbox

    解决看电视的烦恼. TVBOX,是继"猫影视"停更后,最受欢迎的影视app之一. 你可以随心所欲的导入一些影视源来便捷的免费观看全网影视剧. 并可完美适配安卓手机+TV的优势,吸引 ...

  5. jenkins部署github项目

    过程和gitee+jekins配置一样 方式1:使用ssh方式 jekins配置给github的认证信息 采取ssh方式,即需要提前将Jenkins本机的key添加到Gitlab上 先配置好ssh证书 ...

  6. vuePress2.x 多页面 多目录生成方案

    前言 因为官网介绍的都只有一个'一级标题' 只有一个markdown文件 最终编译后也只有一个html文件,类似于spa 单页项目 如何才有多页项目呢 百度查询 网上插件库有很多,大部分不能用, 后来 ...

  7. Atcoders [ARC133B] Dividing Subsequence 题解

    AT_arc133_b [ARC133B] Dividing Subsequence 模拟赛原题,来写篇题解. 只考虑匹配的状态,根据调和级数的数学知识,匹配的状态数不多,为 \(O(n\log n) ...

  8. 重新 开始 && ZCY

    今天去见识了  淘宝的花名 好羡慕 这些 企业  活在了最好的时代  时代的宠儿. 千羽   见识了   高薪的优雅   衣食足而知荣辱   仓廪实而知礼节! 可能我会一辈子漂泊. 可是我想找到  我 ...

  9. jq 插件 的两个相关的函数 jQuery.fn.extend(object); jQuery.extend(object);

    jQuery为开发插件提拱了两个方法,分别是:  http://www.cnblogs.com/wyjgreat/archive/2011/07/19/2110754.html jq.fn 的实现 是 ...

  10. iview开发中遇到的问题汇总

    目录 1.input无法监听enter事件 2.iview重置表单不能用 3.校验表单不能用或者报错 "TypeError: Cannot read property 'validate' ...