首页 > 其他分享 >第 22 题:介绍下重绘和回流(Repaint & Reflow),以及如何进行优化

第 22 题:介绍下重绘和回流(Repaint & Reflow),以及如何进行优化

时间:2022-09-07 16:44:54浏览次数:97  
标签:Repaint 浏览器 Reflow 22 DOM 标签 节点 回流 重绘

1. 浏览器渲染机制

  • 浏览器采用流式布局模型(Flow Based Layout
  • 浏览器会把HTML解析成DOM,把CSS解析成CSSOMDOMCSSOM合并就产生了渲染树(Render Tree)。
  • 有了RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。
  • 由于浏览器使用流式布局,对Render Tree的计算通常只需要遍历一次就可以完成,但table及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间,这也是为什么要避免使用table布局的原因之一。

2. 重绘

由于节点的几何属性发生改变或者由于样式发生改变而不会影响布局的,称为重绘,例如outlinevisibilitycolorbackground-color等,重绘的代价是高昂的,因为浏览器必须验证DOM树上其他节点元素的可见性。

3. 回流

回流是布局或者几何属性需要改变就称为回流。回流是影响浏览器性能的关键因素,因为其变化涉及到部分页面(或是整个页面)的布局更新。一个元素的回流可能会导致了其所有子元素以及DOM中紧随其后的节点、祖先节点元素的随后的回流。

<body>
<div class="error">
    <h4>我的组件</h4>
    <p><strong>错误:</strong>错误的描述…</p>
    <h5>错误纠正</h5>
    <ol>
        <li>第一步</li>
        <li>第二步</li>
    </ol>
</div>
</body>

在上面的HTML片段中,对该段落(<p>标签)回流将会引发强烈的回流,因为它是一个子节点。这也导致了祖先的回流(div.errorbody – 视浏览器而定)。此外,<h5><ol>也会有简单的回流,因为其在DOM中在回流元素之后。大部分的回流将导致页面的重新渲染。

回流必定会发生重绘,重绘不一定会引发回流。

4. 浏览器优化

现代浏览器大多都是通过队列机制来批量更新布局,浏览器会把修改操作放在队列中,至少一个浏览器刷新(即16.6ms)才会清空队列,但当你获取布局信息的时候,队列中可能有会影响这些属性或方法返回值的操作,即使没有,浏览器也会强制清空队列,触发回流与重绘来确保返回正确的值。

主要包括以下属性或方法:

  • offsetTopoffsetLeftoffsetWidthoffsetHeight
  • scrollTopscrollLeftscrollWidthscrollHeight
  • clientTopclientLeftclientWidthclientHeight
  • widthheight
  • getComputedStyle()
  • getBoundingClientRect()

所以,我们应该避免频繁的使用上述的属性,他们都会强制渲染刷新队列。

5. 减少重绘与回流

  1. CSS

    • 使用 transform 替代 top

    • 使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局

    • 避免使用table布局,可能很小的一个小改动会造成整个 table 的重新布局。

    • 尽可能在DOM树的最末端改变class,回流是不可避免的,但可以减少其影响。尽可能在DOM树的最末端改变class,可以限制了回流的范围,使其影响尽可能少的节点。

    • 避免设置多层内联样式,CSS 选择符从右往左匹配查找,避免节点层级过多。

<div>
  <a> <span></span> </a>
</div>
<style>
  span {
    color: red;
  }
  div > a > span {
    color: red;
  }
</style>
    • 对于第一种设置样式的方式来说,浏览器只需要找到页面中所有的 span 标签然后设置颜色,但是对于第二种设置样式的方式来说,浏览器首先需要找到所有的 span 标签,然后找到 span 标签上的 a 标签,最后再去找到 div 标签,然后给符合这种条件的 span 标签设置颜色,这样的递归过程就很复杂。所以我们应该尽可能的避免写过于具体的 CSS 选择器,然后对于 HTML 来说也尽量少的添加无意义标签,保证层级扁平。

    • 将动画效果应用到position属性为absolutefixed的元素上,避免影响其他元素的布局,这样只是一个重绘,而不是回流,同时,控制动画速度可以选择 requestAnimationFrame,详见探讨 requestAnimationFrame

    • 避免使用CSS表达式,可能会引发回流。

    • 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点,例如will-changevideoiframe等标签,浏览器会自动将该节点变为图层。

    • CSS3 硬件加速(GPU加速),使用css3硬件加速,可以让transformopacityfilters这些动画不会引起回流重绘 。但是对于动画的其它属性,比如background-color这些,还是会引起回流重绘的,不过它还是可以提升这些动画的性能。

  1. JavaScript

    • 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
    • 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
    • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
    • 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。

 

 

 

 

 

 

 

 

 

 

标签:Repaint,浏览器,Reflow,22,DOM,标签,节点,回流,重绘
From: https://www.cnblogs.com/zhanghaian/p/16666345.html

相关文章

  • 22-9-7 网络的各种配置
    子网掩码:这篇文章将子网掩码解释的比较清楚:https://zhuanlan.zhihu.com/p/65226634子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~255范围内任意变化,因此......
  • "蔚来杯"2022牛客暑期多校训练营5
    ADon'tStarve巧妙在于拓扑排序为啥要开滚动数组因为对于长度相同的边我们只能选择一条而这些边属于同一个状态的为了防止更新的时候对同状态的点造成影响#inclu......
  • Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    这场打的稀烂。。。A.MainakandArray题意:将数组中某段子序列翻转一次,求a[n]-a[1]最大的值。思路:有三种情况:第一种,将最小的数翻转到第一位,然后用原来的a[n]减去反......
  • 2022 年 360反馈的好处(所有企业规模)
    目录1 360反馈有什么好处?2 大型组织的360反馈的好处3 360反馈对小型企业的好处4 远程团队360反馈的好处5 360反馈的主要优势 360反馈有什么好处?......
  • 前端JS-Day22
    箭头函数不创建this对象!图片无缝衔接:保证轮播图到最后直接跳转到第一位。 进行轮播图自动播放的时候,可以采取手动调用点击事件的方式操作。window.addEventListene......
  • 【2022.09.07】使用docker搭建一个mastodon
    前提准备一个公网ip的服务器(得要有80端口的转发,因此homelab很难实现)我这里使用的是腾讯云的1核2G的学生机域名,及其SSL证书宝塔安装因为嫌麻烦,所以采用了宝塔的方案,顺......
  • 2022知识图谱发展报告[附下载]
      2022年《知识图谱发展报告》是中国中文信息学会语言与知识计算专委会发布的报告,算是国内最权威的关于知识图谱领域的最全和最新进展了。包括知识表示与建模、知识表示......
  • C语言的选择结构,多条件if语句(哈理工软件22-2杨宗杰)
     C语言代码:选择结构,多条件if语句 一、代码       二、代码说明          三、结果展示   ......
  • "蔚来杯"2022牛客暑期多校训练营7
    A.FloorTilesinaPark给定\(W\timesH\)的矩阵,问将其分为\(k(k\leqslant5)\)个子矩阵的方案数。两个方案不同,当且仅当其切割方式不同手玩,画出所有\(k\leqslant5\)......
  • Taxi (曼儿哈顿->切比雪夫+二分) (2022杭电3)
    题意:多组样例,对于每组样例,先给出一个n和m,n代表点的个数,m代表询问的个数,接下来n行,每行3个数(xi,yi,wi),分别代表第i个点的坐标和权值,对于每组询问,首先给出一个坐标,让我们求......